代码之家  ›  专栏  ›  技术社区  ›  Jakob Sachs

ANTLR Pattern“行1:9外部输入”“需要单词”

  •  0
  • Jakob Sachs  · 技术社区  · 6 年前

    我刚开始使用 安特尔 . 我想写一本书 分析器

    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;'上运行生成的解析器时,会得到错误消息:

    行1:7外部输入“”应为“=”

    行1:9外部输入“”需要单词


    我不完全理解这一点,是否有一个错误的匹配 WORD -还是完全是别的什么?

    2 回复  |  直到 4 年前
        1
  •  1
  •   Jiri Tousek    6 年前

    由于空格对语法意义不大(即除了分隔单词外,它没有任何语义意义),所以ANTLR可以跳过它:

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

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

        2
  •  1
  •   Daniel A. White    6 年前

    你的例子有空格,但你的 field_def 这不算什么。