语义检查与提升精神x3
Semantic checks with boost spirit x3
我目前正在尝试使用boost spirit x3编写编译器。我完成了解析器(现在没有语义操作和错误处理,只是解析为ast)。由于我想实现支持作用域和函数调用的语言,我问自己何时检查被调用的函数是否存在?我应该检查一个函数是否存在于当前作用域中,而构建ast(同时解析与语义动作),或者我应该检查这在编译ast ?作用域堆栈也是如此。我应该在解析时建立作用域堆栈,使用语义操作,还是在编译出最后一个?
问题没有明确说明。
这在很大程度上取决于你正在实现的语言的性质(它是如何进行作用域的?你有词法范围吗?闭包?你会有动态堆栈吗?协同程序?变量是动态的还是完全静态的?打字?).
就像我说的,两个都可以工作。我通常推荐"关注点分离"。在大多数情况下,只进行简单的解析并在AST上(多次)操作要简单得多,并且会产生更清晰、更容易扩展的代码。我应该检查一个函数是否存在于当前作用域中,而构建ast(而解析与语义动作),或者我应该检查这个,而编译的ast ?
根据具体情况(例如,当您希望变量在解析过程中潜在地遮蔽某些关键字或其他上下文感知谓词时),您可能需要在作用域中维护具有已知标识符的符号表。这将——我认为——构成一种设计气味,您应该考虑是否需要这种复杂性。
作用域堆栈也是如此。我应该在解析时建立作用域堆栈,使用语义操作,还是在编译出最后一个?
同样,在编译过程中操作通常要简单得多。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 何时在引用或唯一指针上使用移动语义
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- 如何从具有移动语义的类对象中生成共享指针
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- Boost Spirit,获取迭代器内部语义动作
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- boost spirit x3在拆分后的奇怪语义行为
- Spirit X3 与 boost::string_ref 从语义操作构建
- 语义检查与提升精神x3
- Spirit X3,语义作用使编译失败:属性没有预期的大小