- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理课程设计报告
分析
通过设计,编制,调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。
IF 〈布尔表达式〉 THEN 〈赋值语句〉 ELSE 〈赋值语句〉
其中
(1)、可以选择递归下降法、LL(1)、算符优先分析法、LR法完成以上任务,中间代码选用四元式。
(2)、 写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。
(3)、 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
算法设计
程序要求有三部分组成,即词法分析、语法分析、以及语义分析。其中词法分析部分要求完成对输入程序的关键字、标识符、常数、运算符
输出:二元组(单词种别,单词符号的属性值)构成的序列
B. 待分析的简单语言的词法
因为是模拟简单编译器, 所以就以C语言的小型子集作为模拟编译器的词法.
模拟程序语言的单词符号可分为下列五种;
关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于Pascal语言中的end ) 所有的关键字都是小写字母 .
运算符: + , - , * , / , = , , = , == , , = , , ,|| , !
界 符: 逗号 ,分号 ,左圆括号 , 右圆括号 , #
常 数: 在这里只涉及到int型常量
其他单词是标识符(ID)()ID = letter(letter|digit)*
NUM = digit digit *
算法的基本任务是从字符串表示的源程序中识别出其具有独立意义的单词符号, 其基本思想是根据扫描到的单词符号的第一个字符的种类, 拼出相应的单词符号。
(2)语法分析
语法分析要处理的输入是词法分析的输出即单词序列。该部分主要用到两个栈,一个用来保存单词标志号的状态栈另一是用来保存单词本身信息的符号栈。程序从词法分析输出的单词序列中读取一个单词,检查单词是否是合法单词,如果是合法的,则取符号栈的栈顶元素,和当前单词的标志号进行优先级比较,如果小于当前单词的优先级那么将当前单词压入符号栈,将其标志号压入状态栈;如果大于当前单词的优先级那么继续弹出状态栈的元素,和上一个符号栈弹出的元素进行比较,如果两优先级相等则继续弹,如果小于上一次弹出的元素的优先级,则弹的所有元素按先后弹的倒置顺序排列为一个句柄,查找产生式找到相应的产生式进行规约,把规约或的元素当多当前一的元素继续进行比较,直到词法分析输出结果全部遍历完。在规约的过程中记下规约的次数,和每次规约的元素,以便语义分析和中间代码生成。
(3) 语义分析
语义分析主要是将语义分析结果转化成三地址码表示的中间代码的过程。
在语法分析的过程中,在每次规约的过程中记录规约的类型和各个类型规约的次数。即当规约的语句是布尔表达式时每规约一次都将规约的语句转化成三地址码的形式保存在字符串E中并记录E中规约产生式的次数在m1.quad中;如果规约的产生式是第一个赋值语句块中的赋值语句,则将规约的产生式以三地址形式保存在字符串B1中并记录B1中规约产生式的次数在m2.quad中;如果规约的产生式是第二个赋值语句块中的赋值语句,则将规约的产生式以三地址形式保存在字符串B2中并记录B2中规约产生式的次数在 m3.quad中。最后控制将B1、B2和E中的内容输入。
LL(1)文法
LL(1)文法分析流程图:
构造不带回溯的自上而下分析的文法条件
1. 文法不含左递归,
2. 对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。即,若
A→( 1|( 2|…|( n
则 FIRST(( i)∩FIRST(( j)=( (i(j)
3. 对文法中的每个非终结符A,若它存在某个候选首符集包含(,则
FIRST(A)∩FOLLOW(A)=(
如果一个文法G满足以上条件,则称该文法G为LL(1)文法。
构造预测分析表的步骤:
①对每个产生式A→(1|…|(n执行②,③。
②对FIRST(A)中每个终结符a, 把A→(i加入到M[A,a], 其中a ∈FIRST((i)
③若ε∈FIRST((i), 则对任何属于FOLLOW(A)的终结符b,将A→ (i加入M[A,b]。
④把所有无定义的M[A,a]标记为出错。
在上面的属性文法中我们使用了这样的假定:每当需要临时变量时,newtemp产生新的临时名字; lookup(id.name)用于根据名字的拼写检查符号表中是否存在该名字的条目。如果有,返回该条目的指针,否则lookup返回nil,以表示没有找到;E的属性place用来存放E值的变量名在符号表的登录项或一整数码(若此变量是一个临时变量);函数new
文档评论(0)