用于定义/调用多参数函数的ANTLR语法

时间:2011-07-11 00:57:24

标签: function parameters antlr antlr3

我有一个语法,我想在其中包含多参数函数(如f(x,y))。我正在使用AST输出和我自己的树解析器。现在我的参数列表生成是

paramdefs: (ID COMMA)* ID ;

这很好,但是

的AST输出
z(x,y)=expression

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

(即非常平坦)。

FUNC CommonTree的孩子,一般情况下是{function nameparametercommaparameterdefined expression},对于任何数量的参数。我希望参数列表是一个单独的子项而不是逗号(这样可以更容易地遍历树)。

理想情况下,这就是树的样子:

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

(请注意,缺少逗号元素以及xy的分组。

语法的相关相关领域:

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

paramdefs: (ID COMMA)* ID ;

1 个答案:

答案 0 :(得分:9)

要创建这样的树:

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+)
  ;