c# - 如何为单独的 ANTLR 词法分析器和解析器添加虚构标记?

标签 c# antlr antlr3 lexer

我正在使用 ANTLR 并基于分离的 Java6 词法分析器和语法构建 AST。词法分析器定义包含在 Java6Lex.g 中,并生成语法使用的标记。解析器使用这些没有问题,但当我生成 AST 时,我想引入虚构的标记 - 然而,ANTLR 似乎不喜欢该模型。

解析器语法包括来自词法分析器的标记词汇表 - 它应该为语法可用的标记建立基线。

parser grammar Java6Parse;

options {
    tokenVocab=Java6Lex;
    backtrack=true;
    memoize=true;
    output=AST;
    language = CSharp3;
}

现在假设我想使用 fieldDeclaration 并使用重写规则将其转换为根节点。我假设(显然是错误的)我可以将虚构的标记直接引入解析器语法中,如下所示:

fieldDeclaration
    :   modifiers type variableDeclarator (COMMA variableDeclarator)* SEMI
            -> ^(FIELD modifiers type variableDeclarator+)
    ;

但是,这只会导致发生以下错误:

reference to undefined token in rewrite rule: FIELD

没问题,我明白了,我没有定义它。因此,我尝试在解析器语法的标记部分中定义它。再次错误地认为 tokenVocab 应该提供基线。

tokens { FIELD; }

不,似乎即使定义 token block 也会导致 EarlyExitException 和错误,表明 Java6Parse.g 没有规则。我想,解析器语法根本不喜欢在解析器中定义标记。所以,我在词法分析器中定义了它。再次失败。然后我在词法分析器和解析器中定义了每个标记 - 再次失败。

所以,这就是我需要知道的。当词法分析器和解析器分离时,有没有办法定义一个虚构的标记,如果是的话,如何定义。如果不是,是将语法和词法分析器合并回同一个文件的唯一选择吗?

最佳答案

您很可能将 tokens{} block 包含在错误的位置。 ANTLR 3 要求语法头元素以特定顺序出现。请参阅此 Stack Overflow 答案以了解正确的顺序:

Using @header in ANTLR

关于c# - 如何为单独的 ANTLR 词法分析器和解析器添加虚构标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15615209/

相关文章:

c# - 从不同的类绘制到 Windows 窗体中的图片框

java - 递归遍历树的深度优先问题

parsing - 帮助解析日志文件 (ANTLR3)

parsing - ANTLR语法: parser- and lexer literals

C# 预处理器指令

c# - Oracle.DataAccess 错误

c - 在 C 目标中用 antlr3 解析一些特定的语句

java - ANTLRv4 TestRig 无法找到我的 Lexer 类

java - 具有 Java 互操作性的 ANTLR DSL

c# - 实现接口(interface)的抽象基类