编译原理课程设计之第六章 语义分析

合集下载

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

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

编译原理课程设计说明书题目:编译器原型设计与开发院(系):计算机科学与工程学院专业:计算机科学与技术目录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-(二)

语义分析和语法制导翻译-编译原理-06-(二)
E.code := E1.code || gen(E.place':=0-'E1.place)
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.错误恢复:当检测到错误时,采取适当的错误恢复措施,如跳过错误的部分继续分析、提示错误信息等。

实验心得:本次实验主要学习了语义分析的原理和实现方法,深入了解了编译过程中各个环节的作用和关系。

通过实践操作,加深了对语法分析和语义分析的理解,提高了编程能力和解决问题的能力。

同时,实验过程中也遇到了一些挑战和困难,例如语义规约的设计和实现、错误检查和恢复等,但通过查阅资料和与同学讨论,最终解决了这些问题。

通过本次实验,我对编译原理和语义分析有了更深入的了解,并且对以后的学习和工作有了更好的准备。

编译原理第6章-语义分析

编译原理第6章-语义分析

Compiler Construction Principles & Implementation Techniques
College of Computer Science & Technology
6.2 符号表
• 什么是符号表 • 标识符的内部表示 • 类型的内部表示 • 值的内部表示 • 符号表的组织
-7-
College of Computer Science & Technology
基于Tokenlist的语义分析
int x,y; int f();
($int, -) ($id, x) ($comma, -) ($id, y) ($semi,-) ($int, -) ($id, f) ($lparen, -) ($rparen,-) ($semi,-)
• Off:当前函数是形参函数时,为其分配的地址偏移;
• Param: 指向当前函数的形式参数列表的指针;
• Code: 指向函数对应的目标代码的起始地址;
• Size: 目标代码的大小;
• Forward: 该声明为函数原型时取值 true,否则取值为false;
• 例:int f(int x, float*y, int inc()) { … }
6.1 语义分析概述
• 语法 vs.语义 • 静态语义 vs. 动态语义 • 语义错误 • 语义分析的一般过程
Compiler Construction Principles & Implementation Techniques
-2-
College of Computer Science & Technology
i : (0, 0) p: (0, 1) x : (0, 12) q: (0,…) main: (0,…)

编译原理_第6章__语义分析和中间代码生成

编译原理_第6章__语义分析和中间代码生成

非终结符T有一个综合属性type,其值为 int或float。语义规则L.in=T.type表示L.in的属性 值由相应说明语句指定的类型T.type决定;属 性L.in被确定后将随语法树的逐步生成而传递 到下边的有关结点使用,这种结点属性称为继 承属性。由此可见,标识符的类型可以通过继 承属性的复写规则来传递。 例如,对输入串int a,b,根据上述的语义 规则,可在其生成的语法树中看到用“→”表 示的属性传递情况,如图6–3所示。
直接生成目标代码 直接生成机器语言或汇编语言形式的目标 代码的优点是编译时间短且无需中间代码到目 标代码的翻译。 生成中间代码 生成中间代码的优点是使编译结构在逻辑 上更为简单明确,特别是使目标代码的优化比 较容易实现。
语义分析时语义检查的分类:
动态语义检查
需要生成相应的目标代码,它是在运行时进行的;
例如,简单算术表达式求值的属性文法如下: 规则 语义规则 (1) S→E print (E.val) (2) E→E(1)+T E.val=E(1).val+T.val (3) E→T E.val=T.val (4) T→T(1)*F T.val=T(1).val*F.val (5) T→T(1) T.val=T(1).val (6) F→(E) F.val=E.val (7) F→i F.val=i.lexval
6.1 概

6.1.1 语义分析的概念 一个源程序经过词法分析、语法分析之后,表 明该源程序在书写上是正确的,并且符合程序语言 所规定的语法。但是语法分析并未对程序内部的逻 辑含义加以分析,因此编译程序接下来的工作是语 义分析,即审查每个语法成分的静态语义。如果静 态语义正确,则生成与该语言成分等效的中间代码, 或者直接生成目标代码。

编译原理语义分析实验报告

编译原理语义分析实验报告

编译原理语义分析实验报告编译原理语义分析实验报告引言编译原理是计算机科学的重要基础课程之一,它主要研究如何将高级语言转换为低级语言,使计算机能够理解和执行人类可读的代码。

语义分析是编译过程中的重要环节,它负责对代码进行语义检查和语义解释,以确保代码的正确性和可执行性。

本实验报告旨在介绍编译原理中语义分析的基本原理和实验过程。

