在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规则。
我该怎么解决?要区分评价和词?
您需要包含一个谓词,以防止在字
后面跟{
时在该字中包含$
。
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生成我的词法分析器和解析器文件。我没有生成侦听器类。