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