编译原理-词法语法理论


编译原理-词法语法理论

第二章创建一个简单的语法指导器里面设计了很多理论知识,暂时只记录关键概念。这一章看的很困,外面阳光明媚,只能通过打字来压制一下困意😂😂😂

关键概念

  • 语法制导翻译器
    语法制导翻译器是用于构建语法翻译器的程序

  • 语法的定义

一种用于描述程序设计语言语法的表示方法 - “上下文无关文法”,这种文法用于前端编译器

  • 语法分析器

语法分析是决定如何通过一个文法生成一个终结符号的过程。语法分析有两个过程,分别是自顶向下自底向上两种方法,指的是语法分析对语法分析的构造顺序。

词法分析器

词法分析是编译的第一个阶段.主要是将输入的源代码生成一个词法单元序列,每个词法单元对应一个词素

如下图所示:
@TODO

词法分析器还会完成一些辅助功能例如过滤空白字符、记录源代码行号

词素的识别

源代码是由不同的字符组成的,在进行编译时首先要将输入的字符串进行拆分,拆分成为不同的词素。

对于无法识别成为词素的字符,其实可以通过变化字符来进行匹配,但是这种方案代价太高,不值得使用。我赞同这种观点,编译器的功能就是编译代码而不是尝试对代码进行修复,也是单一职责的表现

  • 加载源代码是否会使用完缓冲区?.
    不会,词素只需要根据前后一两个字符就可以确定了,因此只需要数千个字节就可以完成这个工作了.

  • 如何鉴定语言的保留字?
    通过在初始化时将各个保留字填入符号表中,符号表会标识这些保留字不是普通的标识符,并且会指向他们说代表的词法单元去

词素识别工具

  • Lex/Yacc

Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Scanner)的C源码。扫描器是一种识别文本中的词汇模式的程序。 这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义。一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记。 当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。 它一次读入一个输入字符,直到找到一个匹配的模式。 如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。 另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息。

也就是通过Lex来生成一个’正则表达式’,并进行后续操作

语法分析器

下图所示的是语法分析器在编译器中的过程
@TODO

小结

这一章主要是关于前端编译器的两个部分’词法分析器’和’语法分析器’的一些理论知识的介绍

参考资料

Lex和Yacc


  TOC