[编译原理读书笔记][第2章 一个简单的语法制导程序]

本文详细介绍了编译原理中的语法制导程序,包括文法定义、语法分析树、语法指导翻译、词法分析和中间代码生成。重点讲解了文法的推导、二义性、运算符结合性和优先级,以及如何通过语法制导翻译器将中缀表达式转化为后缀表达式。此外,还探讨了如何设计词法分析器,实现符号表管理,并介绍了静态检查和三地址码在中间代码生成中的应用。
摘要由CSDN通过智能技术生成

[编译原理读书笔记][第2章 一个简单的语法制导程序]

标签(空格分隔): 未分类


本章内容是对本书第3章至第六章中介绍的编译技术的综合介绍.
- 通过将一个语句转换为三地址代码的过程来讲解
- 重点是:词法分析,语法分析和中间代码生成.
- 第7章,第8章将讲述如何将三地址代码转换为机器指令

2.1 引言

  • 2.2:给出一个广泛使用的表示方法来描述语法,叫做上下文无关法或者BNF(Backus-Naur范式).

  • 2.3:面向文法的编译技术:语法指导翻译

  • 2.4:语法分析

  • 2.5:一个中缀转后缀的过程

  • 2.6:词法分析

  • 2.8:构造语法树

2.2 语法定义

介绍一种用于描述程序设计语言语法的表示方法—"上下文无关法"或简称文法.被用于组织编译器前端.

  • 何为上下文无关文法?

    • V 总可以被字符w 自由替换,而无需考虑字符V出现的上下文
  • Java的if-else

    image_1b0314h07lc21a3l1fhp1hq4qsd9.png-6.5kB

  • 文法

    image_1b031klcn15romi0s9c1gdr1hfam.png-57.7kB

2.2.1 文法定义

一个上下文无关法(context-free grammar)由4个元素组成:

  • 一个终结符号集合,有时也称做”词法单元”.
  • 一个非终结符号集合,有时也称做”语法变量”
    • 每个非终结符号表示一个终结符号串的结合.(后面介绍)
  • 一个产生式集合:表示某个构造的某种书写形式.
    • 产生式头或左部: 非终结符号 .
    • 一个箭头
    • 产生式体或右部: 终结符号与非终结符号组成的序列
    • 如果产生式头代表一个构造,那么产生式体代表该构造的一种书写形式.
  • 指定一个非终结符号为开始符号

2.2.2 推导

根据文法推倒符号串时.首先从开始符号出发,不断地将某个非终结符号替换为该非终结符号的某个产生式的体.直到全部为终结符号.

  • 可以从开始符号推倒得到的所有终结符号串的集合称为该文法定义的语言.

语法分析的任务

  • parsing的任务是: 接受一个终结符号串作为输入,找出从文法的开始符号推倒出该串的方法.

  • 如果不能推倒出,则报告语法错误.

  • 主要语法分析方法,在第四章中介绍

2.2.3 语法分析树

语法分析树用图形方法展现了从文法的开始符号推倒出对应语言中的符号串的过程.

image_1b0amdp20k8v13uaocb4q9mhj9.png-34.9kB

parse tree有以下性质

  • 根节点的标号为文法的开始字符.
  • 叶子节点为一个终结符号或 e
  • 内部节点为一个非终结符号
  • 如果非终结符号A它的子节点从左至右有X1,X2..XN,那么必然有产生式A->X1X2X3..XN.

例子

文法:

image_1b0amsage11291nvp1feg1b7t1varm.png-16kB

需要推倒的语句: 9 - 5 + 2

语法树:

image_1b0an8nfo1fr615s7108ocg017s313.png-10.7kB

一个文法的语言的另一个定义是任何能够由某颗语法分析树生成的符号串的集合.

为一个给点的终结符号串构建一颗语法分析树的过程称为对该符号穿进行语法分析

2.2.4 二义性

某些语法如果不严谨会产生二义性.比如将上述例子的语法改成

image_1b0anioej1op51p8a1apn1ml4g001g.png-10.9kB

那么对之前的终结符号串的解释可以用两种语法树

image_1b0anjlan104n1c762hk1io340o1t.png-24kB

前者的结果是6, 后者是2

显然有问题.所以一个好的文法不应该有二义性.

2.2.5 运算符结合性

  • 左结合运算向左下端延伸
  • 右结合运算向右下端延伸

image_1b0aoacvd4pi5tl1coe1ik91bgv2a.png-31kB

等号的文法:

image_1b0aoasea7a4mtbbc714ppari2n.png-6.9kB

2.2.6 运算符的优先级

结合性规则只能作用于同一级别的运算

当具有+,-,*,\,(,)时的文法

image_1b0aoq9lp1i15lguqvkck9ikh34.png-131.1kB

  • factor不可被分开.
  • 一个(不是因子)的term可能被高优先级的运算符*/分开
  • 一个expr可以被任意优先级分开
  • 根据这种思想,我们可以用多个非终结字符来确定n个优先级的语法.

image_1b0aqplnf1ji662l1qq5gm51jqv3h.png-31.9kB

2.2.7 2.2节的练习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值