寻找“分词器”,“分析器”和“词法分析器”是什么以及它们如何相互关联和使用的明确定义?

我正在寻找“tokenizer”,“parser”和“lexer”是什么以及它们是如何相互关联(例如,parsing器使用标记器,反之亦然)的明确定义? 我需要创build一个程序将通过c / h源文件来提取数据的声明和定义。

我一直在寻找例子,可以find一些信息,但我真的很努力地掌握像语法规则,分析树和抽象语法树,以及它们是如何相互关联的基本概念。 最终,这些概念需要存储在一个实际的程序中,但是1)它们看起来像什么,2)是否有常见的实现。

我一直在维基百科关于Lex和Yacc这些主题和程序,但从来没有经历过一个编译器类(EE专业)我发现很难完全理解是怎么回事。

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

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

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

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

例:

int x = 1; 

词法分析器或分词器将其分成“int”,“x”,“=”,“1”,“;”。

parsing器将采用这些令牌并以某种方式使用它们来理解:

  • 我们有一个声明
  • 这是一个整数的定义
  • 该整数被称为“x”
  • 'x'应该初始化为1

我会说一个词法分析器和一个分词器基本上是一样的东西,他们把文本分解成它的组成部分('令牌')。 parsing器然后使用语法解释令牌。

尽pipe如此,我不会过多地使用精确的术语 – 人们通常使用“parsing”来描述解释一个文本块的任何动作。

增加给定的答案

  • Tokenizer 将删除任何评论,只返回给Lexer 令牌
  • Lexer还将定义这些令牌的范围(variables/函数)
  • parsing器然后将构build代码/程序结构