# WHILE 循环语句的翻译程序设计
# 一、系统描述
问题描述
对类 C 语言中 while 循环语句的理解及分析,设计编译器前端中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法自底向上的分析并通过语法制导翻译的方法将 while 循环语句翻译输出中间代码四元式。
主要任务
通过设计、编制、调试一个 WHILE 循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。
首先写出一个能识别 while 循环语句的文法,通过求出其文法的优先表,观察该文法是否有冲突。如果有,修改文法,解决文法的冲突使它符合简单优先法的要求,然后按照这个文法编写一个集词法分析,语法分析和语义分析为一体的程序,该程序首先可以检查输入语句是否符合词法要求,若符合则继续识别输入的语句是否符合 while 语句的文法,若符合则进行语义分析,输出用四地址代码表示的中间代码。
# 二、文法及属性文法的描述
属性文法
| 产生式 | 语义动作 |
| ------- | ------------------------------------------------------- |
| Aid=E’ | Gen(‘=’, E.addr, ’ ’ , id.lexeme) |
| EE’ | E.addr = E’.addr |
| ET’ | E.addr = T’.addr |
| EE+T’ | E.addr = new Temp(); gen(‘+’,E1.addr,T’.addr,E.addr) |
| EE-T’ | E.addr = new Temp(); gen(‘-’,E1.addr,T’.addr,E.addr) |
| T’T | T’.addr = T.addr |
| TF | T.addr = F.addr |
| TT*F | T.addr=new Temp(); gen(‘*’, T1.addr, F.addr, T.addr) |
| TT/F | T.addr=new Temp(); gen(‘/’, T1.addr, F.addr, T.addr) |
| Fid | F.addr = id.lexeme |
| Fn | F.addr = n.num |
| F(E’) | F.addr = E’.addr |
While 语句、判断语句的属性文法有两种,一种是将 while 循环、判断语句的 L 属性(具有综合属性和继承属性)的语法制导定义(SDD)改写成语法制导的翻译方案(SDT),新的 SDT 可以和自底向上语法分析器一起完成翻译;另一种为利用拉链回填技术一趟式目标代码生成,利用真假链,将之前的语法制导的翻译方案里的继承属性变为继承属性即可自底向上的完成翻译,两种属性文法如下:
其一:
| 产生式 | 语义动作 |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| S while ( { L1 = new(); L2 = new(); C.false = S.next;; C.true=L2; gen(“label”, “ ”, “ ”, L1);};C) { S1.next=L1; gen(“label”. “ ”, “ ”,L2); };S1 { gen(“goto” , “ ”, “ ”, L1} | S while ( { L1 = new(); L2 = new(); C.false = S.next;; C.true=L2; gen(“label”, “ ”, “ ”, L1);};C) { S1.next=L1; gen(“label”. “ ”, “ ”,L2); };S1 { gen(“goto” , “ ”, “ ”, L1} |
| Cid>id { if id.lexme > id.lexme goto C.true ;;Goto C.false } / /产生相关四元式 | Cid>id { if id.lexme > id.lexme goto C.true ;;Goto C.false } / /产生相关四元式 |
其二:
| 产生式 | 语义动作 |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| S while ( { M1.instr = nextinstr; / /变量 nextinstr 为下一条指令的序号};C) {M2.instr = nextinstr; / /同上 };S1 {backpatch (S1.nextlist, M1.instr); backpatch(C.truelist, M2.instr);; S.nextlist = B.falselist;; gen(“goto” , “ ”, “ ”, M1.instr);} | S while ( { M1.instr = nextinstr; / /变量 nextinstr 为下一条指令的序号};C) {M2.instr = nextinstr; / /同上 };S1 {backpatch (S1.nextlist, M1.instr); backpatch(C.truelist, M2.instr);; S.nextlist = B.falselist;; gen(“goto” , “ ”, “ ”, M1.instr);} |
| Cid>id { C.truelist = makelist(nextinstr); ;C.falselist=makelist(nextinstr+1);;Gen(“ if” id.lexme > id.lexme “goto ___(空)“);; Gen(“goto ___(空)”} / /产生相关四元式 | Cid>id { C.truelist = makelist(nextinstr); ;C.falselist=makelist(nextinstr+1);;Gen(“ if” id.lexme > id.lexme “goto ___(空)“);; Gen(“goto ___(空)”} / /产生相关四元式 |
# 三、语法分析方法描述及语法分析表设计
简单优先法
简单优先分析法的基本思想是对一个文法按一定原则求出该文法�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:课程论文报告word+项目源码及可执行exe文件 通过设计、编制、调试一个 WHILE 循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 首先写出一个能识别 while 循环语句的文法,通过求出其文法的优先表,观察该文法是否有冲突。如果有,修改文法,解决文法的冲突使它符合简单优先法的要求,然后按照这个文法编写一个集词法分析,语法分析和语义分析为一体的程序,该程序首先可以检查输入语句是否符合词法要求,若符合则继续识别输入的语句是否符合 while 语句的文法,若符合则进行语义分析,输出用四地址代码表示的中间代码。 详细介绍参考:https://blog.csdn.net/newlw/article/details/125168130
资源推荐
资源详情
资源评论
收起资源包目录
WHILE循环语句的翻译程序设计.zip (50个子文件)
experiment
Compilers.sln 1KB
Compilers
lexer.txt 29B
data.h 1KB
parser2.cpp 7KB
Token.h 951B
parser.txt 1024B
parser2.h 7KB
Compilers.vcxproj.filters 2KB
lexout - 副本.txt 133B
Compilers.vcxproj 6KB
variable.h 5KB
lexer.h 10KB
parser.cpp 5KB
parserout.txt 1024B
Compilers.vcxproj.user 162B
parser.h 13B
lexer.cpp 1KB
symbols.h 2KB
lexout.txt 212B
Debug
vc141.pdb 876KB
vc141.idb 299KB
parser2.obj 2.21MB
lexer.obj 2KB
parser.obj 2KB
Compilers.tlog
CL.write.1.tlog 2KB
Compilers.lastbuildstate 199B
CL.command.1.tlog 2KB
link.command.1.tlog 2KB
link.read.1.tlog 4KB
link.write.1.tlog 534B
CL.read.1.tlog 23KB
Compilers.log 455B
LICENSE 1KB
编译课设.doc 209KB
.vs
Compilers
v15
Browse.VC.db 6.36MB
ipch
AutoPCH
4d46b4b72e0ed5b5
LEXER.ipch 30.5MB
bda12444e8e5575b
DATA.ipch 29.38MB
603fb514645ee2fd
PARSER2.ipch 51.94MB
d2ab4c44e833bf85
SYMBOLS.ipch 40.44MB
5e46c8ecc25fb350
TOKEN.ipch 29.38MB
227d5444b0d27ed6
LEXER.ipch 2.19MB
abe1694106f9dbdf
INTER.ipch 41MB
b7fa8ac16d5863e5
PARSER2.ipch 51.94MB
dc3b39b6cad40f96
SYMBOLS.ipch 29.25MB
1706cb0ae23567e
PARSER2.ipch 30.38MB
7af8596bbb95704f
PARSER.ipch 29.25MB
Debug
Compilers.exe 438KB
Compilers.pdb 2.85MB
Compilers.ilk 2.47MB
README.md 23KB
共 50 条
- 1
资源评论
shejizuopin
- 粉丝: 9517
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功