你好(我的英语不太好,我希望你能理解),我有一个小编要编写一个编译器,已经在lex和yacc中制作了该语言,但是我很困惑,我们的老师要求我们编译从语言中提取AST树,并预先订购。他为我们提供了文本示例:
function void foo(int x, y, z; real f) {
if (x>y) {
x = x + f;
}
else {
y = x + y + z;
x = f * 2;
z = f;
}
}
带有预定项的AST树的输出应为:
(CODE
(FUNCTION
foo
(ARGS
(INT x y z)
(REAL f)
)
(TYPE VOID)
(BODY
(IF-ELSE
(> x y)
(BLOCK
(= x
(+ x f)
)
)
(BLOCK
(= y
(+
(+ x y)
z
)
)
(
(= x
(* f 2)
)
(= z f)
)
)
)
)
我的问题是我应该如何建树?我的意思是哪个令牌将向左移动,哪个令牌将向右移动,以便获得相同的输出?喜欢
makeTree($ 1,$ 2,$ 3);
node,left,right
请帮助:)
斯蒂芬·约翰逊(Stephen Johnson)撰写了一篇技术论文,陪伴yacc大约42年前。您阅读并理解了吗?
如果是,则语法规则如下:
expr : expr '+' expr { $$ = node( '+', $1, $3 ); }
节点正在有效地创建抽象语法树节点; yacc进行的每一次还原都是从下至上构建此树的机会。关于yacc,这是最重要的事情。它是自下而上构建的,您同样需要构建数据结构。
解析完成后(对于语法的任何完成版本,产生的值($$)是语法树的根。