Lex && Yacc编译器作业

问题描述 投票:0回答:1

你好(我的英语不太好,我希望你能理解),我有一个小编要编写一个编译器,已经在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

请帮助:)

abstract-syntax-tree yacc lex
1个回答
0
投票

斯蒂芬·约翰逊(Stephen Johnson)撰写了一篇技术论文,陪伴yacc大约42年前。您阅读并理解了吗?

如果是,则语法规则如下:

expr   :   expr '+' expr      { $$ = node( '+', $1, $3 ); } 

节点正在有效地创建抽象语法树节点; yacc进行的每一次还原都是从下至上构建此树的机会。关于yacc,这是最重要的事情。它是自下而上构建的,您同样需要构建数据结构。

解析完成后(对于语法的任何完成版本,产生的值($$)是语法树的根。

© www.soinside.com 2019 - 2024. All rights reserved.