为C程序构建AST时的上下文条件

为C程序构建AST时的上下文条件,c,parsing,interpreter,abstract-syntax-tree,jison,C,Parsing,Interpreter,Abstract Syntax Tree,Jison,我正在用Javascript为C(子集)编写一个解释器(我想在浏览器中提供程序的执行可视化) 作为第一步,我想为用户程序创建一个AST树。我使用的是Jison,类似于flex/bizon的组合 现在,我只需对程序进行标记并进行解析,以检查它是否符合标准给出的语法(让我们不必考虑typedef引入的歧义问题) 然而,例如,遵守C语法并不能保证程序有任何意义 int main() { x = ("jklfds" || "jklgfd")(2, imlost); } 符合语法,尽管没有声明x

我正在用Javascript为C(子集)编写一个解释器(我想在浏览器中提供程序的执行可视化)

作为第一步,我想为用户程序创建一个AST树。我使用的是Jison,类似于flex/bizon的组合

现在,我只需对程序进行标记并进行解析,以检查它是否符合标准给出的语法(让我们不必考虑typedef引入的歧义问题)

然而,例如,遵守C语法并不能保证程序有任何意义

int main() {
    x = ("jklfds" || "jklgfd")(2, imlost);
}
符合语法,尽管没有声明x,(“jklfds”| |“jklgfd”)不是函数指针-不检查类型。通常,有许多上下文条件未被检查

我想知道在构建AST树时应该检查多少。例如,从理论上讲,在这一点上,完全计算和检查常量表达式是很容易的。然而,许多其他检查都需要上下文。 例如,在解析过程中,是否可能知道某些标识符引用程序中先前声明的结构

如何按原样构建AST树,并通过多次分析/转换AST来检查上下文约束,以证明越来越多的条件是正确的?在解析过程中是否比检查更容易/更难


我正在寻找最友好的解决方案,我不在乎它的速度。

如果您正在构建AST,请将执行上下文检查的代码和执行解析的代码完全分开并独立。这是基本的关注点分离原则。有关如何“干净地”处理上下文相关约束的讨论,请参阅。