我有一个非常简单的语法文件,如下所示:
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
答案 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
成为解析器规则。