【发布时间】:2021-02-08 21:55:52
【问题描述】:
我有一个相当基本的符号表来将标识符映射到符号,存储 VariableSymbols、MethodSymbols、BuiltInTypeSymbols 等。这对我的简单解释器来说工作得很好。但是现在我想实现更高级的符号类型,例如存储 BuiltInTypes 数组的元组(比如 TupleSymbol)。
我可以轻松实现 TupleSymbol 并将其存储在表中,但我已经意识到继续使用我当前的映射到符号方法来存储类型最终会导致符号表查找时出现很多不明确的符号类型.例如,如果我想将一个元组分配给一个名为“test”的元组变量,在分配操作中,我必须检查存储在表中的标识符“test”的符号是 TupleSymbol 还是 BuiltInTypeSymbol,并且我必须对我要分配给它的值执行相同的操作。
有没有更好的方法来实现符号表?例如,最好在符号表范围内有多个区域,分别存储每种类型的符号,即 std::map<:string methodsymbol> 用于方法, std::map<:string varsymbol> 用于变量?
编辑
这里有一些代码可以帮助可视化我当前的设计。注意符号表映射symbolTable 是如何使用基本符号类的。
class BuiltInTypeSymbol;
class Symbol {
public:
BuiltInTypeSymbol* type;
std::string name;
Symbol(std::string inname, BuiltInTypeSymbol* intype) : name(inname), type(intype){}
};
class BuiltInTypeSymbol : public Symbol {
public:
BuiltInTypeSymbol(std::string inname) : Symbol(inname, this) {}
}
class VarSymbol : public Symbol {
public:
VarSymbol(std::string inname, BuiltInTypeSymbol* typesymbol) : Symbol(inname, typesymbol) {}
}
BuiltInTypeSymbol* intType = new BuiltInTypeSymbol("int");
BuiltInTypeSymbol* floatType = new BuiltInTypeSymbol("float");
std::map<std::string, Symbol*> symbolTable = {
{intType->name, intType}, // registering int type
{floatType->name, floatType}, // registering float type
{"a", new VarSymbol("a", intType)} // registering test variable "a" of type int
};
【问题讨论】:
-
这应该如何使用?为什么你这么多使用指针?
int->name是什么? -
@super。修正了错字,它应该是 intType->name。代码不是那么重要,只是说明我当前的符号表是如何表示的。我主要是在寻找有关创建符号以将标识符映射到不同类型的符号的最佳方法的建议,例如VarSymbol、BuiltInTypeSymbol、MethodSymbol 等
-
为什么?您确定可以使用各种
Symbol类型实现多态吗?
标签: c++ compiler-construction symbol-table semantic-analysis