编译原理课程设计之第六章 语义分析
编译原理课程设计说明书--词法分析,语法分析,语义分析

编译原理课程设计说明书题目:编译器原型设计与开发院(系):计算机科学与工程学院专业:计算机科学与技术目录1 引言 (1)1.1 设计概述 (1)1.2 设计目标 (2)1.3 小组分工 (3)2 开发过程 (3)2.1 词法分析 (3)2.1.1 消除白空格以及注释 (3)2.1.2 词法分析 (6)2.2 .语法分析 (8)2.2.1 递归下降手工编码 (8)2.2.2 first集合的计算 (8)2.2.3 左递归消除 (9)2.2.4 selection表自动生成 (10)2.2.5 LL(1)手工编码 (11)2.3 语义分析 (11)2.3.1 表达式求值LR(1) (11)2.3.2 四元式 (13)3 测试过程 (14)4 总结 (19)5 参考文献 (20)6 代码附录 (20)1引言编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都配有不止一个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。
从功能上看,一个编译程序就是一个语言翻译程序。
语言翻译程序把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价程序。
一个编译程序的重要性体现在它使得多数计算机用户不必考虑与机器有关的繁琐细节,使程序员和程序设计专家独立于机器,这对于当今机器的数量和种类持续不断地增长的年代尤为重要。
编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。
将编译过程划分成词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段。
1.1设计概述编译原理程序结构框图词法分析词法分析是编译过程的第一个阶段。
这个阶段的任务是从左到右有一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。
这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符基友具体含义。
比如标识符是由字母字符开头,后跟字母、数字字符的字符序列组成的一种单词。
编译 第六章 语义分析

6.1 属性和属性文法
1 属性 定义 属性是编程语言结构的任意特性 属性的典型例子有:
– 变量的数据类型 – 表达式的值 – 存储器中变量的位置 – 程序的目标代码
2 属性文法
属性 属性直接与语言的文法符号相联系(终结 符和非终结符) 如果X 是一个文法符号,a 是X的一个属 性,那么我们把与X关联的 a 的值记作X.a
文法规则 E→T1+T2 E→T1 or T2 语义规则 T1.t=int AND T2.t=int T1.t=bool AND T2.t=bool
T→num T→true T→false
T.t :=int T.t :=bool T.t :=bool
可能出现在属性等式中的表达式类型 数值表达式、逻辑表达式以及一些其他 种类的表达式 If-then-else 表达式, case 或 switch表 达式 也可以是函数,函数的定义可以在别处 给出,作为属性文法的补充的定义。
type->float type.dtype=real varlist1->id,varlist2 id.dtype=varlist1.dtype varlist2.dtype =varlist1.dtype var-list->id id.dtype=varlist.dtype
dtype 属性是继承的
number2.val
number->digit
digit.val
{number.val=digit.val} number.val
digit.val
串 “345”的依赖图
number number number digit 5 digit
digit
3
编译原理课程设计之第六章 语义分析

mcy
2
语义分析的任务:
计算各类语法成分的语义信息(属性信息),一般将收集
的语义信息存放到相应的信息表中,在编译程序中符号 表是用来存放源程序中标示符相关属性(语义)信息的一 种信息表。 静态语义检查
类型检查:指类型相容问题的检查,如果操作符作用于不相容的操作数, 则编译器应该报错。 上下文有关问题的检查:当某个对象出现时,要求它必须在前面的某个 适当位置已经出现过。 唯一性检查:有时,要求某个对象只能被定义一次。 控制流检查:引起控制流从某个结构中跳转出来的语句,必须能够决定 控制流转向的目标地址。
(1)所采用的语法分析方法
(2)属性的计算次序。 语法分析方法都要求从左向右处理输入程 序,等价于要求属性能通过从左向右遍历 分析树进行赋值。
mcy
44
定义属性a1,...,ak 的一个属性文法是L-属性(Lattributed)文法,如果满足
mcy
37
num→digit
num.val=digit.val digit.base=num.base digit.val=0 digit.val=1 digit.val=7
digit→0 digit→1 ...... digit→7
mcy
38
digit→8
digit→9
if digit.base=8 then digit.val=error else digit.val= 8 if digit.base=8 then digit.val= error else digit.val 9
mcy
29
文法规则
语义规则 var-list.dtype = type.dtype type.dtype = integer type.dtype = real
编译原理课程设计语义

