使用 boost spirit x3 进行语义检查
Semantic checks with boost spirit x3
我目前正在尝试使用 boost spirit x3 编写编译器。
我完成了解析器(现在没有语义操作和错误处理,只是解析成 ast)。
由于我想实现支持范围和函数调用的语言,我问自己什么时候检查被调用函数是否存在?
我应该在构建 ast 时检查函数是否存在于当前范围内(在使用语义操作进行解析时),还是应该在编译 ast 时检查它?
与范围堆栈相同。我应该在解析、使用语义操作或编译 ast 时构建作用域堆栈吗?
这个问题非常不明确。
其中大部分在很大程度上取决于您正在实现的语言的性质(它如何进行范围界定?您会有词法范围界定吗?闭包?您会有动态堆栈吗?协程?变量是动态的还是完全静态?打字?)。
Should I check if a function exists in the current scope while building the ast(while parsing with semantic actions), or should I check this while compileing the ast out?
就像我说的,都可以工作。我通常推荐关注点分离。在大多数情况下,只需简单地解析并在 AST 上操作(多次)就更容易思考,并且会产生更清晰、更容易扩展的代码。
根据情况(例如,当您希望变量在解析过程中潜在地隐藏某些关键字或某些其他上下文感知谓词时),您可能需要例如在范围内维护一个具有已知标识符的符号 table。这将 - IME - 构成一种设计味道,你应该考虑你是否需要复杂性。
The same with the scope stacks. should I build up the scope stacks while parsing, using semantic actions, or while compiling out the ast?
同样,在编译过程中做事通常要简单得多。
我目前正在尝试使用 boost spirit x3 编写编译器。 我完成了解析器(现在没有语义操作和错误处理,只是解析成 ast)。 由于我想实现支持范围和函数调用的语言,我问自己什么时候检查被调用函数是否存在? 我应该在构建 ast 时检查函数是否存在于当前范围内(在使用语义操作进行解析时),还是应该在编译 ast 时检查它? 与范围堆栈相同。我应该在解析、使用语义操作或编译 ast 时构建作用域堆栈吗?
这个问题非常不明确。
其中大部分在很大程度上取决于您正在实现的语言的性质(它如何进行范围界定?您会有词法范围界定吗?闭包?您会有动态堆栈吗?协程?变量是动态的还是完全静态?打字?)。
Should I check if a function exists in the current scope while building the ast(while parsing with semantic actions), or should I check this while compileing the ast out?
就像我说的,都可以工作。我通常推荐关注点分离。在大多数情况下,只需简单地解析并在 AST 上操作(多次)就更容易思考,并且会产生更清晰、更容易扩展的代码。
根据情况(例如,当您希望变量在解析过程中潜在地隐藏某些关键字或某些其他上下文感知谓词时),您可能需要例如在范围内维护一个具有已知标识符的符号 table。这将 - IME - 构成一种设计味道,你应该考虑你是否需要复杂性。
The same with the scope stacks. should I build up the scope stacks while parsing, using semantic actions, or while compiling out the ast?
同样,在编译过程中做事通常要简单得多。