ANTLR 模式 "line 1:9 extraneous input ' ' expecting WORD"

ANTLR Pattern "line 1:9 extraneous input ' ' expecting WORD"

我刚刚开始使用 ANTLR。我正在尝试为看起来像这样的字段定义编写 parser

field_name = value

示例:

is_true_true = yes;

我的语法是这样的:


grammar Hello;

    //Lexer Rules
    
    fragment LOWERCASE  : [a-z] ;
    fragment UPPERCASE  : [A-Z] ;
    fragment DIGIT: '0'..'9';
    fragment TRUE: 'TRUE'|'true';
    fragment FALSE: 'FALSE'|'false';
    
    
    INTEGER : DIGIT+ ;
    STRING : ('\''.*?'\'') ;
    BOOLEAN : (TRUE|FALSE);
    
    
    WORD                : (LOWERCASE | UPPERCASE | '_')+ ;
    WHITESPACE          : (' ' | '\t')+ ;
    NEWLINE             : ('\r'? '\n' | '\r')+ ;
    
    field_def : WORD '=' WORD ';' ;
    

但是当我 运行 在 'working = yes;' 上生成的解析器时,我收到错误消息:

line 1:7 extraneous input ' ' expecting '='

line 1:9 extraneous input ' ' expecting WORD


我不太明白,匹配 WORD 模式是否有错误,或者完全是其他原因?

你的例子有空格,但你的 field_def 没有考虑到它。

由于通常空格对您的语法来说并不重要(即它没有语义意义,除了分隔单词),ANTLR 可以跳过它:

在 ANTLR 4 中,这是由

完成的
WHITESPACE          : (' ' | '\t')+  -> skip;
NEWLINE             : ('\r'? '\n' | '\r')+ -> skip;

在 ANTLR 3 中语法是

WHITESPACE          : (' ' | '\t')+ { $channel = HIDDEN; };
NEWLINE             : ('\r'? '\n' | '\r')+ { $channel = HIDDEN; };

词法分析器像往常一样对输入进行分词,但解析器知道这些分词对它来说并不重要,并且表现得好像它们不存在一样,从而使您的规则保持简单,而无需添加可选的到处都是空白。