我想知道如何编写重写规则来为此规则生成AST树。
e5 : (simpleexpression) (relop simpleexpression)*
;
relop : RELOP_GT
| RELOP_LT
| RELOP_GE
| RELOP_LE
;
答案 0 :(得分:0)
这似乎是一个二元操作,其中(子)树的根是运算符relop
,叶子是simpleexpression
。在这种情况下,只需使用内联树操作符^
,它使令牌/树在它之前成为根:
e5 : simpleexpression (relop^ simpleexpression)?
;
relop : RELOP_GT
| RELOP_LT
| RELOP_GE
| RELOP_LE
;
请注意,我将*
更改为?
,因为您的原始规则会接受以下输入:
1 <= 2 < 3
在许多编程语言中,评估为:
true < 3
可能被视为无效表达式(当然,您的语言可能接受它,在这种情况下,请离开*
!)。
使用内联^
,表达式
1 <= 2
将被解析为以下AST:
<=
/ \
1 2