ANTLR AST语法问题不匹配的令牌异常

时间:2012-09-10 11:38:37

标签: antlr

我真正的语法更复杂,但我可以解决我的问题。所以这就是语法:

grammar test2;
options {language=CSharp3;}

@parser::namespace { Test.Parser }
@lexer::namespace { Test.Parser }

start   : 'VERSION' INT INT project;

project :   START 'project' NAME TEXT END 'project';

START: '/begin';
END: '/end';

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

    INT :   '0'..'9'+;

    NAME:   ('a'..'z' | 'A'..'Z')+;

    TEXT  :  '"'  ( '\\' (.) |'"''"' |~( '\\' | '"' | '\n' | '\r' ) )* '"';

    STARTA 
        :   '/begin hello';

我想解析这个(例如):

  

版本1 1

     

/开始项目

     

testproject“描述在这里”

     

/结束

     

项目

现在它不会像这样工作(不匹配的令牌异常)。如果我删除最后一个令牌STARTA,它的工作原理。但为什么?我不明白。

非常感谢帮助。 感谢。

1 个答案:

答案 0 :(得分:2)

当词法分析器看到输入"/begin "(包括空格!)时,它将被提交到规则STARTA。当它无法匹配所述规则时,因为输入中的下一个字符是"p"(来自"project")而不是"h"(来自"hello"),它将尝试匹配另一个可以匹配"/begin "的规则(包括空格!)。但是没有这样的规则,产生错误:

  

mismatched character 'p' expecting 'h'

并且词法分析器将放弃空格并匹配START规则。

请记住最后一部分:一旦词法分析器匹配某些东西,它就不会放弃它。它可能会尝试匹配相同输入的其他规则,但它不会回溯以匹配匹配较少字符的规则!

这就是词法分析器在ANTLR 3.x中的工作方式,而不是它。