gpt4 book ai didi

java - 解决 ANTLR4 中的 Lexer 和 Parser 歧义

转载 作者:行者123 更新时间:2023-11-30 11:23:50 26 4
gpt4 key购买 nike

在 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 模式中定义的词法分析器规则。问题是,在评估 eval 规则时,它将文本标识为 WORD 标记,而不是评估语法规则。我的意思是,如果我输入一些文本,例如:

${stuff to be evaluated}

它应该进入评估规则,但相反,它将它标识为一个 WORD(仅采用“${stuff”部分)

我知道 evaluation 和 WORD 之间存在歧义,但我认为 ANTLR 将采用解析器规则的第一个巧合(evaluation 在这种情况下).

抱歉,如果这太困惑了,我试着尽可能好地总结这一点(我不想放完整的解析器和词法分析器内容以避免基本上是一堵文本墙)。

我考虑过的另一个选择是将“WORD”定义为除由 ${ 和 } 包围的文本之外的任何内容。但我不知道如何创建这样的词法分析器规则。

我该如何解决这个问题?区分评价和WORD?

最佳答案

您需要包含一个谓词,以防止在 WORD 中包含 $ 后跟 {

WORD
: ( ~[ \t\r\n:,$]
| '$' {_input.LA(1) != '{'}?
)+
;

关于java - 解决 ANTLR4 中的 Lexer 和 Parser 歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20949590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com