编译原理课程设计语义一、教学目标本课程旨在让学生掌握编译原理的基本概念、理论及其在实际编译器设计与实现中的应用。
通过本课程的学习,学生将能够:1.知识目标:–理解编译原理的基本概念,如文法、语法分析、语义分析、中间代码生成、目标代码生成等;–掌握编译器的主要组成部分及其作用;–了解编译器优化技术及其应用。
2.技能目标:–能够使用编译原理相关工具,如词法分析器、语法分析器、编译器生成器等;–能够独立完成简单编译器的设计与实现;–能够对编译器进行性能分析和优化。
3.情感态度价值观目标:–培养学生的抽象思维能力和问题解决能力;–培养学生对计算机科学领域的探索精神和创新意识;–培养学生对编译原理的兴趣,提高其对计算机科学的热情。
二、教学内容本课程的教学内容主要包括以下几个部分:1.编译原理基本概念:介绍编译器的基本概念、编译过程及编译器的主要组成部分;2.词法分析:讲解词法分析的基本方法、词法分析器的实现及其优化;3.语法分析:介绍语法分析的基本方法、语法分析器的实现及其优化;4.语义分析:讲解语义分析的基本方法、语义分析器的实现及其优化;5.中间代码生成:介绍中间代码生成的基本方法及其优化;6.目标代码生成:讲解目标代码生成的基本方法及其优化;7.编译器优化:介绍编译器优化技术及其应用。
三、教学方法为了提高教学效果,本课程将采用多种教学方法,如:1.讲授法:通过讲解编译原理的基本概念、理论及其应用,使学生掌握相关知识;2.讨论法:学生进行小组讨论,培养学生的思考能力和问题解决能力;3.案例分析法:分析实际编译器的设计与实现案例,使学生更好地理解编译原理;4.实验法:让学生动手实现简单编译器,提高学生的实践能力。
四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:《编译原理》(推荐使用国内外经典教材);2.参考书:提供相关领域的参考书籍,以便学生深入学习;3.多媒体资料:制作PPT、教学视频等,丰富教学手段;4.实验设备:提供计算机及相关软件,供学生进行实验和实践。
语义分析和语法制导翻译-编译原理-06-(二)

E.place:= E1.place; E.code:= E1.code
E.place:= id.place; E.code:= ' ' E.place:= num.val;E.code:= ' '
注释: || 表示代码序列的连接
T.type := „real‟ L1.in := L.in addtype( id.entry, L.in )
L → id
entry addtype
addtype( id.entry, L.in ) 单词 id 的属性(符号表入口)
在符号表中为变量填加类型信息
属性文法的作用
抽象描述语义处理的要求
习题
1. 下列文法是一个二进制数的文法。试根据 该文法,编写一个语法制导定义,描述由 S 生成的二进制数的数值计算。 S -> L . L L -> L B | B B -> 0 | 1 2. 参照下列表达式文法编写语法制导定义, 描述表达式的类型计算。要求在不同精度的 数的计算中,结果取精度高的类型。 E -> E + T | T T -> n.n | n
分析树和属性计算
S-属性定义:
仅包括综合属性
对于所有A
→ X1 X2 …Xn, 的属性
A的属性计算仅用X1…Xn
如:算术表达式求值的属性文法
L-属性定义:
其属性可用深度优先的顺序从左
至右计算
对于所有 Xi
A→X1 X2 … Xn
属性计算仅使用A X1 X2 … Xi-1 的属性
编译原理课件-语义分析

