首页 文章

ANTLR4语法的问题

提问于
浏览
2

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

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 回答

  • 1

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

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

相关问题