Antlr找不到符号

时间:2014-12-16 15:18:06

标签: antlr antlrworks

我正在开发一个基本上应该实现这个简单语法的ANTLR项目:

WS  :   ' '
    ;


MINUS   : '-'   ;



DIGIT  :   '0'..'9'
    ;

int4    
@init{
 int n = 0;
}
:     (({n<4}?=> WS {n++;})* (MINUS{n++;})?({n<4}?=> DIGIT{n++;})*){n==4}?      ;



numbers
    :   (int4)*;

int4遵循Fortran的格式I4(代表宽度为4的整数)

此代码给出了以下错误:

[10:17:20] C:\Users\guille\Documents\output\testParser.java:277: cannot find symbol
[10:17:20] symbol  : variable n
[10:17:20] location: class testParser
[10:17:20]                     if ( (evalPredicate(n==4,"n==4")) ) {
[10:17:20]                                         ^
[10:17:20] C:\Users\guille\Documents\output\testParser.java:283: cannot find symbol
[10:17:20] symbol  : variable n
[10:17:20] location: class testParser
[10:17:20]                 else if ( (LA4_0==WS) && (evalPredicate(n<4,"n<4"))) {
[10:17:20]                                                         ^
[10:17:20] C:\Users\guille\Documents\output\testParser.java:289: cannot find symbol
[10:17:20] symbol  : variable n
[10:17:20] location: class testParser
[10:17:20]                 else if ( (LA4_0==DIGIT) && (evalPredicate(n<4,"n<4"))) {
[10:17:20]                                                            ^
[10:17:20] 3 errors

任何想法?

1 个答案:

答案 0 :(得分:1)

本地变量n没有传递到谓词得到评估的位置。您需要定义可在谓词中使用的范围:

int4
scope { int n; }
@init { $int4::n = 0; }
 : ( {$int4::n < 4}?=> WS {$int4::n++;} )*
   ( MINUS {$int4::n++;} )?
   ( {$int4::n < 4}?=> DIGIT{$int4::n++;} )*
   {$int4::n == 4}?
 ;

相关:

为了更好地理解,请查看生成的语法源代码,以及使用范围生成的语法代码。