我正在尝试使用Bison和C创建一个脚本语言,我想知道我是否正确地构建了AST。这是我想要创建的树:
+
└─ Steps
└─ Step 1
└─ Step 2
...
└─ Step n
如果不清楚,我希望有一个包含n个步骤的节点。我现在的语法看起来像这样:
Steps: { $$ = create_steps(); }
| Steps Step
;
Step:
IDENTIFIER StepBody { $$ = create_step($1); }
将StepBody解析为一个节点,就像我期望的那样。在我的代码中,我正在为create_steps();
中的步骤创建链接列表,但这似乎不是最好的方法。
我想我应该有一个create_steps(node *inner_node);
函数来获取所有Step
处理函数的输出并将它们添加到数组中,但我不明白我是如何实现这一点的。< / p>
最初,我在Bison中设置了Steps
这样的设置:
Steps:
| Steps Step { $$ = create_steps($Step); }
;
但当然,每次发现create_steps
时都会调用Step
,这不是我想要的。另外,我收到了一个警告“类型为非终结的空规则,没有行动”,这可能不太好。
答案 0 :(得分:1)
摆脱Steps
中的空白生产(ε):
Steps: Step { $$ = create_steps($1); }
| Steps Step { $$ = create_steps($2); }
;
..然后将Step
附加到您正在成长的树上。你甚至可以通过这种方式传递成长树:
Steps: Step { $$ = create_steps(NIL, $1); }
| Steps Step { $$ = create_steps($1, $2); }
;
这在编译(做列表)时非常常见,它出现在大多数语法中。