解决ANTLR4中的Lexer和Parser模糊问题

时间:2014-01-06 12:00:39

标签: java parsing antlr antlr4

在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?

1 个答案:

答案 0 :(得分:1)

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

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