递归树重写ANTLR

时间:2012-12-16 01:20:08

标签: parsing tree antlr grammar abstract-syntax-tree

我有一个包含简单令牌列表的AST ...

我只想将成对的平衡参数分组到嵌套树中。

我一直在尝试各种规则,但我无法理解......

bottomup : findParams;

findParams
: ^(LIST left+=expression* LPARAM inner? RPARAM right+=expression*)
-> ^(LIST  $left* ^(PARAMS inner?) $right*);

inner : (left+=expression* LPARAM inner? RPARAM right+=expression*)
-> $left* ^(PARAMS inner?) $right*) | (a+=expression* -> $a*);

fragment expression = INT;

这有点像dyck语言,但是在树而不是源上。另外,我无法使用远程调试来调试模式匹配树语法,这是一种障碍。

1 个答案:

答案 0 :(得分:2)

你的方法是正确的,但你正在将自上而下的方法与自下而上的方法混合在一起。自上而下有利于打破局面:“这个列表很大,可以把它变成一些较小的列表。”自下而上有利于打破 out :“这是最简单的事情,可以成为一个列表,所以我会把它变成一个。”

以下是对节点进行分组的自下而上的解决方案:

bottomup
    : exit_list
    ;

exit_list
    : ^(LIST pre* LPAR reduced* RPAR post+=.*) -> ^(LIST pre* ^(LIST reduced*) $post*)
    ;

pre : INT
    | LPAR 
    | ^(LIST .*)
    ;   

reduced
    : INT
    | ^(LIST .*)
    ;    

对于不包含其他括号的每组括号,将该组的内容转换为新列表。重复此规则,直到没有更多括号。

示例:

输入

1(3(4))5

基线AST

baseline AST

最终AST

grouped AST

规则bottomup以递归方式应用了两次:

applied to (4):    (LIST 1 '(' 3 '(' 4 ')' ')' 5) -> (LIST 1 '(' 3 (LIST 4) ')' 5)

applied to (3(4)): (LIST 1 '(' 3 (LIST 4) ')' 5) -> (LIST 1 (LIST 3 (LIST 4)) 5)