解决 ANTLR4 中的词法分析和解析器歧义



在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) != '{'}?
)+
;

相关内容

  • 没有找到相关文章

最新更新