【问题标题】:ANTLR v3 C# namespacesANTLR v3 C# 命名空间
【发布时间】:2008-11-25 04:07:27
【问题描述】:

希望这是一个非常快的 ;) 我在 ANTLR3 中编写了一个词法分析器/解析器规范,并以 CSharp2 目标为目标。生成的代码可以正常工作,但我无法让 ANTLR 将 C# 输出放入命名空间。

语法文件的相关部分如下:

grammar MyGrammar;

options
{
    language = CSharp2;
    output = AST;
    ASTLabelType = CommonTree;
}

为了生成正确的命名空间,我试过了:

@namespace { MyNamespace }

@lexer::namespace { MyNamespace }
@parser::namespace { MyNamespace }

但是这两个都会产生错误,声称文件没有规则。

感谢任何帮助。

【问题讨论】:

    标签: namespaces antlr


    【解决方案1】:

    我将它用于组合的词法分析器和解析器(它会正确生成命名空间):

    grammar Test;
    
    options
    {
        language=CSharp2;
    }
    
    @lexer::namespace {
        My.Name.Space
    }
    
    @parser::namespace {
        My.Name.Space
    }
    
    
    DIGIT   :   '0'..'9';
    
    simple  :    DIGIT EOF;
    

    所以我想知道为什么你的版本不起作用 - 也许你想试试这个简单的例子,看看它是否适合你。

    【讨论】:

      【解决方案2】:

      似乎@namespace 指令需要放在 tokens{} 块之后。现在一切都好...

      【讨论】:

      • 是的,我很难理解这一点。几乎把我所有的头发都拉了出来。
      【解决方案3】:

      使用language = 'CSharp3';(以及 CSharp2),您可以:

      @lexer::namespace {
          My.Name.Space
      }
      
      @parser::namespace {
          My.Name.Space
      }
      

      生成:

      } // namespace 
       My.Name.Space <-- compile error here
      

      在词法分析器和解析器代码的末尾。如果我写:

      @lexer::namespace {My.Name.Space}
      
      @parser::namespace {My.Name.Space}
      

      它工作正常并生成:

      } // namespace My.Name.Space <-- within the line comment, no error of course
      

      【讨论】:

        猜你喜欢
        • 2010-12-23
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-24
        • 2014-09-23
        • 2018-02-22
        相关资源
        最近更新 更多