在ANTLR4中,我有一个词法分析规则,它说我可以使用任何字符获得任何单词,但空格和换行符除外。它的定义如下:
WORD : ~[ trn:,]+;
我还有一个词法分析器规则(在 WORD 之前定义)用于进入 EVAL 模式:
OPENEVAL : '${' -> pushMode(EVAL);
mode EVAL;
CLOSEEVAL : '}' -> popMode;
... (more lexer definitions for EVAL mode) ...
在解析器文件中,我正在尝试检测语法规则或单词。所以我做了以下几点:
eval : evaluation
| WORD;
evaluation : OPENEVAL somestuff CLOSEEVAL;
有些东西使用在 EVAL 模式下定义的词法分析器规则。问题是,在评估评估规则时,它将文本标识为 WORD 标记,而不是评估语法规则。我的意思是,如果我输入一些文本,例如:
${stuff to be evaluated}
它应该转到评估规则,但相反,它将其标识为 WORD(仅采用"${stuff"部分)
我知道评估和WORD之间存在歧义,但我认为ANTLR将采用解析器规则(在这种情况下为评估)的第一个巧合。
抱歉,如果这太混乱了,我试图尽可能好地总结这一点(我不想放置完整的解析器和词法分析器内容,以基本上避免文本墙)。
我考虑的另一个选择是将"WORD"定义为由 ${ 和 } 包围的文本以外的任何内容。但是我不知道如何创建这样的词法分析器规则。
我该如何解决这个问题?区分评估和WORD?
您需要包含一个谓词,以防止在WORD
后跟{
时将$
包含在 中。
WORD
: ( ~[ trn:,$]
| '$' {_input.LA(1) != '{'}?
)+
;