第3,4课 一个简单的语法制导翻译器
第四章语法制导的翻译
第四章语法制导的翻译在3.7节用Yacc写的例子中,我们看到一种有用的描述形式:语言结构的属性附加在代表语言结构的文法符号上,这些属性值由附加在文法产生式的语义动作来计算,这些语义动作在归约对应的产生式时进行计算,由此得到结果。
这种描述形式可用来描述编译器的语义分析,因此本章系统地研究这种称之为“语法制导下的语言翻译”的描述方法及其实现。
它的语义动作(有时称为语义规则)的计算可以产生代码、把信息存入符号表、显示出错信息、或完成其它工作。
语义规则的计算结果就是我们所要的记号流的翻译。
本章讨论语义规则和产生式相联系的两种方式:语法制导的定义和翻译方案。
语法制导定义是较抽象的翻译说明,它隐蔽了一些实现细节;而翻译方案陈述了一些实现细节,主要是指明了语义规则的计算次序。
在第五章说明语义检查和第七章描述中间代码生成时,大量使用这两种方法。
本章还讨论语法制导定义和翻译方案的实现方法。
概念上的方法是,首先分析输入的记号串,建立分析树,然后从分析树得到描述结点属性间依赖关系的有向图,从这个依赖图得到语义规则的计算次序,然后进行计算,最终得到翻译的结果。
实际的实现并不需要按上面步骤逐步进行,本章将讨论几种不同限制下的实现方法。
4.1语法制导的定义语法制导的定义是上下文无关文法的推广,其中每个文法符号都有一个属性集合,它分成两个子集,分别叫做该文法符号的综合属性集合和继承属性集合。
如果我们把分析树上的结点看成是保存对应文法符号的属性的记录,那么属性对应记录的域。
属性可以表示任何东西:串、数、类型、内存单元,或其它想表示的东西。
分析树结点的属性值由该结点所用产生式的语义规则定义。
在语法制导定义中,我们把其中的文法称为基础文法。
本节介绍语法制导定义的形式及其概念上的实现模型。
4.1.1语法制导定义的形式在语法制导定义中,每个文法符号有一组属性,每个文法产生式A →α有一组形式为b := f (c1, c2, …, c k )的语义规则,其中f是函数,b和c1, c2, …, c k是该产生式的文法符号的属性,并且:(1)如果b是A的属性,c1 , c2, …, c k是产生式右部文法符号的属性或A的其它属性,那么b叫做文法符号A的综合属性。
语法翻译法的实施步骤 (2)
语法翻译法的实施步骤1. 简介语法翻译法是一种用于将一种程序设计语言转换为另一种程序设计语言的技术。
它通过将源语言的语法规则映射到目标语言的语法规则,实现源语言程序到目标语言程序的转换。
本文将介绍实施语法翻译法的具体步骤。
2. 步骤以下是实施语法翻译法的一般步骤:步骤1: 确定源语言和目标语言在开始进行语法翻译的过程中,首先需要确定源语言和目标语言。
源语言是我们要转换的程序设计语言,目标语言是将源语言转换成的语言。
确切地了解源语言和目标语言的语法规则和语义规则非常重要。
步骤2: 词法分析词法分析是将源程序分解为一个个的单词(Token)的过程。
在这一步骤中,我们需要编写一个词法分析器,它将源代码作为输入,并识别出其中的单词。
每个单词都包含一个词法类型和一个对应的字符串值。
示例:源代码: x = 5 * 2;词法分析输出:- 词法类型: 标识符,字符串值: x- 词法类型: 赋值运算符,字符串值: =- 词法类型: 数字,字符串值: 5- 词法类型: 运算符,字符串值: *- 词法类型: 数字,字符串值: 2- 词法类型: 分号,字符串值: ;步骤3: 语法分析语法分析是将词法分析器输出的单词流转换为语法树的过程。
在这一步骤中,我们需要编写一个语法分析器,它将识别源代码中的语法规则并生成一个语法树。
语法树用于表示程序的结构和层次关系。
示例:源代码: x = 5 * 2;语法树:=/ \\x */ \\5 2步骤4: 语法制导翻译语法制导翻译是基于语法树进行语法规则的翻译过程。
在这一步骤中,我们需要根据源语言和目标语言的语法规则,编写语法制导翻译器,它将遍历语法树并根据语法规则翻译每个节点。
示例:源代码: x = 5 * 2;目标语言: Python翻译结果: x = 5 * 2步骤5: 语义分析和翻译语义分析是对源代码进行静态语义检查的过程。
在这一步骤中,我们需要编写语义分析器,它将检查源代码是否符合源语言和目标语言的语义规则。
语法制导翻译1(BEST)
语法制导的翻译 语义分析的任务:语义分析的输入是语法分析的输出(分析树),输出是中间代码,但同时它还完成了很多语义处理工作。
语义检查:如,类型、运算、维数、越界等。
语义处理:如,变量的存储分配、表达式的求值、语句的翻译(中间代码的生成)等。
总目标:生成等价的中间代码。
语义分析的主流技术:语法制导翻译技术。
4.1 语法制导的翻译静态语义分析通常包括:① 类型检查。
② 控制流检查。
控制流语句必须使控制转移到合法 的地方。
③ 一致性检查。
④ 相关名字检查。
有时,同一名字必须出现两次或 多次。
例如,Ada语言程序中,循环或程序块可以有一个名字,出现在这些结构的开头和结尾, 编译程序必须检查这两个地方用的名字是相同的。
⑤ 名字的作用域分析语法制导的翻译动态语义处理:如果静态语义正确,语义处理则要执行真正的翻译,即,或者将源程序翻译成程序的一种中间表示形式(中间代码),或者将源程序翻译成目标代码。
语法制导的翻译 语义动作的计算是在对应产生式被归约时进行。
语义规则和产生式相联系的两种方式 语法制导定义 对应每一个产生式编制一个语义子程序,当一个产生式获得匹配时,调用相应的语义子程序实现语义检查与翻译。
语法制导的翻译方案 在产生式的右部的适当位置,插入相应的语义动作,按照分析的进程,执行遇到的语义动作。
4.1 语法制导的定义例 简单台式计算器的语法制导定义产 生 式 语 义 规 则 L → E nprint (E .val ) E → E 1 + TE .val := E 1 .val + T.val E → TE .val := T.val T → T 1 * FT.val := T 1.val * F.val T → FT.val := F.val F → (E )F.val := E.val F → digit F.va l := digit .lexval 属性文法(也称属性翻译文法) K nuth在1968年提出 在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性)。
语法制导的翻译
E2
E2=E1*c
二、其它语法成分的逆波兰表示:
1.赋值语句:
<左部>:=<表达式>
把‘:=’看成一个运算符号——赋值运算,它为一特殊的双目运算,则对应的逆波兰表示为:
<左部> <表达式的逆波兰表示> :=
例:x:=100
逆波兰表示为:
x100 :=
x:=a*b+c/d
逆波兰表示为:
xab*cd/+:=
例
(1)递归子程序法的代码生成 (2)利用优先矩阵的语法分析直接生成目标代码 (3)利用逆波兰算法进行语法、语义分析
(1)语法分析-语义分析: 直接生成目标代码 优点:编译相对简单,时间效率高 缺点:空间代价较高 (2)语法分析--中间代码-优化-目标代码
后缀表示法与前缀表示法及中缀表示法相比较,其共同的特点是:
(1)运算符的个数不变 ;
(2)运算量的次序和个数不变。
在计算机处理过程中可以用一个栈 (硬件或软件栈) 来计算它的值。一般的计算过程是:自左向右扫描后缀式,每逢遇到运算量就令其入栈; 遇到K目运算符,则将它作用于栈顶的K个项,并用运算结果代替这K个项。
(+ , T1 , T2 , T)
例2.-(a*b-c)
(* , a , b , T1)
(- , T1 , c , T2)
(@ , T2 , / , T)
@表示单目运算减
赋值语句的四元式:
把赋值看成一种运算,<分量2 >为空
例1:x:=10
(:= , 10, / , x)
例2:x:= -(a*b-c)
7.2 两种编译流程
例如有如下表达式: a+b a+b*c (a+b)*c
语法制导翻译技术
t中是类型值
Id n
n中变量名
填表动作符号也可带有属性:
@set_table↓t1 , n1
↓t1,n1
<变量表> ↓t 2
↓t2
可从前面得到称为继承属性, 继承前面的值
同上
属性翻译文法: 1.<说明> → Typet idn @set_table↓t1,n1 <变量表> ↓t2 2.<变量表> ↓t2 → ,id n @set_table↓t1,n1 <变量表>↓t3 3.< 变量表 > ↓t1 → ε
用相应的翻译文法推导,可得: E T T*F@* F*F@* (E)*F@*
(E+T@+)*F@* * (i@i+i@i @+)*i@i@*
(i@i+i@i @+)*i@i@*
活动序列:由翻译文法推导出的符号串,由终结符和动作 符号组成。 ●从活动序列中,抽去动作符号则得输入序列(i+i)*i ●从活动序列中,抽去输入序列,则得动作序列,执行动
5.1 翻译文法和语法制导翻译
有上下无关文法G[E]:
1. E →E+T
4. T →F
2. E →T
5. F →(E)
3. T →T*F
6. F →I
此文法是一个中缀算术表达式文法
翻译的任务是: 中缀表达式 逆波兰表示 a+b*c abc*+
假如我们的翻译任务是要将中缀表达式简单变换为波兰后 缀表示,只需在上述文法中插入相应的动作符号。
翻译文法所定义的翻译是由输入序列和动作序列组成的对偶集 如:(i+i)*i, @i@i@+@i@* →ii+i*
第5课 词法分析、符号表、中间代码生成
符号表
符号表的每个条目中包含与一个标识符相关的
信息,比如它的字符串、类型、存储位置等。 为每个作用域设置一个符号表
block
‘{’ decls stmts ‘}’
1) { int x1 ; int y1 ; 2) { int w2 ; bool y2 ; int z2 ; 3) …w2…; …x1…; …y2…; …z2…; 4) } 5) …w0…; …x1…; …y1…; 6) }
第二章 一个简单的语法制导翻译器
符号表
符号表的每个条目中包含与一个标识符相关的
信息,比如它的字符串、类型、存储位置等。 为每个作用域设置一个符号表
block
‘{’ decls stmts ‘}’
B1 : x y B2 : w y z int bool int
B0 : w
…
1) { int x1 ; int y1 ; 2) { int w2 ; bool y2 ; int z2 ; 3) …w2…; …x1…; …y2…; …z2…; 4) } 5) …w0…; …x1…; …y1…; 6) }
public void put(String s, Symbol sym) { table.put(s, sym); }
public Symbol get(String s) { for(Env e = this; e != null; e = e.prev ) { Symbol found = (Symbol)(e.table.get(s)); if( found != null ) return found; } return null; } }
第二章 一个简单的语法制导翻译器
符号表
语法制导翻译和中间代码生成
例如:
产生式 语义子程序 (0)S` E {PRINT E•VAL} (1)E E (1)+E(2) {E•VAL= E (1) •VAL +E(2) •VAL } (2)E E (1)*E(2) {E•VAL= E (1) •VAL *E(2) •VAL } (3)E (E (1)) {E•VAL= E (1) •VAL } (4)E i {E•VAL= LEXVAL } 注:LEXVAL指的是词法分析送来的机内二进制整数
3、后缀表示式(逆波兰表达式) Operand1 Operand2 Operator 4、树形表示法
注:常用中间代码表示法是四元式。
赋值语句的翻译
仅含简单变量的表达式的赋值语句的翻译 1、赋值语句的文法 A i=E E E+E|E*E|-E|(E)|i 2、需要的语义过程 NEWTEMP函数:每次调用送回一个代表新临时 变量的序号,可认为是送回T1 、 T2这样的一些 临时变量 ENTRY(i)函数:用于查变量i的符号表入口地址
2、实例:对布尔式X+Y>Z∨A∧(┐B∨C)进行翻译: 解:语法制导得翻译是在语法分析的过程中进行的,若利
用G(B)文法的LR分析表对上句进行LR分析,在其过程中 进行语义分析;则得到的四元式序列是:
(+,X,Y,T1) ;E+E进行归约,识别了算术运算 (>, T1,Z, T2) ; E >E进行归约,识别了关系运算 (┐,B,_, T3) ; ┐E归约 (∨, T3,C, T4) ; E∨E进行归约 (∧,A, T4,T5) ; E∧E进行归约 (∨, T2, T5, T6) ; E∨E进行归约
四、常见的中间代码形式 1、四元式形式: (Operator,Operand1,Operand2,Result) 注: 1) Operand1,Operand2,Result 可能是用户自定 义的变量,也可能是编译时引进的变量。 这里 Operator是双目运算符,若只有一个运算量,则 是单目运算符。
编译原理(龙书)习题答案(chap2-3)
状态
a
b
-A{0}
B
A
B{0,1}
B
C
C{0,2}
B
D
+D{0,3}
E
D
+E{0,1,3} E
F
+F{0,2,3} E
D
DFA的状态图:
1) a(a | b) * a
以a开头和结尾且至少包含两个字符的a,b字符串的集合
2) (( | a)b*)*
由a和b组成的任意字符串的集合
3) (a | b)*a(a | b)(a | b)
倒数第三个字符为a的任意的a,b字符串的集合
4) a*ba*ba*ba*
包含3个b的a,b字符串的集合
5)(aa | bb)*((ab | ba)(aa | bb)*(ab | ba)(aa | bb)*)*
由相同数目的a和b组成的字符串的集合,或者空串
5) S a | S S | S S | S| ( S )
以a为变量,包括+,连接,*和括号四种运算的表 达式的集合
2.2.3 练习2.2.2中哪些文法具有二义性? 3) 4) 5)具有二义性。 以5)为例进行说明: 给定字符串 a+a+a ,对应着两棵分析树:
DFA的转换表:
状态
ห้องสมุดไป่ตู้
a
b
+A{0,1,2,3,5,6,7,9,10,11} B
C
+B{1,2,3,4,5,6,7,9,10,11} B
C
+C{1,2,3,5,6,7,8,9,10,11} B
C
DFA的状态图:
4) (a | b)*abb(a | b)*
2017年中国科学技术大学0812计算机科学与技术考研专业目录及考试科目
2017年中国科学技术大学0812计算机科学与技术考研专业目录及考试科目一、报考说明:接收推免生及统考生。
二、专业介绍:本学科培养学生德、智、体全面发展,适合于在高等学校、科研机构、企事业单位从事计算机系统结构相关领域的教学、科研和应用开发等工作的高层次专门人才。
掌握计算机学科方面坚实的基础理论和系统的专门知识,了解本学科的发展方向及前沿动向,具备较强的综合运用所学理论知识从事科学研究工作和独立承担专门技术工作的能力,有严谨求实的科学作风和良好的科研道德,开拓进取的创新精神,团队合作和敬业精神。
熟练掌握一门外国语,能阅读本专业的外文资料并撰写专业领域外文文章。
具有较强的综合能力、语言表达能力及写作能力;具有健康的体魄和良好的心理素质。
本学科点具有计算机系统结构、计算机软件与理论、计算机应用技术以及信息安全4个二级学科。
相应的研究方向如下:1、计算机系统结构计算机系统结构是计算机科学技术最活跃的研究领域之一,特别是最近几年,随着高性能计算机的广泛研究和应用、计算机整体设计关键技术的突破、计算机网络体系结构的迅速发展,计算机系统结构的研究出现了新的热点和重大进展。
在微处理芯片体系结构方面主要研究新型微处理芯片体系结构及其编程技术,可重构的片上并行体系结构,通用微处理芯片设计技术,指令级并行关键技术和嵌入式系统整体设计方法,多处理器体系结构等;在计算机体系结构方面主要研究新型高效能并行计算机体系结构、模型及其关键技术,包括软件技术、超高扩展高密度计算技术、高可用集群中间件技术、可重构计算等,“并行结构-并行算法-并行编程”研究一体化;在网络及分布式计算方面主要研究新型网络体系结构和协议,网格计算平台及应用,对等网络、无线网络和移动计算等。
2、计算机软件与理论计算机软件与理论是指由计算机科学理论和研究、开发计算机软件所涉及的理论、方法、技术所构成的学科,是信息科学的核心研究领域之一,是计算机学科用来为国民经济、国防建设、人民生活服务的工具和基础。
编译原理 语法制导翻译
TinyC中的语法树
typedef enum {StmtK,ExpK} NodeKind; typedef enum {IfK,RepeatK,AssignK,ReadK,WriteK} StmtKind; typedef enum {OpK,ConstK,IdK} ExpKind; typedef enum {Void,Integer,Boolean} ExpType; #define MAXCHILDREN 3 typedef struct treeNode { struct treeNode * child[MAXCHILDREN]; struct treeNode * sibling; int lineno; NodeKind nodekind; union { StmtKind stmt; ExpKind exp;} kind; union { TokenType op; int val; char * name; } attr; ExpType type; /* for type checking of exps */ } TreeNode;
作为中间表示形式——分离分析与翻译
在进行语法分析的同时进行翻译存在缺
陷:
适合分析的文法可能未反映自然的语言结构 分析顺序可能与翻译顺序不一致
利用语法制导翻译方法来构造语法树
5.2.1 语法树
(抽象)语法树,压缩形式
关键字和运算符均在内部节点
链式结构会被压缩
语法树压缩例
digit.lexval:终结符只有综合属性,由词法分 析器提供 开始符号通常没有继承属性
5.1.2 综合属性
只有综合属性:S-属性定义
语法树自底向上计算属性
语法制导翻译
语法制导翻译
语法制导翻译是一种将源语言(通常为自然语言)的语法结构与目标语言的语法结构相对应的翻译方法。
它通过语法分析器和语法制导翻译器来实现。
在语法制导翻译中,源语言和目标语言的语法规则被定义成一个或多个上下文无关文法。
语法制导翻译的主要思想是在语法分析树中嵌入翻译动作,并通过语法制导翻译器将源语言转换为目标语言。
语法制导翻译器的主要任务是对每个语法分析树节点进行翻译动作的定义,并将这些翻译动作与语法分析器的分析过程相结合,最终生成目标语言的语法结构。
语法制导翻译是机器翻译领域的一种重要研究方向,它可以有效地解决自然语言翻译中的语言差异和歧义问题。
同时,它也是编译原理、计算机语言学等领域中的基础性问题。
第语法制导翻译演示文稿
第1页,共41页。
优选第语法制导翻译
第2页,共41页。
语义处理的功能
1 审查每个语法结构的静态语义,即验证语法结构合 法的程序是否真正有意义。 类型检查、控制流检查、一致性检查、上下文相关性 检查、名字的作用域分析
2 如果静态语义正确,语义处理则要执行真正的翻译, 即要么生成程序的中间代码表示,要么生成机器语言 或汇编语言的目标代码。 直接生成机器语言或汇编语言形式的目标代码的优点是 编译时间短且无需中间代码到目标代码的翻译,而中间 代码的优点是使编译结构在逻辑上更为简单明确,特别 是使目标代码的优化比较容易实现。
第4页,共41页。
语法制导翻译
在语法分析的每一步中,通过执行每个产生式所对 应的语义子程序(或语义规则描述的语义动作)进 行翻译的方法。
在语法分析过程中,当一个产生式获得匹配(对于 自顶向下分析)或用于归约(对于自底向上分析) 时,此产生式相应的语义子程序就进入工作,完成 既定的翻译任务。
分类
(5) L id
addtype(id.entry,L.in)
其中,T.type为综合属性,其值由声明中的关键字来确定;
L.in为继承属性,其值由分析树中左边的兄弟节点
或父节点的属性值计算得到。
第10页,共41页。
属性信息传递情况示意
第11页,共41页。
6.2 属性文法
属性文法
是一个语法制导定义,其中语义规则中的函数不能 有副作用。
一个动作不能引用这个动作右边符号的综合属性。
产生式左边非终结符号的综合属性只有在它所引用 的所有属性都计算出来以后才能计算。计算这种属 性的动作通常可放在产生式右端的未尾。
例如,下面的翻译模式不满足要求:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
弟节点上的属性值决定,则该属性为继承属性
第二章 一个简单的语法制导翻译器
后缀表达式(postfix notation):E
如何E是一个变量或常量,则E的后缀是本身 如果E是一个形如E1 op E2的表达式,op是二目运算
符,那么E的后缀表示是:E1‘ E2‘ op,这里E1‘ 和E2‘分 别是E1和E2的后缀表示 如果E是一个形如(E1)的表达式,则E的后缀表示就 是E1的后缀表示
每个产生式和一组语义
expr term term 0 term 1 … term 9
规则相关联
第二章 一个简单的语法制导翻译器
语法制导翻译
属性 综合属性
如果某个属性在语法分析树节点N上的值由N的子节点和N
本身的属性值确定,则该属性为综合属性
继承属性
如果某个属性由语法分析树中该节点本身、父节点以及兄
第3,4次课 一个简单的语法制导翻译器
2.3~2.5
中缀表达式转后缀表达式
本次课主要内容都是基于如何将中缀表达 式转换为后缀表达式 9 – 5 + 2 -> 95-2+
2.3语法制导翻译的定义
第二章 一个简单的语法制导翻译器
语法制导翻译:对语法树进行语义分析
例如:将中缀表达式转化成为后缀 9 - 5 + 2 95–2+
term.t = 5 5
term.t = 9
9
产生式
expr expr1 + term expr expr1 - term expr term term 0 term 1 … term 9
语义规则
expr.t = expr1.t || term.t || „+‟ expr.t = expr1.t || term.t || „-‟ expr.t = term.t term.t = „0‟ term.t = „1‟ … term.t = „9‟
语法制导定义 语法制导翻译方案
将程序片段附加到一个文法的各个产生式上的表示
法
rest + term { print ( „ + „ ) } rest1
被嵌入到产生式体中的程序片段成为语义动作(
semantic action)。语义动作用花括号括起来。
rest
+
term
{print(‗+‘)}
第二章 一个简单的语法制导翻译器
语法制导翻译:对语法树进行语义分析
语法制导定义 语法制导翻译方案
将程序片段附加到一个文法的各个产生式上的表示
法
rest + term { print ( „ + „ ) } rest1
第二章 一个简单的语法制导翻译器
语法制导翻译:对语法树进行语义分析
)
stmt
for
(
;
expr
stmt
;
expr
)
other
语法 分析树
stmt
输入
for
(
;
expr
stmt
;
expr
)
other
语法 分析树 输入
for
(
optexpr
;
optexpr
;
optexpr
)
stmt
for
(
;
expr
stmt
;
expr
)
other
语法 分析树 输入
for
(
optexpr
简单语法制导定义
每个产生式和一组语义
规则相关联
第二章 一个简单的语法制导翻译器
语法制导翻译
语法制导定义
expr.t = 95-2+ expr.t = 95expr.t = 9 + term.t = 2 2
(syntax-directed definition)
深度优先遍历
procedure visit ( node N) { for(从左到右遍历N的每个子节点C) { visit(C); } 按照节点N上的语义规则求值; }
总结
语法制导的定义 后缀表达式 语法制导的翻译方案
2.4语法分析
第二章 一个简单的语法制导翻译器
语法分析
决定如何使用一个文法生成一个终结符号串的
过程
给定输入:
终结符号串:9 文法:
list list + digit
–
5
+ 2
list list - digit
list
list list digit
digit
?
digit 9 - 5 + 2
第二章 一个简单的语法制导翻译器
语法制导翻译:对语法树进行语义分析
语法制导定义 语法制导翻译方案
第二章 一个简单的语法制导翻译器
语法制导翻译
语法制导定义
例子:9-5+2
expr.t = 95-2+ expr.t = 95expr.t = 9 + term.t = 2 2
的时候,只有一种非终结符可以生成这个输入符号,是确 定性的。 FIRST集合 令α是一个文法符号(终结符号或非终结符号)串, FIRST(α)是由α生成的一个或多个终结符号串的第一 个符号的集合。 如果α是ε或者可以生成ε ,那么ε也在FIRST(α)中
第二章 一个简单的语法制导翻译器
语法分析
自顶向下分析方法
一般来说,为一个非终结符号选择产生式是一个“
尝试并犯错”的过程 —— 回溯 预测语法分析法:不需要回溯
要求设计的文法满足:当考虑到一个输入符号(终结符)
的时候,只有一种非终结符可以生成这个输入符号,是确 定性的。 有两个产生式A α和Aβ,预测分析法要求 FIRST(α)和FIRST(β)不相交 如果输入符号在FIRST(α)中,就用A α,如果输入 符号在FIRST(β)中,就用A β
;
optexpr
;
optexpr
)
stmt
for
(
;
expr
;
expr
)
other
第二章 一个简单的语法制导翻译器
语法分析
自顶向下分析方法
一般来说,为一个非终结符号选择产生式是一个“
尝试并犯错”的过程 —— 回溯 预测语法分析法:不需要回溯
要求设计的文法满足:当考虑到一个输入符号(终结符)
(syntax-directed definition)
每个文法符号和一个属
term.t = 5 5
term.t = 9
9
产生式
expr expr1 + term expr expr1 - term
性集合相关联
例树中‖.t‖是属性
语义规则
expr.t = expr1.t || term.t || ‗+‘ expr.t = expr1.t || term.t || ‗-‘ expr.t = term.t term.t = ‗0‘ term.t = ‗1‘ … term.t = ‗9‘
第二章 一个简单的语法制导翻译器
语法分析
自顶向下分析方法
| | | optexpr | stmt expr ; if ( expr ) stmt for ( optexpr ; optexpr ; optexpr ) stmt other ε expr
输入是:for ( ; expr ; expr ) other stmt
term
5
{print(‗5‘)}
{print(‗9‘)} 翻译方案 expr expr1 + term expr expr1 – term expr term term 0 term 1 … term 9 {print(„9‟)} {print(„0‟)} {print(„1‟)} {print(„+‟)} {print(„-‟)}
list digit digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
输出:?
第二章 一个简单的语法制导翻译器
语法分析
决定如何使用一个文法生成一个终结符号串的
过程
给定输入:
终结符号串:9 文法:
list list + digit
后缀表达式
语义规则
expr.t = expr1.t || term.t || ‗+‘ expr.t = expr1.t || term.t || ‗-‘ expr.t = term.t term.t = ‗0‘ term.t = ‗1‘ … term.t = ‗9‘
性集合相关联
例树中‖.t‖是属性
语法分析
决定如何使用一个文法生成一个终结符号串的
过程
上下文无关文法
通常Parsing的时间复杂度是O(n3) 对于程序设计语言,时间复杂度是O(n)
自顶向下方法
自底向上方法
第二章 一个简单的语法制导翻译器
语法分析
自顶向下分析方法 例:给定文法:
stmt | | | expr if ( expr ) stmt for ( optexpr ; optexpr ; optexpr ) stmt other
每个文法符号和一个属
term.t = 5 5
term.t = 9
9
产生式
expr expr1 + term expr expr1 - term expr term term 0 term 1 … term 9