6.1 語義分析的任務和地位
程式設計語言的結構由上下文無關文法來描述 程式結構正確與否與該結構的上下文有關,如:
–變數的作用域問題 –同一作用域內同名變數的重複聲明問題 –運算式、賦值語句中的運算元的類型一致性問題
思考:
–設計上下文有關文法來描述語言中上下文有關的結構? –理論上可行,構造有困難,構造相應的分析程式更困難
1. 非塊結構語言的符號表組織
非塊結構語言:
–編寫的每一個可獨立編譯的程式單元是一個不含子模組的 單一模組
–模組中聲明的所有變數屬於整個模組
符號表組織
–無序線性表
• 屬性記錄按變數聲明/出現的先後順序填入表中 • 插入前都要進行檢索,若發現同名變數
–對顯式聲明的語言:錯誤 –對隱式聲明的語言:引用
其他遍
Wensheng Li BUPT @ 2008
兩方面的優點:
– 對語法分析程式來講降低了文法的複雜性 – 允許用更系統的方法對上下文有關的錯誤進行檢測和校正。
11的屬性 出現在符號表中的屬性種類,在一定程度上取決 於程式設計語言的性質。 符號表的典型形式:
重定位操作:
– “刪除”存放該塊中局部變數的子表 –這些變數的作用域局部於該塊,出了該塊後這些變數不能
再被引用。
21/94
Wensheng Li BUPT @ 2008
讀入數據,並進行排序的PASCAL程式
program sort (input,output); var a : array[0..10] of integer; x : integer; procedure readarray; var i : integer; begin for i:=1 to 9 do read(a[i]) end;
编译原理_ 语义分析_实验报告

编译原理实验三语义分析实验报告◆学院:数学与计算机科学技术学院◆专业:计算机科学与技术◆班级:级计算机班◆小组组员:姓名:学号:姓名:学号:姓名:学号:姓名:学号:实验题目一、实验目的要求学生用与实验2相同的语言,编制语义分析程序。
二、实验准备微机CPU主频1.3G以上,128M内存,安装好C语言,PASCAL语言,或C++。
三、实验时间13学时四、实验内容要求学生用与实验2相同的语言,编制语义分析程序。
定义该语言的语义成分,将语义分析程序编制成子程序,在实验2分析出各语法单位后,分析其含义,并将可执行语句或表达式翻译为四元式输出,并将错误信息输出。
实验报告必须包括设计的思路,以及测试报告(输入测试例子,输出结果)。
五、上交文档1.实验报告(书面);2.程序文件(通过网络提交)。
<program> ::= <block> .<block> ::= <const-decl> <var-decl> <proc-decl> <statement><const-decl> ::= const <const-assignment-list> ; | ε<const-assignment-list> ::= <ident> = <number>| <const-assignment-list> , <ident> = <number><var-decl> ::= var <ident-list> ; |ε<ident-list> ::= <ident> | <ident-list> , <ident><proc-decl> ::= <proc-decl> procedure <ident> ; <block> ; |ε<statement> ::= <ident> := <expression>| call <ident>| begin <statement-list> end| if <condition> then <statement>| while <condition> do <statement>|ε<statement-list> ::= <statement> | <statement-list> ; <statement><condition> ::= odd <expression> | <expression> <relation> <expression><relation> ::= = | <> | < | > | <= | >=<expression> ::= <term> | <adding-operator> <term>| <expression> <adding-operator> <term><adding-operator> ::= + | -<term> ::= <factor> | <term> <multiplying-operator> <factor><multiplying-operator> ::= * | /<factor> ::= <ident> | <number> | ( <expression> )注意:(1) "ε" 表示空串。
编译原理实验报告语义分析

