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