编译原理实验二:赋值语句的语法分析程序设计

1.1实验内容

目的:

  • 在前面实验的基础上,通过设计、编制、调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握常用的语法分析方法。

要求:

  • 设计出给定源语言中包含有算术表达式、关系表达式和逻辑表达式的赋值语句的文法,文法满足采用的语法分析方法的要求。
  • 选择最有代表性的语法分析方法,如算符优先法(或简单优先法)、递归下降分析法、LL分析法和LR分析法之一进行语法分析。
  • 选择对各种常见程序语言都通用的语法结构,以文本文件形式输入源程序,把其中赋值语句作为分析对象进行语法检查,输出分析结果。

1.2实验分析

在本次的实验中呢,我采用的方法是递归下降法*(别问,问就是相对简单)*其实也还好,看各自感觉吧,然后我使用的语法是PL/0相关赋值语句的语法,如下:

〈赋值语句〉∷=〈标志符〉:=〈表达式〉
〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉}
〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉}
〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’

特别巧的是,由于本人的学术不精,刚开始并不知道递归下降法还需要求出相应的字符的select集,而且我使用的语法刚好是不需要往后看一个字符就可以完成的,所以,在验收的时候我才被老师说明白需要求出每个产生式的select,如果有需要参考我的代码的童鞋们可以自己加一下相关的部分哦,不是特别难。

递归下降法在我看来相对于其他几种方法都比较简单,是对每一个产生式进行分析,不同产生式对应的函数之间进行调用等,便可完成相应的功能。

1.3实验代码

赋值语句相应产生式的分析:

void assignment() {if (s == "ident") {flag = move();if (flag == 0) {cout << "语法错误 标识符后面缺项" << endl;success = 0;return;}if (s == "becomes") {flag = move();if (flag == 0) {cout << "语法错误 赋值符后面缺项" << endl;success = 0;return;}expression();}else {cout << "赋值语句中标识符后面缺少赋值符号" << endl;success = 0;return;}}else {cout << "赋值语句分析错误!" << endl;success = 0;return;}
}

表达式相应产生式的分析:

void expression() {if ((s == "plus") || (s == "minus")) {flag = move();if (flag == 0) {cout << "语法错误 加法运算符后面缺项" << endl;success = 0;return;}}item();if (!success) {return;}while ((s == "plus") || (s == "minus")) {flag = move();if (flag == 0) {cout << "语法错误 加法运算符后缺项" << endl;success = 0;return;}item();if (!success) {return;}}
}

项相应产生式的分析:

void item() {factor();if (!success) {return;}while ((s == "mul") || (s == "div")) {flag = move();if (flag == 0) {cout << "语法错误 乘法运算符后缺因子" << endl;success = 0;return;}factor();if (!success) {return;}}
}

因子相应产生式的分析:

void factor() {int lpnum = 0;if ((s == "ident") || (s == "number")) {flag = move();if (lpnum == 0 && s == "rparen") {cout << "语法错误 括号不匹配问题" << endl;success = 0;return;}}else if (s == "lparen") {lpnum++;flag = move();if (flag == 0) {cout << "语法错误 左括号后缺表达式" << endl;success = 0;return;}expression();if (!success) {return;}if (flag == 0 || s != "rparen") {cout << "语法错误 表达式后面缺少右括号" << endl;success = 0;return;}else {lpnum--;flag = move();if (flag == 0) {return;}}}else {cout << "语法错误 因子分析错误" << endl;success = 0;return;}
}

以上就是本次实验中主要的实现内容了,如果有不妥的地方希望大家帮忙指出哦,我们一起进步呀!

