按相反顺序使用antlr3制作AST

按相反顺序使用antlr3制作AST,antlr,antlr3,Antlr,Antlr3,我正在学习antlr3,为此我修改了一个Javascript语法(我从中获得了语法),以添加对AST生成的支持。 现在,我尝试使用多个参数(例如:a函数(1)(2)(3)(4))为“函数调用”添加AST支持。 在我的模型中,前面的示例必须创建类似以下内容的AST: CALLEXPRESSION CALLEXPRESSION Arguments(4)

我正在学习antlr3,为此我修改了一个Javascript语法(我从中获得了语法),以添加对AST生成的支持。 现在,我尝试使用多个参数(例如:
a函数(1)(2)(3)(4)
)为“函数调用”添加AST支持。 在我的模型中,前面的示例必须创建类似以下内容的AST:

                                 CALLEXPRESSION
                      CALLEXPRESSION        Arguments(4)
              CALLEXPRESSION        Arguments(3)
     CALLEXPRESSION     Arguments(2)
undef           Arguments(1)
                                   CALLEXPRESSION
                        CALLEXPRESSION      Arguments(1)
              CALLEXPRESSION        Arguments(2)
     CALLEXPRESSION     Arguments(3)
undef           Arguments(4)
目前,我有以下规则来处理这种情况:

callExpression
: f=memberExpression! (LT* callExpressionSuffix[$f.tree]^)
;

callExpressionSuffix[param]
: arguments oCallSuf=callExpressionSuffix[param] -> ^(CallExpression $oCallSuf arguments)
| (->{param})
;
但这些正在创建一个类似AST的:

                                 CALLEXPRESSION
                      CALLEXPRESSION        Arguments(4)
              CALLEXPRESSION        Arguments(3)
     CALLEXPRESSION     Arguments(2)
undef           Arguments(1)
                                   CALLEXPRESSION
                        CALLEXPRESSION      Arguments(1)
              CALLEXPRESSION        Arguments(2)
     CALLEXPRESSION     Arguments(3)
undef           Arguments(4)
(参数顺序相反)

问题是:

如何使用纯“antlr3语言”反转参数的顺序?

既然您是从ANTLR开始的,为什么要用旧的主要版本来陈述呢?嗨,卢卡斯,这是因为我正在使用为在antlr3下运行而开发的ecmaScript语法。另外,这个想法是生成AST,读了一点关于antlr4的内容,我发现它生成了解析树。antlr4也有一个。不要担心AST,ANTLR4强制您编写自己的CST->AST转换步骤(如果您想要AST),但这是一个按照您希望的方式微调AST的机会。