Grammar ANTLR4语法的问题
我有一个非常简单的语法文件,如下所示:Grammar ANTLR4语法的问题,grammar,antlr4,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)
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')
;
...
// Parser Rules:
word
: CAPITAL_WORD EOF
;
...
如果我尝试解析输入“Hello”,一切都正常,但是如果像这样修改我的语法文件:
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')
;
...
// Parser Rules:
word
: CAPITAL_WORD EOF
;
...
输入“Hello”不再被识别为有效输入。谁能解释一下,出了什么问题
Thanx,Lars这里的问题与词汇语法中的优先级有关。因为
任何单词
都列在大写字母
之前,所以它的优先级更高。lexer将Hello
识别为大写字母
,但由于任何大写字母
都可以是大写字母
,并且lexer设置为更喜欢任何字母
,它将输出标记任何字母
。解析器作用于lexer的输出,并且由于任何单词EOF
与其任何规则都不匹配,因此解析失败
您可以通过将大写字母单词
移动到语法中的任意单词
上方,使lexer的行为有所不同,但这将产生相反的问题——大写字母的单词永远不会作为任意单词
s进行lex。最好的做法可能是建议的——将任何单词
作为解析器规则。任何单词
都应该是解析器规则。Thanx,这对我帮助很大!