编译原理实验二:赋值语句的语法分析程序设计相关推荐

  1. 编译原理—实验二LL(1)语法分析(一)

    一.实验目的 1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题. 2. 复习高级语言及线性表.栈.图等典型数据结构,进一步加强用高级语言来解决实际问题的能力. 二. ...

  2. 编译原理-实验二-LL(1)语法分析程序的设计

    一.实验目的 了解LL(1)分析器的基本构成及用自顶向下的LL(1)方法对表达式进行语法分析的方法,掌握LL(1)语法分析程序的构造方法. 二.实验内容 根据LL(1)语法分析算法的基本思想,设计一个 ...

  3. 编译原理实验二:Bison

    编译原理实验二:Bison 实验要求 1.了解Bision基础知识,如何将文法产生式转换为Bison语句 2.阅读/src/common/SyntaxTree.c,对应头文件 /include/Syn ...

  4. 编译原理实验二(全部存储到数组再逐行验证语法版.....这种思路被老师否了,应该是验证一行扔掉一行才对)

    编译原理实验二(可能还有BUG,不确定继续找) 要大改一次23333,老师的意思是不能用数组存储,而是一边识别单词,然后识别完一行就判断一次语法 写实验二的时候找到的实验一的一个逻辑错误 改动了实验一 ...

  5. 编译原理实验二 macos系统 itoa方法报错解决方法

    编译原理实验二 生成符号表的前期准备中使用itoa函数报错问题 执行 gcc -o parser lex.yy.c parser.tab.c ast.c 显示: itoa 函数是一个广泛应用的,从非标 ...

  6. 编译原理实验二:标识符的识别

    实验要求 [任务介绍]根据给定源语言的构词规则,从任意字符串中识别出所有的合法标识符. [输入]字符串. [输出]单词符号流,一行一个单词. [题目]设计一个程序,从任意字符串中识别出所有可视为C语言 ...

  7. 编译原理-实验四-LR(0)语法分析程序的设计

    一.实验目的 了解LR(0)语法分析算法的基本思想,掌握LR(0)语法分析程序的构造方法. 二.实验内容 根据LR(0)语法分析算法的基本思想,设计一个对给定文法进行LR(0)语法分析的程序,并用C. ...

  8. 编译原理实验报告三:语法分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告三:语法分析 一.实验目的 通过设计.开发一个S语言的语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容的理解,提高语法分析方法的实践能力. 二.实验要求        根 ...

  9. 编译原理 实验二 简单计算器的设计与实现

    实验二 简单计算器的设计与实现  一.实验目的   综合运行词法分析器.语法分析器等原理实现一个具有加.乘功能的简单计算器,该计算器满足乘法优先级高于加法优先级,且仅处理非负整数. 二.实验内容    ...

最新文章

  1. BMC Biology:香港城市大学孙燕妮组发表高准确度预测病毒宿主的工具
  2. java执行顺序_java执行顺序
  3. OpenGL text rendering文字渲染的实例
  4. Angular http client发起的请求在Chrome开发者工具network标签页里观察到的界面
  5. leetcode(977)有序数组的平方
  6. 中大东校小米路由器mini实现inode上网,ipv6 wifi【中大】【东校】【inode】【ipv6】...
  7. 巴菲特2021年致股东信披露重仓股名单
  8. iwebAx产品家族之iweb SNS v0.6体验版--不错的开源软件~~
  9. 图像融合综述论文整理
  10. threejs 透视相机参数解析
  11. 计算机简史:你想不通去脉,是因为不了解来龙
  12. 世界三大顶级音响_世界十大名牌音响有那些
  13. 微信android版字体,微信炫彩字下载-微信七彩字体 安卓版v1.6.2-PC6安卓网
  14. 蓝桥:8皇后·改(⼋皇后问题)
  15. 开始我的Python学习历程
  16. 【java校招你不知道的那些事儿】校招分层级,找准定位很重要
  17. 【苹果家庭推送】iMessage Number是一种及时静态(Differential Privacy)
  18. Activiti7学习笔记、非常详细 | 进阶篇
  19. MySQL查询优化利刃-EXPLAIN
  20. kettle-创建资源库

热门文章

  1. 数据仓库ETL工具箱——实时ETL系统
  2. 计算三大变化,带来了哪些红利?
  3. 故障分析 | 数据库表空间被 rm 后,怎么处理
  4. Cauchy-Schwarz Inequality
  5. 免费网络硬盘、FTP、大容量邮箱、电子相册合集
  6. 酷睿i7 11800h和r7 5800h参数对比 锐龙r75800h和酷睿i711800h选哪个好
  7. Python并发编程系列之多线程
  8. mysql获取经纬度_mysql-百度地图从MySql中获取经纬度
  9. C# ThoughtWorks.QRCode.dll 生成完美二维码(大小 边距 备注 颜色 LOGO大小背景形状)
  10. APP爬虫- 手机安装证书-解决SSL证书的移动端数据包问题