我最近尝试在antlr4中解析固定大小的数组:
array[int size]
: {size > 0}? thing array[$size - 1]
|
;
这允许我拥有由我的数据确定大小的数组,例如
foo: number array[$number.value]; // array with $number amount of elements
我的问题是这种方法具有巨大的开销(大数组的堆栈溢出)。 有没有一个好的方法来线性化这种方法?
我尝试“优化”它:(目标:Java)
array[int length] returns [ThingContext[] objects]:
{
_localctx.objects = new ThingContext[length];
}
( {$length > 0}?
firstObject=thing {
_localctx.objects[0] = _localctx.firstObject;
for(int i=1; i<length; i++){
_localctx.objects[i] = thing();
}
}
|
);
但这似乎与自适应预测混淆(我有时会遇到无限循环)。 有什么想法吗?
这有效:
grammar Array;
parse
: declaration+ EOF
;
declaration
: number array[$number.value]
;
array[int length] returns [List<Integer> values]
@init {
$values = new ArrayList<Integer>();
}
: ( {$values.size() < $length}? number {$values.add($number.value);} )+
;
number returns [int value]
: INT {$value = Integer.parseInt($INT.text);}
;
INT
: [0-9]+
;
SPACES
: [ \t\f\r\n]+ -> skip
;
解析输入时:
3 1 2 3 1 4 2 5 6
创建了以下解析树:
'- parse
|- declaration
| |- number
| | '- '3' (INT)
| '- array
| |- number
| | '- '1' (INT)
| |- number
| | '- '2' (INT)
| '- number
| '- '3' (INT)
|- declaration
| |- number
| | '- '1' (INT)
| '- array
| '- number
| '- '4' (INT)
|- declaration
| |- number
| | '- '2' (INT)
| '- array
| |- number
| | '- '5' (INT)
| '- number
| '- '6' (INT)
'- '<EOF>'