【问题标题】:lex and yacc (symbol table generation)lex 和 yacc(符号表生成)
【发布时间】:2015-09-24 13:33:33
【问题描述】:

我是 lex 和 yacc 以及编译器设计的新手。 我想知道在哪个阶段(词汇、句法或任何其他阶段)以及符号表是如何生成的?

我能简要介绍一下通过给 yacc 提供 -v 选项生成的 y.output 文件吗?我试图查看它,但没有得到太多信息。

我能否知道除了编译器设计之外还使用了 lex 和 yacc 的其他应用程序。

【问题讨论】:

  • 您阅读过文档吗?您也可以使用 lex/yacc 来验证 sql 语句,简而言之:任何具有清晰语法的语言。

标签: yacc lex symbol-table


【解决方案1】:

符号表是一种全局数据结构,可用于编译器的所有阶段/阶段/遍。这意味着可以从 lex 和 yacc 生成的组件中使用/访问它。

当词法分析器找到将存储在表中的标记(例如标识符)时,通常从词法分析器访问符号表条目,它可以找到条目并使用仅对词法分析器可用的信息来更新它,例如行号和字符位置,如果它不存在,它也可以存储词位值。现在可以在令牌的lval 中返回符号表指针。

有些人喜欢从词法分析器返回一个指向词素本身的指针(如lval)到解析器,并在那里进行初始符号表访问。这具有符号表不必对词法分析器可见的优点,但具有如上所述的词法分析器信息可能不再可用于与符号一起存储的缺点。它的缺点通常是使来自 yacc 的解析器操作更加“忙碌”,因为它们可能会参与管理符号表和解析树。

符号表条目将在编译器的后期阶段进一步更新,例如解析树的语义遍历,它可以用类型信息注释符号条目并标记未声明的对象等。当目标特定信息可能被存储或需要时,符号表将在目标代码生成期间再次使用,并且在可能检查甚至优化变量使用情况的优化期间再次使用。

符号表是您编译器编写者为自己创建的数据结构。没有 lex 或 yacc 的功能可以为您做这件事。它是在您编写的任何代码创建它时生成的!

y.output 文件与符号表无关。它记录了 yacc 如何将上下文无关文法转换为解析表。当您有一个模棱两可的语法并想知道在调试语法时哪些规则导致了移位/归约或归约/归约错误时,它很有用。

问题的最后一部分,这些工具有什么用? lex 是一种工具,它为识别您指定的模式的状态机生成代码。它不必用于编写编译器。一个有趣的用途是处理可以由状态机处理的网络协议,例如 TCP/IP 数据报等。类似地,yacc 用于匹配由上下文无关文法描述的序列。这些不一定是程序,也可以是其他复杂的符号、字段或数据项序列。它们只是通常的文本片段,这是该工具的正统用法。

您问题的这些部分听起来确实像是有人可能会为参加过编译器课程的学生写的那种考试题!

【讨论】:

  • 感谢 Brian 的回答。符号表的概念很清楚,感谢您的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
相关资源
最近更新 更多