1

我有一个 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 语言,但在树上而不是源上。此外,我无法使用远程调试来调试模式匹配树语法,这是一个障碍。

4

1 回答 1

2

你的方法是在正确的轨道上,但是你正在混合一种自上而下的方法和一种自下而上的方法。自上而下有利于分解:“这个清单很大,分成一些更小的清单。” 自下而上有利于打破事物 “这是最简单的东西,可以是一个列表,所以我会把它变成一个。”

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

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

基线AST

最终 AST

分组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)
于 2012-12-16T19:22:37.620 回答