C++ 抽象树与解析器树
我需要您的意见,以便在生成解析器树(ST)和生成抽象语法树(AST)之间选择最佳的替代方案。背景是: 我想解析像C这样的语言(只是C的一个子集,做了一些修改,使它更面向伪代码),但不是为了在其他输出语言/文件中翻译它,而是为了执行它的语句,以动画化它的执行过程(我使用Qt绘制)。这个C子集的一个特性是它支持嵌套作用域。关于我在ST和AST之间的选择,我的疑问来自符号表。总体思路是(使用Boost.spirit):C++ 抽象树与解析器树,c++,parsing,boost,abstract-syntax-tree,boost-spirit,C++,Parsing,Boost,Abstract Syntax Tree,Boost Spirit,我需要您的意见,以便在生成解析器树(ST)和生成抽象语法树(AST)之间选择最佳的替代方案。背景是: 我想解析像C这样的语言(只是C的一个子集,做了一些修改,使它更面向伪代码),但不是为了在其他输出语言/文件中翻译它,而是为了执行它的语句,以动画化它的执行过程(我使用Qt绘制)。这个C子集的一个特性是它支持嵌套作用域。关于我在ST和AST之间的选择,我的疑问来自符号表。总体思路是(使用Boost.spirit): 通过自定义Boost.spirit解析器解析源代码文件 语义操作生成一个语法树,只
- 包含符号及其相关信息的容器(双队列?):容器中的最后一个变量是最近声明的变量
- 整数的容器(堆栈),显示每个作用域的开始(双队列的索引)
- 容器1:[x y z x a b z f a z]
- 容器2:[03 6 8]
我认为您需要的是一个抽象语义图(ASG),它表示程序的语义(与语法相反)。您可以做的是:
另外,我想说你确实可以构建一个不太抽象的AST;例如,我目前正在构建自己的脚本语言解释器,AST将包含变量名(这对于调试解析器/解释器以及解析的程序本身非常有用)。您刚刚提醒我丢失了什么(几乎)当我不得不转到C时:|如果你在这里有语法和基本的实现,这将是可以远程回答的。另外,“为读取和绘制程序状态堆栈的算法设置动画”意味着什么。我有一种预感,描述已经预先假定了一个特定的实现。我现在看到的是“不是一个真正的问题”(因为没有具体的要求,只有松散的想法)和“过于本地化”(因为“隐含的要求”(动画(?),具体的范围观念)不太可能在将来与其他人相关。这是一个有点背景的理论/设计问题。这不是一个实现问题。任何关于编译器的书都谈到AST,因为自定义创建解析器树(在本书中说)是由于程序创建了两倍于解析器树的源代码丢失(解析器的树本身和您生成的副本)。但我问这本书是否有这样的上下文(解释)的理由,我认为这个问题是明确的和相关的。@sehe动画在这里不相关。事实上,出于“动画目的”(无论要求如何)我只需要将源迭代器范围与相关的标记一起存储,类似于二进制文件上的“调试信息”,但在解析树上