![](/img/trans.png)
[英]Correct way to add custom exception to Lexer/Parser files in antlr4
[英]Resolving Lexer and Parser ambiguities in ANTLR4
在ANTLR4中,我有一个词法分析器规则,该规则说我可以使用任何字符(空格和换行符)获取任何单词。 定义如下:
WORD : ~[ \t\r\n:,]+;
我还具有进入EVAL模式的词法分析器规则(比WORD之前定义):
OPENEVAL : '${' -> pushMode(EVAL);
mode EVAL;
CLOSEEVAL : '}' -> popMode;
... (more lexer definitions for EVAL mode) ...
在解析器文件中,我试图检测语法规则或单词。 因此,我执行以下操作:
eval : evaluation
| WORD;
evaluation : OPENEVAL somestuff CLOSEEVAL;
somestuff使用在EVAL模式下定义的词法分析器规则。 问题是,在评估评估规则时,它将文本识别为WORD令牌,而不是评估语法规则。 我的意思是,如果我输入一些文本,例如:
${stuff to be evaluated}
它应该转到评估规则,但是,它将其标识为WORD(仅使用“ $ {stuff”部分)
我知道评估和WORD之间存在歧义,但我认为ANTLR将采用解析器规则的第一个巧合(在本例中为评估 )。
抱歉,如果这太令人困惑,我尝试将其尽可能地加以总结(我不想放入完整的解析器和词法分析器内容,从而基本上避免了文本墙)。
我考虑过的另一种选择是将“ WORD”定义为除$ {和}包围的文本以外的任何内容。 但是我不知道如何创建这样的词法分析器规则。
我该如何解决? 区分评估和WORD?
您需要包含一个谓词,以防止$
后面跟着{
时在WORD
包含$
。
WORD
: ( ~[ \t\r\n:,$]
| '$' {_input.LA(1) != '{'}?
)+
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.