解析具有特定数量元素的数组

问题描述 投票:0回答:1

我最近尝试在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();
            }
        }
        |
        );

但这似乎与自适应预测混淆(我有时会遇到无限循环)。 有什么想法吗?

antlr antlr4
1个回答
0
投票

这有效:

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>'
© www.soinside.com 2019 - 2024. All rights reserved.