没有合适的资源?快使用搜索试试~ 我知道了~
首页词法分析与语法解析实验报告:1160300426 - 李国建
词法分析与语法解析实验报告:1160300426 - 李国建
需积分: 0 0 下载量 105 浏览量
更新于2024-08-04
收藏 427KB DOCX 举报
在本篇实验报告中,学生李国建针对编译原理课程进行了一项深入实践,主要涉及词法分析、语法分析和语义分析的综合应用。实验目标是设计一个程序,能够解析并处理特定编程语言的语法结构。 首先,数组ACTION和Goto表被用来存储程序的语法规则,这在词法分析阶段至关重要。词法分析模块需识别一系列关键元素,包括但不限于: 1. 标识符:符合特定规则的字母、数字和下划线组合,且以字母或下划线开头。 2. 关键字:包括整型、浮点型、布尔型、记录型等类型关键字,以及if、else和do、while等分支和循环结构的关键字。 3. 运算符:包括算术运算符、关系运算符和逻辑运算符。 4. 界符:如赋值符“=”和语句结束符“;”。 5. 常量:无符号整数和浮点数。 6. 注释:使用/*...*/形式的单行或多行注释。 接下来,语法分析部分要求实现对不同语句类型的识别,如声明语句(变量声明)、表达式及简单赋值、分支语句(if_then_else)和循环语句(do_while)。此外,实验还涉及到编写CLOSURE(I)和GOTO函数,以及自动生成LR分析表,这是高级语法分析技术的应用,旨在支持更复杂的程序控制流分析。 语法错误处理能力也是实验的一个重要部分,系统需能准确指出错误发生的位置,并提供可能的错误恢复策略,错误提示信息格式化明确。输入方式方面,系统支持通过文件导入文法和测试用例,确保覆盖实验内容中列举的各种语句类型,同时包含一定的复杂性和边界情况测试。 这个实验不仅考察了学生对编译原理基础概念的理解,还锻炼了他们编写和调试词法分析器、语法分析器以及处理语法错误的能力,是一次全面的编程和理论实践相结合的项目。
资源详情
资源推荐
二、文法设计
得分
要求:给出如下语言成分所对应的语义动作
➢ 声明语句(变量声明
➢ 表达式及赋值语句
➢ 分支语句:if_then_else
➢ 循环语句:do_while
声明语句:
D -> T L ; {enter(L.name, T.type, offset);offset = offset + T.width}
T -> int {T.type = int, T.width = 4}
T -> float {T.type = float, T.width = 4}
T -> double {T.type = double, T.width = 8}
L -> id {L.name = id}
表达式及赋值语句:
S -> id = E ; {p = lookup(id.name);
if p != nil then gencode(p` = ` E.addr) else error}
E -> E + E {E.addr = newtemp; gencode(E.addr` = `E1.addr `+` E2.addr)}
E -> E * E {E.addr = newtemp; gencode(E.addr` = `E1.addr `*` E2.addr)}
E -> - E {E.addr = newtemp; gencode(E.addr `=` -E.addr)}
E -> ( E ) {E.addr = E1.addr}
E -> id {p = lookup(id.name); if p != nil then E.addr = p else error}
E -> num { E.addr = num }
分支和循环语句:
B -> B COMP B {B.addr = newtemp;
gencode(B.addr `=` B1.addr COMP.addr B2.addr)}
B -> not B {B.truelist = B1.falselist; B.false = B1.truelist}
B -> ( B ) {B.truelist = B1.truelist; B.falselist = B1.falselist}
B -> E > E | E < E | E <= E | E >= E{B.truelist = makelist(nextquad);
B.falselist = makelist(nextquad + 1);
gencode(`if` E1.addr relop.op E2.addr `goto -`);
gencode(`goto -`)}
B -> true {B.truelist = makelist(nextquad); gencode(`goto -`)}
B -> false {B.falselist = makelist(nextquad); gencode(`goto -`)}
COMP -> or {COMP.quad = nextquad}
COM -> and {COMP.quad = nextquad}
TH -> then {TH.quad = nextquad}
WH -> while { WH.quad = nextquad }
DO -> do {DO.quad = nextquad}
S -> if B TH S {backpatch(B.truelist, TH.quad);
S.nextlist = merge(B.falselist, S.nextlist)}
S -> WH B DO S {backpatch(S1.nextlist, WH.quad);backpatch(B.truelist,
DO.quad); S.nextlistB.falselist; gencode(`goto` WH.quad)}
S -> A {S.nextlist = nil}
剩余12页未读,继续阅读
白羊带你成长
- 粉丝: 25
- 资源: 328
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++多态实现机制详解:虚函数与早期绑定
- Java多线程与异常处理详解
- 校园导游系统:无向图实现最短路径探索
- SQL2005彻底删除指南:避免重装失败
- GTD时间管理法:提升效率与组织生活的关键
- Python进制转换全攻略:从10进制到16进制
- 商丘物流业区位优势探究:发展战略与机遇
- C语言实训:简单计算器程序设计
- Oracle SQL命令大全:用户管理、权限操作与查询
- Struts2配置详解与示例
- C#编程规范与最佳实践
- C语言面试常见问题解析
- 超声波测距技术详解:电路与程序设计
- 反激开关电源设计:UC3844与TL431优化稳压
- Cisco路由器配置全攻略
- SQLServer 2005 CTE递归教程:创建员工层级结构
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功