当前位置: 首页 > 知识库问答 >
问题:

解决ANTLR4中的Lexer和解析器歧义

仲孙兴平
2023-03-14

在ANTLR4中,我有一个lexer规则,说我可以使用任何字符得到任何单词,但空格和换行符除外。其定义如下:

WORD : ~[ \t\r\n:,]+;

我还有一个lexer规则(定义在than WORD之前),用于进入EVAL模式

OPENEVAL : '${' -> pushMode(EVAL);

mode EVAL;
CLOSEEVAL : '}' -> popMode;
... (more lexer definitions for EVAL mode) ...
eval : evaluation
     | WORD;

evaluation : OPENEVAL somestuff CLOSEEVAL;
${stuff to be evaluated}

我考虑的另一个选择是将“word”定义为${and}包围的文本以外的任何东西。但我不知道如何创建这样的lexer规则。

我该怎么解决?要区分评价和词?

共有1个答案

冀弘厚
2023-03-14

您需要包含一个谓词,以防止在后面跟{时在该字中包含$

WORD
  : ( ~[ \t\r\n:,$]
    | '$' {_input.LA(1) != '{'}?
    )+
  ;
 类似资料:
  • 使用上面的测试数据运行ANTLR4测试平台,输出为 我可以看到第一个标记是ID的<4>,值为'rrv0' 我已经尝试重新安排lexer项目顺序。我还尝试通过在语法规则中显式匹配来使用隐式lexer项(而不是通过显式lexer项)。我也试着做火柴。那些对我来说并不成功。

  • 可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?

  • 我最近不得不使用解析器来做一个项目。我下载了,并按照《最终ANTLR4Reference》一书中描述的步骤进行操作。以下是我在命令行中键入的步骤: 所有事情都很好,它生成我需要的java文件。但是,在我输入之后 它报告说 无法将Hello作为lexer或分析器加载。 我谷歌了一些信息,但仍然不知道发生了什么。

  • 我有Antlr4中的语法,用来解析和验证定制语言。在其他方面,我的语法应该认为以下是“有效的” //将字符串值赋给变量 //带有字符串参数的函数 //带有特定格式(日期)的函数 下面是我语法中的相关部分

  • 我正在通过自定义语法处理输入文件,提取标记,并在中返回它们。在ANTLR 3中,我能够通过调用解析器上的方法来解析文件,并获得类似于。 这在ANTLR 4中似乎不起作用。我参考了这本书,似乎我必须调用开始解析,但我在解析器中没有看到任何方法。 我使用ANTLRWorks 2生成我的词法分析器和解析器文件。我没有生成侦听器类。