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,这对我帮助很大!