多态性抽象语法树(递归下降解析器):不可能
Polymorphic Abstract Syntax Tree (recursive descent parser): impossible?
我已经开始在C 中编写多态性递归血统解析器。但是我正在运行一个问题。类似这样的课程:
class Node {
public:
std::vector<Node*> children;
};
class NodeBinary : public Node {
public:
Node* left;
Node* right;
};
class NodeUnary : public Node {
public:
Node* operand;
};
class NodeVar : public Node {
public:
std::string string;
NodeVar(std::string str) : string(str) {};
};
class NodeNumber : public Node {
public:
signed long number;
NodeNumber(signed long n) : number(n) {};
};
// etc.
然后类似NodeDeclaration
,NodeCall
,NodeNot
,NodeAssignment
,CC_4,NodePlus
,NodeMinus
,NodeIf
等类,CC_7等。
但是,其中一些采用更具体的操作数。NodeAssignment
始终采用VAR和数字/表达式。因此,我将不得不覆盖节点*向左*向左*右nodeexpr*右。问题带有NodePlus
之类的东西。左可以是NodeVar
或NodeExpr
!根节点也有类似的问题:在顶层解析以将孩子节点添加到root时,如何确定孩子是否是NodeExpr
,NodePlus
,NodeIf
,CC_17等...?
我可以让所有节点都有一个枚举的"类型",说什么类型是什么类型,但是拥有一个不错的多态性继承树有什么意义?
这个问题通常如何解决??
如果您使用的是AST节点的类继承,则需要创建适当的继承层次结构,就像任何面向对象的设计一样。
因此,例如,NodeAssignment
(大概是NodeStatement
的专业化)需要包含NodeLValue
(其中NodeVariable
是专业化)和NodeValue
。像往常一样,lvalues(即您可以分配给的东西)是值的子集,因此NodeLValue
将是NodeValue
的专业化。等等。您的二进制操作员节点将包含left
和right
成员,这两个成员都是NodeValue
基本对象(我希望NodeValue
是纯虚拟的,具有大量特定的特定专业。)
如果您坚持使用递归下降解析器,则每个解析功能都需要返回适当的Node
子类,以便解析分配的左侧的功能在逻辑上返回NodeLValue*
NodeAssignment
构造函数。(坦率地说,我会在所有这些类名称中抛弃 Node
一词。将它们全部放入命名空间node::
并节省一些打字。)
- 如何删除分支因子不一致的树,最大为 30,40
- C# HashSet VS C++ std::unordered_set 使用自定义类键。C++慢...不可能。如何实现 C# 的速度?
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 为什么在C++不可能递增或进行数学运算,例如在声明为数组的变量上乘法
- C++中抽象语法树最常用的表示法是什么
- fopen 与常量字符 * 从 QString 是不可能的
- 罗斯林是否支持C++生成语法树
- 使用 liblua 获取 Lua 语法树
- 可以提示插入到标准::地图导致不平衡的树
- 矢量返回常量引用,不可能向下转换
- 分配取消引用的字符指针真的不可能吗?
- C#类过程 - 控制C 应用程序,不可能读取输出
- 可能是不可能的模板参数规范/推论
- 如何访问序列化的 clang 抽象语法树 (AST)
- 易失性结构 = 结构不可能,为什么?
- 矢量超出范围,将值分配给空矢量>不可能?
- 为什么不可能实例化原子对
- 一个倒梯形,但如果输入高度对于宽度来说太大,那么它应该报告,不可能("不可能的形状"是什么)
- 多态性抽象语法树(递归下降解析器):不可能
- 在c++中真的不可能跳过带有默认实参的模板形参吗?为什么语法不这么认为?