有没有理由在lexer阶段开始构建符号表?
在书flex & bison: Text Processing Tools中,作者给出了一个lexer的例子,试图建立一个简单的符号表。以下代码中有一种解决方法,用于区分符号定义与其引用:
/* declaration keywords */
auto |
char |
int |
/* ... skip ... */
volatile { defining = 1; }
/* ... skip ... */
/* punctuators */
"{"|"<%"|";"
{ defining = 0; }
此解决方案不适用于更复杂的情况,例如int a = b, c = d;
(符号c
不会被标记为定义)。除此之外,无法在词法分析器阶段处理嵌套作用域。
在问题lex and yacc (symbol table generation)中注意到,从词法分析器访问符号表是常规的,但我仍然看不到专业人员以及为什么在词法分析器中构建的表可能在以后有用。
答案 0 :(得分:1)
一个原因是内存管理。通常制作从词法分析器传递给解析器的令牌字符串的副本(至少在标识符令牌的情况下),但标识符通常在源文本中出现多次,并且实际上只需要一个副本。
不是每次都执行复制,而是可以方便地实习&#34;实习生&#34;标识符哈希表中的字符串,只传递哈希表条目。这样,每个符号的第二次和随后出现不会产生任何动态分配。此外,整个字符串存储可以作为字符串表数据结构的一部分保存,这可以简化释放动态分配存储的逻辑。
这不完全是符号表,因为它(尚未)保存任何语义或范围信息。但是字符串表肯定是保存符号表的基本结构,至少足以符合构建符号表&#34;的开始。
在某些语言中--C是规范示例 - 词法分析器可能希望能够查询符号表中的语义信息,因此共享可能更加交织在一起。但即使没有这种讽刺,共享基本索引机制可能会有用,并不一定会打破关注点分离的概念。