自下而上语法分析方法的基本思想是:从待输入的符号串开始,利用文法的规则步步向上进行规约,试图规约到文法的开始符号。
素短语的概念:设有文法G[S],其句型的素短语是一个短语,它至少包含一个终结符,并除自身外不包含其他素短语,最左边的素短语成为最左素短语。 已知文法G[T]:T →t|e|(F) F →T+F|T
(1)给出句型((t)+T)的短语、直接短语、句柄、素短语和最左素短语——画出语法分析树 (2)构造该文法的算符优先关系表 (3)判断该文法是否是算符优先文法 (4)给出对输入串(t+e)的分析过程
语法制导翻译:语法分析与语义分析穿插进行,语法分析引导语义分析
设有文法G[S]:S→(L)|a L→L,S|S给此文法配上语义规则(即语法制导定义),输出配对括号的个数,如对句子(a,(a,a)),输出是2
采用自下而上进行归约的方式进行语法分析
步骤
1、拓广文法
S’ →S S →(L) S →a L →L1,S L →S
2、引进语义变量
为每个文法符号添加一个属性“num”,用于记录归约得到该符号时已经配对的括号数
3、设计语义动作 4、形成语法制导定义
L →S L.num=S.num L →L1,S L.num=L1.num+S.num S →a S.num=0 S →(L) S.num=L.num+1 S’ →S Print(S.num)
符号表的信息将在词法分析、语法分析、语义分析、存储分配等过程中陆续填入。符号表的使用有时会延续到目标的运行阶段。
主要作用:检查语义的正确性 辅助生成代码 ”标识符“与”名字“有何区别?
答:在程序设计语言中,一般以字母开头的字母数字序列(有限个字符)都是标识符。当给予某个标志符确切的含义后,该标识符就叫做一个名字。标识符是一个没有意义的字符序列,而名字却有确切的含义,一个名字代表一个存储单元,该存储单元的内容为该名字的值,同时名字还有属性(即类型和作用域等)。例如area,作为标识符,它没有任何意义,但作为名字,可以表示变量名、函数名等。
符号表的总体组织:把属性完全相同的符号组织在一起;把各种符号都组织在一张表中;以上两种情况的折中
符号表的数据结构:线性、树、散列表 符号表的组织:名字栏、信息栏
运行阶段的存储组织与分配的方案:静态存储分配、动态存储分配[栈式、堆式(delete、new)] 代码优化的原则:等价原则、有效原则、合算原则 优化涉及范围:局部优化、循环优化、全局优化
基本块:程序中一个顺序执行的语句序列,其中只有一个入口和一个出口,入口就是第一个语句,出口就是最后一个语句。对一个基本块来说,执行时只能从其入口进入,从其出口退出。 划分基本块的算法:
求入口语句:程序的第一个语句;能由条件转移语句或无条件转移语句转移到的语句;紧跟在条件转移语句后的语句
对以上求出的每一入口语句构造其所属的基本块,它是由该入口语句到另一入口语句(不包括该入口语句),或到一转移语句(包括该转移语句),或到一停语句(包括该停语句)之间的语句序列组成的。
凡未被纳入某一基本块的语句,都是无效语句,将其删除。
基本块内可进行的优化:删除公共子表达式、删除无用代码、复写传播、合并已知常量 循环优化:强度削减、代码外提、删除归纳变量
可以从哪些层次上对程序进行优化?
答:为获得更优化的程序,可以从各个环节着手。
(1)在源程序级。选择适当的算法和安排适当的实现语句来提高程序的效率。 (2)在中间代码的设计上。考虑产生更高效的中间代码。 (3)在代码优化级。安排专门的优化阶段,进行各种等价变换。 (4)在目标代码级。考虑如何有效地利用寄存器,如何选择指令。