Antlr 解析参数并删除最后一个逗号

Antlr 解析参数并删除最后一个逗号,antlr,antlr4,Antlr,Antlr4,很抱歉标题不好,不知道该怎么写。无论如何,我正在使用ANTLR生成一个解析树。我正在尝试解析函数参数,这在某种程度上是可行的,但有一些事情我想更改,我不确定如何更改 下面是我当前的设置: function : FUNCTION WORD LPAREN functionParams RPAREN ARROW WORD LBRACE RBRACE ; functionParams : (AMP WORD COMMA)* ; // these could b

很抱歉标题不好,不知道该怎么写。无论如何,我正在使用ANTLR生成一个解析树。我正在尝试解析函数参数,这在某种程度上是可行的,但有一些事情我想更改,我不确定如何更改

下面是我当前的设置:

function
    :   FUNCTION WORD LPAREN functionParams RPAREN ARROW WORD LBRACE RBRACE
    ;

functionParams
    :   (AMP WORD COMMA)*
    ;

// these could be wrong, I wrote these in by hand
AMP: '&';
WORD: [a-zA-Z_]+;
COMMA: ',';
LPAREN: '(';
RPAREN: ')';
现在这是伟大的,它的工作。但是当我说

fn test(&x, &y, &z) -> int { }
这给了我一个错误,一个我更愿意改变的结果。错误在于它希望每个参数后面都有一个逗号,因此
&z
将变成
&z,
,这不是我想要的

其次,它生成的树(gui)如下所示:

但是,我希望函数参数能像这样解析到树中(去掉逗号以便于解释,并将每个参数赋予它自己的节点)


关于你的第一个问题,改变

functionParams
    :   (AMP WORD COMMA)*
    ;

关于第二个问题,您没有指出您正在使用的Antlr的版本。如果是antlrv4,解析器只能生成解析树,而不能生成AST。实际上,使用解析树与使用AST没有什么不同——只需遍历它并从感兴趣的节点提取信息。通过一点计划,您可以定义语法规则,将有用的信息很好地隔离到它们自己的解析树节点中,例如上面的
param
规则。当然,您可以自由地遍历解析树并生成自己设计的AST


如果您使用的是Antlr V3,解析器将直接生成AST。解析器语法还允许以相当灵活的方式对AST进行整形,包括跳过节点。但是,V3的优点并不是很好,一般来说,推荐它要比Antlr V4好。

好的,谢谢!是的,很抱歉我没有提到我用的是ANTLR 4。参数列出了我不太在意的事情。
functionParams
    :   (AMP WORD COMMA)*
    ;
functionParams
    :   ( param ( COMMA param )* )?
    ;

param
    :   AMP WORD
    ;