Выражения ANTLR перезаписывают промежуточное дерево

Для таких выражений, как 3 + 4, я хотел бы использовать значение 7 в промежуточном дереве представления.

Я не могу понять, как преобразовать возвращаемое значение в правило перезаписи.

выражение возвращает [int v]: и т. д.

Как мне добавить expression.v в WR? На данный момент получаю (+ 3 4), хочу (7)

| ^ (ЗАПИСАТЬ c = выражение) -> ^ (ЗАПИСАТЬ ^ (INTC ^ ($ c))

следующий шаг - выпустить 7 на ассемблере.


person user313856    schedule 11.04.2010    source источник


Ответы (1)


Я думаю, вы хотите знать, как использовать синтаксис перезаписи для создания единственного числового токена со значением $ c, а не другого дерева? Если это так, вы можете сделать это с помощью

^(WRITE c=expression) -> INT[$c.v] ;

предполагая, что INT является типом токена для целых чисел.

Это предполагает, что ваше правило выражения действительно оценивает и возвращает целочисленный результат. Если это не так, и вы хотите знать, как делать постоянное сворачивание, это гораздо более серьезная тема. Взгляните на пример полинома в примерах ANTLR. коллекция; он показывает, как сделать базовое упрощение. Вероятно, вы могли бы сделать это с помощью перезаписчика дерева, используя такие правила, как

^('+' a=INT b=INT) -> INT[String.valueOf($a.int+$b.int)] ;
person Maskull    schedule 01.09.2010