程序设计语言可以通过描叙语法和语义两个方面来定义语法制导翻译技术:通过构造一个把中缀表达式转换成后缀表代式的编译器来介绍先构造一个简单的程序,如只处理+和-的表达式,然后再扩展成功能较强的编译器,能处理一般的程序词法分析器:把输入字符流转换成记号流,编译器前端的结构:字符流——(词法分析器)——记号流——(语法制导翻译器)——中间表示1语法定义: (1)如c语言:if(表达式)语句else语句stmt-if(expr) stmt else stmt(2)上下文无关文法 一个记号集合,称为终结符号 一个非终结符集合 一个产生式集合 左部(非终结符)——右部(记号和非终结符) 一个开始符合约定:数字,符号,黑体字if等为终结符 开始符号为左部的产生式列在最上面 斜体名字表示非终结符号 其他的均为记号 2.分析树 (1)树根标记为开始符号 (2)每个叶接点由记号标记(3)每个内结点由一个非终结符标识(4)如果A-XYZ,则表示成 A x y z一棵分析树从左到右的叶结点是这棵分析树生成的结果。为给定的记号串找到一个分析树的过程称为这个串的语法分析3.二义性(1)一棵分析树读完它的叶结点只能生成唯一的一个串,但是,一个文法可能有多棵分析树生成相同的记号串,这样的文法为具有二义性的文法3操作符的结合规则左结合:9+5+2=(9+5)+2右结合:a=b=c =a=(b=c)使用expr和term分别表示两种优先级,factor表示基本单元如数字和带括号额表达式
1 类似于编译器工具文本格式器,硅编译器2编译器的原理(1)源程序-预处理器-编译器(目标汇编程序)-汇编器(可重定位机器代码)-装载器,连接编译器(绝对机器代码)3,源程序的分析线性分析(词法分析),层次分析,语义分析(1)词法分析:把字符流分组为多个记号,每个记号是具有整体含义的字符序列,删除分隔符记号的空格position=initial+rate*60被分为:标识符positional 赋值符号=标识符initial 加号+标识符rate 乘号*数字60(2)语法分析:获取程序的层次结构定义语法规则 ,如表达式被递归定义为: 任何一个标识符都是表达式 任何一个数都是表达式 如果expr1和expr2是表达式,则expr1+expr2,expr1-expr2,(expr1)也是表达式(3)语义分析任务:检测源程序的语义错误,并收集代码生成阶段要用到的类型信息主要内容:类型检查——检验每个操作符的操作数是否满足源语言的说明4.编译器的各阶段源程序——词法分析器——语义分析器——中间代码生成器——代码优化器——代码生成器——目标程序(1)符号表管理器:记录源程序中使用的标识符并收集与每个标识符相关的各种属性信息,包括存储位置,类型,作用域。符号表:每个标识符在符号表中都有一条记录,记录每个域对应的标识符的一个属性,这些属性由词法分析后各阶段陆续写入符号表(2)