has*_*sen 22
解析意味着只计算程序结构:将模块分离为语句/声明,将表达式分解为子表达式等.最终得到一个树结构,称为"解析树"或"抽象语法树"( AST).
显然,C++需要一个符号表来进行解析.
本页讨论了C++需要符号表进行解析的一些原因.
当然,解析只是编译的一部分,您需要一个符号表来进行完整的编译.
但是,解析本身在编写分析工具(例如,哪个模块导入哪些模块)时非常有用.因此,简化解析过程意味着编写代码分析工具更容易.
yfe*_*lum 10
解释和编译绝对需要符号表或类似表.几乎所有语言都是如此.
在C和C++中,即使解析语言也需要符号表.
@Justice是对的.为了进一步扩展,在C中,唯一真正棘手的部分是告诉类型除变量之外.特别是当你看到这个:
T t;
Run Code Online (Sandbox Code Playgroud)
您需要知道这T
是一种合法解析的类型.这是你必须在符号表中查找的东西.只要在解析继续时将类型添加到符号表中,这就相对简单了.您不需要在编译器中做太多额外的工作:T
表中存在或者不存在.
在C++中,事情要复杂得多.存在大量模糊或可能含糊不清的结构.最明显的是这一个:
B::C (c);
Run Code Online (Sandbox Code Playgroud)
除了不清楚B
是a class
,a typedef
还是a之外namespace
,还不清楚是否C
是该类型的类型和c
对象,或者是否C
是c
作为参数的函数(或构造函数)(或者即使C语言)是一个operator()
重载的对象).您需要符号表进行解析,尽管仍然可以足够快地继续,因为符号的类型在符号表中.
当模板进入组合时,事情变得更加糟糕得多.如果C (c)
在模板中,您可能不知道模板的实际定义,如果C是类型或函数/对象.那是因为模板可以声明C
为类型或变量.这意味着你需要的符号表,但你不有一个-你不能有一个,直到模板实际上是宣告.更糟糕的是,仅仅具有符号类型并不一定足够:您可以提出需要符号所代表类型的完整信息的情况,包括大小,对齐和其他机器特定信息.
所有这些都有几个实际效果.我要说的两个最重要的是:
归档时间: |
|
查看次数: |
2296 次 |
最近记录: |