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

时间:2014-08-02 22:39:36

标签: antlr antlr4

抱歉标题不好,不知道怎么写。无论如何,我使用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)是这样的:

wow

但是,我希望将函数参数解析为树(如删除逗号以便于解释,并为每个参数指定它自己的节点)。

    PARAMS
   /      \
&x          &y

1 个答案:

答案 0 :(得分:0)

关于第一个问题,请更改

functionParams
    :   (AMP WORD COMMA)*
    ;

functionParams
    :   ( param ( COMMA param )* )?
    ;

param
    :   AMP WORD
    ;

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

如果您使用的是Antlr V3,解析器将直接生成AST。解析器语法语法还允许以相当灵活的方式整形AST,包括跳过节点。然而,V3的优点并不是很好,而是通过Antlr V4推荐它。