寻找什么是“ tokenizer”、“ parser”和“ lexers”以及它们如何相互关联和使用的清晰定义?

我正在寻找“ tokenizer”、“ parser”和“ lexer”的清晰定义,以及它们之间的关系(例如,解析器是否使用 tokenizer 或反之亦然) ?我需要创建一个程序将通过 c/h 源文件提取数据声明和定义。

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

我一直在查看维基百科上关于 Lex 和 Yacc 等主题和程序的内容,但我从来没有经历过编译器类(EE 专业) ,我发现很难完全理解正在发生的事情。

43598 次浏览

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

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

语法分析器从 lexer 中获取令牌流,并将其转换为一个抽象语法树,表示由原始文本表示的(通常)程序。

据我所知,关于这个主题最好的书是 “编译器: 原则、技术和工具”,通常被称为“龙之书”。

我认为 lexer 和 tokenizer 基本上是一回事,它们将文本分解为它的组成部分(‘ tokens’)。然后,解析器使用语法解释标记。

不过,我不会太在意术语的精确用法——人们经常用“解析”来描述解释一大堆文本的任何行为。

例如:

int x = 1;

Lexer 或 tokeniser 会将其分解为标记‘ int’、‘ x’、‘ =’、‘1’、‘ ;’。

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

  • 我们要发表声明
  • 这是整数的定义
  • 这个整数叫做‘ x’
  • ‘ x’应该用值1初始化

(增加给定的答案)

  • Tokenizer 将 还有删除任何注释,并且只将 代币返回给 Lexer。
  • Lexer 将为这些标记(变量/函数)定义范围
  • 然后解析器将构建代码/程序结构