Выражения ANTLR переписывают промежуточное дерево - PullRequest
2 голосов
/ 11 апреля 2010

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

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

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

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

| ^ (WRITE c = выражение) -> ^ (WRINT ^ (INTC ^ ($ c))

Следующим шагом является испускание 7 в ассемблере.

1 Ответ

1 голос
/ 02 сентября 2010

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

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

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

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

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