2011-04-03 76 views
4

我想为使用lex和yacc的c编译器进行语义阶段。现在的问题是如果我在C程序中有多个错误,它会在第一次之后停止。我能做什么?编译器的语义阶段

+5

在你的yacc文件中,用'%s is defined'消息去除'printf'后的'exit(0);' – pmg 2011-04-03 20:17:42

回答

2

我强烈建议您将语义分析作为单独的阶段执行,而不是作为解析阶段的一部分。使用YACC只能建立一个abstract syntax tree,然后在一个单独的函数中遍历这棵树。所述函数在树中移动时具有无限的自由度,而不必“遵循解析”。至于你提到的具体问题,@ pmg的评论似乎指出了这个问题。

1

对此没有一个绝对的答案。处理它的一个典型方法是创建一个特殊的模式来读取符号,直到它到达一行的末尾(例如)一个分号为止,并给出一个合理的信号,表明之后的任何内容都是作为新的声明,定义,声明等等,然后从这一点重新开始解析(保留足够的上下文来知道,例如,你当前正在解析一个函数体,所以你在这个基础上接受/拒绝输入)。