ANTLR грамматика для определения / вызова многопараметрических функций - PullRequest
6 голосов
/ 11 июля 2011

У меня есть грамматика, в которую я хотел бы включить многопараметрические функции (например, f(x,y)).Я использую вывод AST с моим собственным анализатором дерева.Прямо сейчас мой список параметров производства

paramdefs: (ID COMMA)* ID ;

Это работает нормально, но вывод AST для

z(x,y)=expression

равен

(FUNC (z)(x)(,)(y)(expression))

(то есть он очень плоский).

Дочерние элементы FUNC CommonTree в общем случае являются {function name, parameter, comma, parameter, defined expression} для любого количества параметров.Я бы хотел, чтобы список параметров был единственным ребенком и не имел запятых (это облегчило бы обход дерева).

В идеале дерево должно выглядеть так:

(FUNC (z)((x)(y))(expression))

(обратите внимание на отсутствие элемента запятой и группировку x и y.

Соответствующие связанные области грамматики:

funcdef: ID  '(' paramdefs ')' '=' expr -> ^(FUNC ID paramdefs expr) ;

paramdefs: (ID COMMA)* ID ;

1 Ответ

9 голосов
/ 11 июля 2011

Чтобы создать дерево вроде этого:

enter image description here

для ввода z(x,y)=expr, выполните следующие действия:

grammar ...

...

tokens {
  FUNC;
  PARAMS;
}

...

funcdef
  :  ID  '(' paramdefs ')' '=' expr   -> ^(FUNC ID paramdefs expr) 
  ;

paramdefs
  :  (ID COMMA)* ID                   -> ^(PARAMS ID+)
  ;
...