Suitable 建筑符号阶段 table

Suitable stage for building symbol table

是否有任何理由在词法分析器阶段开始构建符号 table?

在书 flex & bison: Text Processing Tools 中,作者给出了一个词法分析器示例,试图构建一个简单的符号 table。以下代码中有一个变通方法来区分符号定义和它的引用:

/* declaration keywords */
auto |
char |
int  |
/* ... skip ... */
volatile { defining = 1; }

/* ... skip ... */

/* punctuators */
"{"|"<%"|";"
{ defining = 0; }

这个解决方案在更复杂的情况下不起作用,例如int a = b, c = d;(符号c不会被标记为定义)。除此之外,嵌套作用域无法在词法分析器阶段处理。

在问题 中注意到从词法分析器访问符号 table 是常规的,但我仍然看不到优点,为什么 table 内置词法分析器可能以后会有用.

一个原因是内存管理。通常制作从词法分析器传递到解析器的标记字符串的副本(至少在标识符标记的情况下),但标识符通常在源文本中出现不止一次,因此只需要一个副本。

与其每次都执行复制,更方便的做法是 "intern" 标识符散列 table 中的字符串,然后只传递散列 table 条目。这样,每个符号的第二次和后续出现不会导致任何动态分配。此外,整个字符串存储可以作为字符串 table 数据结构的一部分,这可以简化释放动态分配存储的逻辑。

这不完全是一个符号 table,因为它(还)不包含任何语义或范围信息。但字符串 table 肯定是包含符号 table 的基本结构,至少足以符合 "start [of] building the symbol table".

在某些语言中——C 是典型的例子——词法分析器可能希望能够查阅符号 table 中的语义信息,因此共享可能更加交织。但即使没有黑客技术,共享基本索引机制也可能有用,并不一定会打破关注点分离的概念。