抱歉标题不好,不知道怎么写。无论如何,我使用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)是这样的:
但是,我希望将函数参数解析为树(如删除逗号以便于解释,并为每个参数指定它自己的节点)。
PARAMS
/ \
&x &y
答案 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推荐它。