一、实验目的本次实验的主要目的是通过实现一个简单的语义分析器,加深对编译原理中语义分析的理解。

具体来说,我们将实现以下功能:1. 识别并解析变量声明和赋值语句;2. 检查变量的重复声明和赋值类型的一致性;3. 计算并输出表达式的值。

二、实验环境和工具为了完成本次实验,我们需要准备以下环境和工具:1. 操作系统:Windows、Linux或MacOS;2. 编程语言:C++、Java或Python;3. 开发工具:编译器和调试器。

三、实验原理语义分析是编译过程中的重要环节,它主要负责对代码进行语义检查和语义解释。

在编译器中,语义分析器通常通过构建抽象语法树(AST)来实现。

AST是一种树状的数据结构,用于表示代码的语法结构和语义信息。

在语义分析的过程中,我们需要进行变量声明和赋值语句的解析和检查。

首先,我们需要识别代码中的变量声明和赋值语句,并将其转换成AST。

在解析过程中,我们需要检查变量的重复声明和赋值类型的一致性。

如果发现错误,我们需要报告相应的错误信息,并终止编译过程。

接下来,我们需要对表达式进行求值。

表达式是编程语言中的核心概念,它由操作数和运算符组成。

在求值过程中,我们需要考虑运算符的优先级和结合性。

为了实现这一功能,我们可以使用递归下降法或者使用运算符优先级算法。

四、实验过程1. 识别变量声明和赋值语句我们首先需要编写词法分析器,将代码中的字符序列转换成标记序列。

在词法分析的过程中,我们需要识别变量声明和赋值语句的关键字和标识符,并将其转换成相应的标记。

2. 构建抽象语法树在词法分析的基础上,我们可以构建抽象语法树。

Compile6.7

Compile6.7

E
T 9 Print(9) R
-
T
Print(-)
+
R
T Print(+) R Print(2) 空
5
Print(5)
2
翻译方案的设计
• 对于综合属性,只需要把属性的定义修改称为赋值语句,放 在规则的最末尾就可以了。 • 存在继承属性的时候,必须满足一下条件: – 重写规则右部符号的属性必须先于这个符号的语义动作 中计算。 – 一个语义动作不能引用右边符号的综合属性。 – 重写规则左部的符号的综合属性必须在它所引用的所有 属性都计算完成之后才可以计算。 • 错误的例子:S::=A1A2 {A1.in=1, A2.in=2} A::=a {print(A.in)}.应该把{A1.in=1}移到最前面。 • L_属性定义总存在相应的翻译方案。
语法制导定义的例子
L::=En E::=E1+T E::=T T::=T1*F T::=F F::=(E) F::=digit Print(E.val) E.val = E1.val+T.val E.val = T.val T.val = T1.val*F.val T.val = F.val F.val = E.val F.val = digit.lexval
翻译方案
• 语法制导定义基于属性文法,其计算次序被隐藏。 • 如果在进行语义定义的时候,陈述了一些实现的细节,我 们称为翻译方案。 • 在翻译方案中,语义定义部分是用{}包含的语义动作。并 且语义动作可以出现在规则右部的任何地方。 • 这些语义动作的执行顺序是这样的。当建立了一个语法分 析树之后(把语义动作也当作规则右部的结点加入到语法 树中),我们按照深度优先的方法变例这个分析树。每次 遍历到一个语义动作对应的结点的时候,执行这个动作, 计算相应的属性值。 • L_属性定义是可以使用翻译方案计算的一类语义定义方式。

第六章(1)语义分析(Semantic Analysis)

第六章(1)语义分析(Semantic Analysis)
码生成时进行 ② 一般的语义检查:与语法分析相结合
17
方式二 独立一遍的语义分析的功能图示
语法分析树 TokenList
语义分析
语义定义
自然语言描述的规定
符号表 判定
18
类C语言的抽象语法树
程序Root
节点 Node1
节点 Node2 ……
节点 Noden
节点 Node
常量声明 类型声明 变量声明 函数声明
标识符的属性(续2)
存取方式 因为变量标识符代表的是一个内存单元或一段 连续的内存单元,根据这些内存单元中存放信息的类别 又可以把变量分为间接存取变量和直接存取变量。
如果变量标识符p所代表的内存单元中存放的是另一 个变量q对应的内存地址,则称变量p为间接存取变量; 如果变量标识符p所代表的内存单元中存放的是一个 值,则称变量p为直接存取变量。
形式语义描述技术没有形式语法描述技术成熟 硕士研究生的课程-《形式语义学》
11
语义分析的主要任务
根据声明部分建立符号表
符号表(symbol table):是一种供编译器用于保 存有关源程序的各种信息的数据结构。符号表的每 个条目中包含与一个标识符相关的信息,这些信息 全面地反映该名字的属性及它们在编译过程中的特 征。
① 自动(auto) ② 寄存器(register) ③ 静态(static) ④ 外部(extern)
自动变量(本函数内有效) 寄存器变量(本函数内有效) 形式参数(本函数内有效) 静态局部变量(函数内有效) 静态外部变量(本文件内有效)
30
作用域和可视性
通常,标识符的作用域都是通过它在程序中的位置隐 式说明的。
26
标识符的属性(续3) 程序区 静态存储区 动态存储区

