我有一个语法,我想在其中包含多参数函数(如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 ;
答案 0 :(得分:9)
要创建这样的树:
输入z(x,y)=expr
,请执行以下操作:
grammar ...
...
tokens {
FUNC;
PARAMS;
}
...
funcdef
: ID '(' paramdefs ')' '=' expr -> ^(FUNC ID paramdefs expr)
;
paramdefs
: (ID COMMA)* ID -> ^(PARAMS ID+)
;