欢迎来到天天文库
浏览记录
ID:45661900
大小:201.50 KB
页数:12页
时间:2019-11-16
《《语法制导的翻译》PPT课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第七章语法制导的翻译7.1基本概念1.编译系统的两类翻译:非语法制导的翻译语法制导的翻译:以语法分析为主导的语义处理--在源程序的语法分析中嵌入语义处理。即,利用源程序的文法框架生成中间代码或目标代码。Tips:语义学:semanticslexemelexiconsemantic例(1)递归子程序法的代码生成(2)利用优先矩阵的语法分析直接生成目标代码(3)利用逆波兰算法进行语法、语义分析(1)语法分析-语义分析:直接生成目标代码优点:编译相对简单,时间效率高缺点:空间代价较高(2)语法分析--中间代码-优化-目标代码7.2两种编译流程例如有如下表达式:
2、a+ba+b*c(a+b)*c逆波兰表示ab+abc*+ab+c*可以看出后缀表示具备以下优点:(1)无括号,形式简单清楚;(2)运算符的顺序与表达式的运算次序相同;在具体处理过程中,可以从左到右检查表达式的各符号,遇到运算分量则保存,若遇到运算符,则取其前面的两个分量(双目运算)或一个分量(单目运算)进行处理。后缀表示法与前缀表示法及中缀表示法相比较,其共同的特点是:(1)运算符的个数不变;(2)运算量的次序和个数不变。在计算机处理过程中可以用一个栈(硬件或软件栈)来计算它的值。一般的计算过程是:自左向右扫描后缀式,每逢遇到运算量就令其入栈;遇到K
3、目运算符,则将它作用于栈顶的K个项,并用运算结果代替这K个项。实际计算时,每遇到一个K目运算符,与它有关的K个运算量已在栈顶,运行结果在原来的K个项从栈中移出后置于栈顶。例如:ab+c*的计值过程如下:1.a入栈;a2.b入栈;b3.将栈顶两项相加,移走栈顶的两个项,把和数E1置于栈顶E1E1=a+b4.c入栈.c5.将栈顶两项相乘,移走栈顶的两个项,把积E2置于栈顶;E2E2=E1*c二、其它语法成分的逆波兰表示:1.赋值语句:<左部>:=<表达式>把‘:=’看成一个运算符号——赋值运算,它为一特殊的双目运算,则对应的逆波兰表示为:<左部><表达式的逆
4、波兰表示>:=例:x:=100逆波兰表示为:x100:=x:=a*b+c/d逆波兰表示为:xab*cd/+:=在进行具体处理时,可以采用与表达式相似的方法,不同之处是进行运算时,栈中保存的是<左部>变量的地址,而不是它的直,最后的处理不是得到一个结果,而是进行赋值(将表达式的值送到指定的内存单元),所以,赋值工作完成后,应将栈顶两项(变量地址和表达式的值)退栈。2.转向语句:goto<标号>它对应的逆波兰表示为:<标号>LJLabelJump含义为转向某标号处,LJ可看成单目运算符,<标号>是LJ的运算分量例:goto100;100LJgotoLoop;
5、LoopLJ3.条件语句:在条件语句的逆波兰表示中,它是通过转向逆波兰式中的第几个符号去执行来实现,要转去的符号,用它的“序号”来表示:<序号>RJ<布尔表达式逆波兰式><序号>TJ<布尔表达式逆波兰式><序号>FJ无条件转向转向逆波兰式中的第<序号>个符号去执行,RJ为单目运算符号;布尔表达式值为真转序号处执行;布尔表达式值为假转序号处执行;对于条件语句:if<布尔表达式>then<语句1>else<语句2>可用以下的逆波兰式表示:<布尔表达式>的逆波兰式<序号1>FJ<语句1的逆波兰式><序号2>RJ<序号1>:<语句2的逆波兰式><序号2>:
6、……可以不分行书写而将它们写在一行中。<序号1>是指“<语句2>的逆波兰表示”中第一个单词的序号<序号1>是指条件语句的后继语句的逆波兰表示中第一个单词的序号例:有条件语句:ifa7、10end然后用条件语句和转向语句的逆波兰表示,将它表示成逆波兰式。其它形式的循环语句,也是首先展开成等价的条件语句表示,然后表示成逆波兰式。例如:fori:=1to100dos:=s+i先将其展开:i:=1;10:ifi<=100thenbegins:=s+i;i:=i+1:goto10end逆波兰式(1)i1:=(4)10:(6)i100<=(9)FJ(11)ssi+:=(16)ii1+:=(21)4RJ(23)(1)i1:=(4)i100<=(7)FJ(9)ssi+:=(14)ii1+:=(19)4RJ(21)2321写成一行:i1:=i1008、<=21FJssi+:=ii1+:=4RJ7.2四元式表示一、四元式的格式:(<
7、10end然后用条件语句和转向语句的逆波兰表示,将它表示成逆波兰式。其它形式的循环语句,也是首先展开成等价的条件语句表示,然后表示成逆波兰式。例如:fori:=1to100dos:=s+i先将其展开:i:=1;10:ifi<=100thenbegins:=s+i;i:=i+1:goto10end逆波兰式(1)i1:=(4)10:(6)i100<=(9)FJ(11)ssi+:=(16)ii1+:=(21)4RJ(23)(1)i1:=(4)i100<=(7)FJ(9)ssi+:=(14)ii1+:=(19)4RJ(21)2321写成一行:i1:=i100
8、<=21FJssi+:=ii1+:=4RJ7.2四元式表示一、四元式的格式:(<
此文档下载收益归作者所有