编译原理compiler6语义分析

编译原理compiler6语义分析

◆语法制导定义是对上下文无关文法的推广
◆属性
综合属性 继承属性
◆依赖图 语义规则建立了属性之间的依赖关系,这
些关系可以用图来表示,这样的图称为依赖图。
4
6.1.1 语法制导定义的形式
在一个语法制导定义中,A→P都有与之相关
联的一套语义规则,规则形式为
b:= f(c1,c2,…,ck),
f是一个函数,而且
终极符则只能有综合属性,而不能有继承属性。
非终结符既可有综合属性也可有继承属性
1
图6.1 ห้องสมุดไป่ตู้法制导翻译的概观

输 入


义 规




号 串


的 计

一般来说,语义翻译可按图6.1 的流程处理。 实际上,编译中语义翻译的实现并不是按图6.1 的流 程处理的;而是随语法分析的进展,识别出一个语法 结构,就对它的语义进行分析和翻译。
19
6.2.2 建立表达式的语法树
建立表达式的语法树使用的函数
1. mknode(op,left,right) 建立一个运算符号结点,标 号是op,两个域left和right指向运算分量结点的指针。
2.mkleaf(id,entry) 建立一个标识符结点,由标号id标 识,一个域entry指向标识符符号表中相应的项。
val[ntop]:=val[top-2]*val[top]
val[ntop]:=val[top-1]
29
表6.5 输入串3*5+4n的语义分析过程
输入 state val
3*5+4n -
-
*5+4n 3
3

语义分析的应用编译原理

语义分析的应用编译原理

语义分析的应用编译原理1. 概述在编译原理中,语义分析是编译器的重要组成部分之一。

它负责对源代码的语法结构进行深层次的理解和分析,从而确定其含义和语义规则,并生成相应的语义表示。

语义分析的目标是确保程序的逻辑正确性和合理性。

本文将介绍语义分析的基本概念以及在编译原理中的应用。

2. 语义分析的基本概念2.1 语义语义指的是语言符号的含义或者某种形式的解释。

在编译原理中,语义可以分为静态语义和动态语义。

•静态语义是指程序在编译时期就能确定的语义,如类型检查、作用域分析等。

•动态语义是指程序在运行时期才能确定的语义,如变量的值、函数的执行结果等。

2.2 语义分析语义分析是编译器的重要阶段,其主要任务是对源代码进行合法性分析并生成对应的语义表示。

在语义分析阶段,编译器会对源代码进行词法分析和语法分析后,进一步对语法树进行遍历和分析,以确定代码的含义和规则。

3. 语义分析的应用语义分析在编译原理中起着至关重要的作用,它不仅能够帮助编译器检测程序中的错误,还能为后续的优化和代码生成阶段提供重要的信息。

下面是语义分析常见的应用场景。

3.1 类型检查类型检查是语义分析的核心内容之一。

它用于检查程序中各个表达式的类型是否匹配,并找出类型不匹配的错误。

在许多编程语言中,类型检查是编译器所必需的,以确保程序在运行时期不会出现类型错误。

3.2 作用域分析作用域分析是指确定程序中各个标识符的作用范围和可见性。

在编译阶段,编译器需要通过作用域分析来判断标识符的引用是否合法,并解析标识符的声明。

作用域分析还可以检测到未声明的变量和函数等错误。

3.3 常量折叠常量折叠是指在编译阶段将程序中的常量表达式计算出结果,并将结果替换原有的表达式。

常量折叠可以提高程序的执行效率,减少运行时期的计算量。

3.4 优化和代码生成语义分析阶段还可以提供重要的信息用于后续的优化和代码生成。

例如,通过语义分析可以判断一些表达式是否是冗余的,进而对其进行消除。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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
相关文档
最新文档