在Bison中创建AST

时间:2015-10-06 18:08:49

标签: c bison abstract-syntax-tree

我正在尝试使用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,这不是我想要的。另外,我收到了一个警告“类型为非终结的空规则,没有行动”,这可能不太好。

1 个答案:

答案 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); }  
        ;

这在编译(做列表)时非常常见,它出现在大多数语法中。