1

我的 ANTLR 语法有问题,我只是没有看到我的问题,现在已经尝试了一个多小时。我将我的问题简化为这个简单的语法:

        grammar TestGrammar;

        options {
          language = Java;
          k=2;
        }

        compu_method :  '/begin COMPU_METHOD'  NAME  NAME  NAME  NAME
              (
              (formula)
              |('COEFFS' realnumber realnumber realnumber realnumber realnumber realnumber)
              )*
              '/end COMPU_METHOD';

            formula : '/begin FORMULA' (.)* '/end FORMULA';

            realnumber: (INT | FLOAT);

        NAME : LETTER (LETTER|'0'..'9'|'['|']'|'.')* ; 
        fragment LETTER : 'A'..'Z' | 'a'..'z' | '_' ; 

        INT : MINUS? ('0' | '1'..'9' '0'..'9'*) ; 
        FLOAT : MINUS? ('0'..'9')+ '.' ('0'..'9')* Exponent? | MINUS? '.' ('0'..'9')+ Exponent? | MINUS? ('0'..'9')+ Exponent ; 
        MINUS : '-' ; 
        fragment Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;

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

我试图匹配的输入是:

/begin COMPU_METHOD
        foo
        foo
        foo
        foo
        COEFFS 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000
/end COMPU_METHOD

解释器总是给我“不匹配的输入 'COEFFS' 期望 '\u0005'”

但为什么?

如果我在我的语法中更改 (formula) 和 ('COEFFS' ...) 的顺序,那很好,我只是不明白为什么?

4

1 回答 1

1

N修复错误后( 中的标记无效compu_method,并且您忘记了规则后的分号formula),我解析输入没有问题。我得到以下解析树:

在此处输入图像描述

请注意,我使用的是调试器,而不是解释器(这是错误的)。所以你的问题可能是你使用了解释器。

于 2012-05-02T17:29:43.570 回答