我正在开发一个基本上应该实现这个简单语法的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
任何想法?
答案 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}?
;
相关:
为了更好地理解,请查看生成的语法源代码,以及使用范围生成的语法代码。