编译原理实验报告语义分析实验名称:语义分析实验目的:1.掌握词法分析器生成的词法单元序列的构造;2.学会设计语法分析器,实现对程序的基本语法结构检查,并生成抽象语法树;3.学习语义规约的实现,实现对程序的语义分析和错误检查;4.熟悉语义分析向语法分析的接口。
实验原理:语义分析是编译过程的一个重要环节,它的主要任务是对生成的抽象语法树进行遍历,并验证程序的类型一致性、语义规则的正确性、错误的检查和恢复等。
语义分析的输入是由语法分析生成的抽象语法树,输出是继续优化的抽象语法树或中间代码,以供后续的中间代码生成等工作使用。
实验步骤:1.设计语法分析器,包括语法规则、优先级关系等;2.生成词法单元序列;3.构建语法分析器,进行语法分析,并生成抽象语法树;4.针对不同的语义规约,设计语义动作,实现对程序的语义分析和错误检查;5.完成语义分析器的构建和测试。
实验设备:1.计算机;2. 编程语言:C++/Java/Python等;3. 开发环境:Visual Studio/ Eclipse/PyCharm等。
实验结果:通过对语法分析生成的抽象语法树进行遍历,实现了对程序的语义分析和错误检查。
具体实现包括:1.类型检查:根据语义规约,对程序中的类型进行检查,包括变量的声明及使用、函数的调用、赋值语句的一致性等;2.作用域检查:检查变量的作用域和可见性等;3.错误检查:检测语义错误,如变量未声明、函数重复定义等;4.错误恢复:当检测到错误时,采取适当的错误恢复措施,如跳过错误的部分继续分析、提示错误信息等。
实验心得:本次实验主要学习了语义分析的原理和实现方法,深入了解了编译过程中各个环节的作用和关系。
通过实践操作,加深了对语法分析和语义分析的理解,提高了编程能力和解决问题的能力。
同时,实验过程中也遇到了一些挑战和困难,例如语义规约的设计和实现、错误检查和恢复等,但通过查阅资料和与同学讨论,最终解决了这些问题。
通过本次实验,我对编译原理和语义分析有了更深入的了解,并且对以后的学习和工作有了更好的准备。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mcy
13
文法规则 number1→number2 digit
语义规则 number1.val = number2.val*10 + digit.val
number→digit
number.val = digit.val
mcy
14
数345对应 的注释分析树
mcy
15
digit → 0 digit → 1 digit → 2 digit → 3 . . .
一个属性文法中所有的属性都是合成的,就 称作S-属性文法(S-attributed grammar)。
mcy
17
树遍历的合成属性的计算
从语法分析树角度看,如果一个节点(文法符 号)的某一属性其值由其子节点的属性值来计 算,则称该属性为合成属性。 给定由语法分析程序构造的分析树或语法树, S-属性文法的属性值可以通过对树进行简单的 自底向上或后序遍历来计算。这可以用以下递 归的属性赋值程序来表示:
课程内容
第一章
概论 第二章 词法分析 第三章上下文无关文法及分析 第四章自上而下的语法分析 第五章自下而上的语法分析 第六章语义分析 第七章运行时环境 第八章代码生成
mcy 1
第6章 语义分析
程序设计语言的语义分为静态语义和动态语义
两种。
静态语义是指在编译阶段能够检查的语义; 动态语义是指在目标程序运行阶段能够检查的语义。
产生式1
...
相关的属性等式
...
产生式n
相关的属性等式
mcy
8
例6.1: 如无符号数文法
number→number digit |digit
digit→0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
的val(十进制值)属性的属性文法如下:
mcy
9
数345对应 的分析树
mcy
39
在组合合成和继承属性的属性文法中, 如果合成属性依赖于继承属性(及其他 合成属性),但继承属性不依赖于任何 合成属性,那么就可能在分析树或语法 树的一遍遍历中计算所有的属性。
mcy
40
void CombinedEval (T: treenode); { for each child C of T do
mcy
29
文法规则
语义规则 var-list.dtype = type.dtype type.dtype = integer type.dtype = real
decl→type var-list type→int type→float
mcy
30
var-list1→id,var-list2
id.dtype = var-list1.dtype var-list2.dtype = var-list1.dtype
Xi.aj=fij(X0.a1,...,X0.ak,X1.a1,..., X1.ak,...,Xn.a1,...,Xn.ak)
fij是一个数学函数。 即产生式的语义规则是产生式中相关文法符号属性值的等式。
mcy
7
一般将属性文法写成表格形式,每个产生式 用相应语义规则列出,如下所示:
文法规则 语义规则
mcy
32
mcy
33
例6.4:文法:
based-num→num basechar
basechar →o | d
num→num digit | digit
digit→0|1|2|3|4|5|6|7|8|9
考虑其属性val(十进制值)的属性文法:
mcy
34
mcy
35
文法规则 based-num → num basechar basechar→o basechar→d
{for each child C of T do
compute all inherited attributes of C;
PreEval ( C );
}
mcy
28
例6.3:文法 decl→type var-list
type→int|float
var-list→id,var-list|id 考虑其属性dtype(数据类型)的属性文法:
var-list→id
id.dtype=var-list.dtype
mcy
31
考虑符号串float x,y的分析树:
decl type var-list float id , var-list
id
节点dtype属性的递归程序的伪代码如下: documents\006-06\节点dtype属性的计 算.doc
term→factor
factor→(exp) factor→number
term.val=factor.val
factor.val=exp.val factor.val=number.val
mcy
22
对于上述简单整型算术表达式属性文法,假 设表达式(34-3)*42语法分析的结果如下:
* 34 3 (34-3)*42 的抽象语法树 42
mcy
23
抽象语法树的定义如下:
typedef enum { Plus, Minus, Times } OpKind; typedef enum { OpKind, ConstKind } ExpKind;
typedef struct streenode
{ ExpKind kind; OpKind op; struct streenode *lchild, *rchild; int val;
compute all inherited attributes of C;
CombinedEval ( C ); compute all synthesized attributes of T; }
mcy
41
5. 属性计算方法
1)
树遍历的属性计算方法 假设语法树已经建立起了,并且树中已 带有终结符的合成属性。然后以某种次 序遍历语法树,直至计算出所有属性。 如果需要的话,可使用多次遍历(或称 遍)。
(1)所采用的语法分析方法
(2)属性的计算次序。 语法分析方法都要求从左向右处理输入程 序,等价于要求属性能通过从左向右遍历 分析树进行赋值。
mcy
44
定义属性a1,...,ak 的一个属性文法是L-属性(Lattributed)文法,如果满足
mcy
18
void PostEval (T: treenode); { for each child C of T do PostEval (C); compute all synthesized attributes of T; }
mcy
19
例6.2:简单整型算术表达式文法 exp→exp+term|exp-term|term term→term*factor|factor factor→(exp)|number 的val(十进制值)属性的属性文法如下
34 val=34
3 val=3
mcy
26
4. 继承属性
从语法分析树角度看,一个节点的某一属性 值是由父结点和/或兄弟结点的属性值来计算, 则该属性称为继承属性。 继承属性的计算可以通过对分析树或语法树 的前序遍历或前序和中序遍历的组合来进行, 用伪代码表示:mcy Nhomakorabea27
void PreEval(T: treenode);
语法制导语义是对上下文无关文法的推广,其中
每个文法符号(终结符号或非终结符号)都有一个相关的 属性集(语义信息)。 每个产生式都有一个相关的语义规则集合。
如果X是一个文法符号,a是X的一个属性,那么我 们把与X关联的属性a的值记作X.a。
mcy
6
2.属性文法的定义
对于上下文无关文法中的任一产生式X0→X1X2...Xn,属性集 合a1,...,ak的属性文法是文法所有产生式的语义规则的集合。 其语义规则定义如下:
mcy
2
语义分析的任务:
计算各类语法成分的语义信息(属性信息),一般将收集
的语义信息存放到相应的信息表中,在编译程序中符号 表是用来存放源程序中标示符相关属性(语义)信息的一 种信息表。 静态语义检查
类型检查:指类型相容问题的检查,如果操作符作用于不相容的操作数, 则编译器应该报错。 上下文有关问题的检查:当某个对象出现时,要求它必须在前面的某个 适当位置已经出现过。 唯一性检查:有时,要求某个对象只能被定义一次。 控制流检查:引起控制流从某个结构中跳转出来的语句,必须能够决定 控制流转向的目标地址。
mcy
3
6.1 属性和属性文法 6.2 符号表 6.3 数据类型和类型检查
文法符号语 义信息的计 算技术 语义分析 的两个主 要方面
mcy
4
6.1 属性和属性文法
至今没有形式化的系统来描述语义,但存在一种 语法制导语义,将语义信息和程序设计语言的语 法结构联系起来。
mcy
5
1.语法制导语义的原理
digit.val = 0 digit.val = 1 digit.val = 2 digit.val = 3 . . .
mcy
16
3. 合成属性 一个属性a是合成(综合)的,如果给定一个 产生式A→X1X2...Xn,相关属性等式有以下 形式: A.a=f(X1.a1,…,X1.ak,...,Xn .a1,…,Xn.ak)
语义规则 based-num.val=num.val num.base=basechar.base basechar.base=8 basechar.base=10
mcy
36
num1→num2 digit
if digit.val=error or num2.val=error then num1.val = error else num1.val =num2.val*num1.base+digit.val num2.base=num1.base digit.base=num1.base