我正在用 Javascript 为 C(子集)编写一个解释器(我想在浏览器中提供程序的执行可视化)。
作为第一步,我想为用户程序创建一个 AST 树。我正在为此使用 Jison,这类似于 flex/bizon 组合。
现在我只是简单地对程序进行标记并解析以检查它是否符合标准给出的语法(让我们先不管 typedef 引入的歧义问题)。
然而,符合 C 语法并不能保证程序有意义,例如
int main() {
x = ("jklfds" || "jklgfd")(2, imlost);
}
符合语法,尽管 x 未声明, ("jklfds" || "jklgfd") 不是函数指针 - 不检查类型。一般来说,有许多上下文条件没有被检查。
我想知道在构建 AST 树时应该检查多少。例如,理论上在这一点上很容易完全计算和检查常量表达式。但是,许多其他检查都需要上下文。例如,在解析过程中,是否有可能知道某些标识符引用了程序前面声明的结构?
如何按原样构建 AST 树并通过多次分析/转换 AST 来检查上下文约束以证明越来越多的条件是正确的?它会比解析期间的检查更容易/更难吗?
我正在寻找最友好的解决方案,我不在乎它的速度。