我有一个非常简单的语法文件,如下所示:
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”,一切都OK,但是如果修改我的语法文件是这样的:
...
// Parser Rules:
word
: CAPITAL_WORD EOF
;
...
输入“Hello”不再被识别为有效输入 . 谁能解释一下,出了什么问题?
Thanx,Lars
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
成为解析器规则 .