173

我正在寻找关于什么是“分词器”、“解析器”和“词法分析器”以及它们如何相互关联的明确定义(例如,解析器是否使用分词器,反之亦然)?我需要创建一个程序,将通过 c/h 源文件来提取数据声明和定义。

我一直在寻找示例并且可以找到一些信息,但我真的很难掌握语法规则、解析树和抽象语法树等基本概念以及它们如何相互关联。最终这些概念需要存储在一个实际的程序中,但是 1)它们看起来像什么,2)有没有共同的实现。

我一直在查看有关 Lex 和 Yacc 等主题和程序的 Wikipedia,但从未学习过编译器类(EE 专业),我发现很难完全理解发生了什么。

4

4 回答 4

200

标记器将文本流分解为标记,通常通过查找空格(制表符、空格、换行符)。

词法分析器基本上是一个标记器,但它通常为标记附加额外的上下文——这个标记是一个数字,那个标记是一个字符串文字,这个另一个标记是一个相等运算符。

解析器从词法分析器中获取标记流,并将其转换为表示(通常)由原始文本表示的程序的抽象语法树。

上次我查了一下,关于这个主题的最好的书是“编译器:原理、技术和工具”,通常被称为“龙之书”。

于 2008-12-19T09:25:14.193 回答
23

例子:

int x = 1;

词法分析器或标记器会将其拆分为标记“int”、“x”、“=”、“1”、“;”。

解析器将获取这些标记并以某种方式使用它们来理解:

  • 我们有一个声明
  • 这是一个整数的定义
  • 整数称为“x”
  • 'x' 应该用值 1 初始化
于 2009-03-26T17:37:37.983 回答
5

我会说词法分析器和标记器基本上是同一件事,它们将文本分解成其组成部分(“标记”)。然后解析器使用语法解释标记。

不过,我不会太拘泥于精确的术语用法——人们经常使用“解析”来描述解释一段文本的任何动作。

于 2008-12-19T09:25:41.900 回答
2

添加到给定的答案

  • Tokenizer 还将删除所有评论,并且只将标记返回给 Lexer。
  • Lexer 还将定义这些标记(变量/函数)的范围
  • 然后解析器将构建代码/程序结构
于 2017-03-09T12:09:28.500 回答