ANTLR4语法的问题

时间:2015-05-04 14:33:04

标签: grammar antlr4

我有一个非常简单的语法文件,如下所示:

grammar Wort;

// Parser Rules:
word
    :   ANY_WORD EOF
    ;

// Lexer Rules:
ANY_WORD
    : SMALL_WORD | CAPITAL_WORD
    ;
SMALL_WORD 
    : SMALL_LETTER (SMALL_LETTER)+
    ;
CAPITAL_WORD 
    : CAPITAL_LETTER (SMALL_LETTER)+
    ;
fragment SMALL_LETTER
    : ('a'..'z')
    ;
fragment CAPITAL_LETTER
    : ('A'..'Z')
    ;

如果我尝试解析输入" Hello",一切正常,但是如果修改我的语法文件是这样的:

...

// Parser Rules:
word
    :   CAPITAL_WORD EOF
    ;

...

输入"你好"不再被视为有效输入。有人可以解释一下,出了什么问题吗?

Thanx,Lars

1 个答案:

答案 0 :(得分:1)

这里的问题与词法分析器语法中的优先级有关。由于ANY_WORD列在CAPITAL_WORD之前,因此优先级更高。词法分析器会将Hello标识为CAPITAL_WORD,但由于ANY_WORD可以只是CAPITAL_WORD,而词法分析器设置为首选ANY_WORD,将输出令牌ANY_WORD。解析器作用于词法分析器的输出,由于ANY_WORD EOF与其任何规则都不匹配,因此解析失败。

您可以通过在语法中将CAPITAL_WORD移到ANY_WORD之上来使词​​法分析器的行为不同,但这会产生相反的问题 - 大写单词永远不会像ANY_WORD那样。最好的办法可能是Mephy建议的那样 - 使ANY_WORD成为解析器规则。