我有一个包含简单令牌列表的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语言,但是在树而不是源上。另外,我无法使用远程调试来调试模式匹配树语法,这是一种障碍。
答案 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
规则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)