语义计算的递归下降(预测)翻译程序

2023-05-16

语义计算的递归下降(预测)翻译程序

一、实验内容

实现属性文法的递归下降翻译程序
G[N]:
N-> . . .S {S.f:=1;print(S.v)}
S->BS1 {S1.f:=S.f+1;B.f:=S.f;S.v:=B.v+S.v}
S->ε {S.v:=0}
B->0 {B.v:=0}
B->1 {B.v:=2^(-B.f)}

二、内容分析

  1. 首先我们由文法可知是L属性文法,因此需将其改写为L属性的翻译模式:G[N]
    N-> . . .{S.f:=1}S{print(S.v)}
    S->{B.f:=S.f}B{S1.f:=S.f+1}S1{S.v:=B.v+S.v}
    S->ε {S.v:=0}
    B->0 {B.v:=0}
    B->1 {B.v:=2^(-B.f)}
  2. 然后我们根据文法左部非终结符进行划分,分成N、S、B三部分,需计算出三个非终结符的first集进行递归子程序的判断
    first(N)={.}
    first(S)={0,1,ε}
    first(B)={0,1}
  3. 准备工作已完成,然后我们便可以设计

三、算法设计

  1. 从键盘输入字符串,跳转至左部非终结符为初始符N调用函数,进行判断:
    若当前字符为.,则执行文法N->.S的翻译语句(Sf=1、S() 、printf(S.val)
    反之,则输出错误
  2. 当跳转至左部为S的调用函数时,进行判断:
    若当前字符为0或1,则执行S->BS1的翻译语句(Bf=Sf、B()、S1f=Sf+1、S()、Sv=Bv+S1v
    若当前字符为ε,则执行S->ε的翻译语句(Sv=0
    反之,则输出错误
  3. 当跳转至左部为B的调用函数时,进行判断:
    若当前字符为0,则执行B->0的翻译语句
    Match(0)、Bv=0
    若当前字符为1,则执行B->1的翻译语句
    Match(1)、Bv=2^(-Bf)
    反之,则输出错误
  4. 字符判断Match(a):
    若当前字符和输入串匹配,则继续进行下一个字符比较,反之则输出错误

四、模块分析

  1. 输入:
    显示属性文法并输入字符串
//初始化,输入属性文法和待判断表达式 
void Init(){
	int i;
	cout<<"属性文法为:"<<endl;//该文法用于将二进制无符号定点小数转化为十进制小数 
	cout<<"N->.S     {S.f=1;print(S.v)}"<<endl;
	cout<<"S->BS1    {S1.f=S.f+1;B.f=S.f;S.v=B.v+S1.v}"<<endl;
	cout<<"S->ε     {S.v=0}"<<endl;
	cout<<"B->0      {B.v=0}"<<endl;
	cout<<"B->1      {B.v=2^(-B.f)}"<<endl;
	cout<<"输入字符串:"<<endl;
	for(i=0;;i++){//输入内容以#结尾 
		cin>>str[i];
		if(str[i]=='#')
		break;
	}
	N();//转入判断 
}
  1. N:
    执行左部为非终结符N的语句
//左侧为N的产生式 
void N(){//if的判断语句来源于N的first集 
	float Sf,Sv;
	if(str[temp]=='.'){
		Match('.');
		Sf=1;
		Sv=S(Sf);
		cout<<"S.val="<<Sv<<endl;
	}
	else
	cout<<"syntax error!"<<endl;
}
  1. S:
    执行左部为非终结符S的语句
//左侧为S的产生式 
float S(float f){//if的判断语句来源于S的first集 
	float Bf,Bv,S1f,S1v,Sv;
	if(str[temp]=='0'|str[temp]=='1'){
		Bf=f;
		Bv=B(Bf);
		S1f=f+1;
		S1v=S(S1f);
		Sv=Bv+S1v; 
	}
	else if(str[temp]=='#')
	Sv=0;
	else{
		cout<<"syntax error!"<<endl;
		exit(0);
	}
	return Sv;
}
  1. B:
    执行左部为非终结符B的语句
//左侧为B的产生式 
float B(float f){//if判断语句来源于B的first集 
	float Bv; 
	if(str[temp]=='0'){
		Match('0');
		Bv=0;
	}
	else if(str[temp]=='1'){
		Match('1');
		Bv=pow(2,-f);
	}
	else{
		cout<<"syntax error!"<<endl;
		exit(0);
	}
	return Bv;
}
  1. 字符判断:
    逐个进行字符判断
//进行字符串匹配的判断 
void Match(char ss){//终结符的匹配 
	if(str[temp]!=ss){//若当前字符不匹配 
    	cout<<"syntax error"<<endl;
    }
	else//若当前字符匹配,进行下一字符 
	temp++;
}

五、结果展示

注:由文法属性可知,输入内容必须是二进制小数,第一位是小数点才可以,否则输出错误
正确案例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
错误案例:
在这里插入图片描述
在这里插入图片描述

六、源代码

代码已经过编译,可直接使用

#include<iostream>
#include<math.h>
using namespace std;
 
//全局变量 
char str[10];//存储待判断表达式 
int temp=0;//当前匹配字符 

void N();//左侧非终结符N 
float S(float);//左侧非终结符S 
float B(float);//左侧非终结符B 
void Match(char);//判断字符的匹配 

//初始化,输入属性文法和待判断表达式 
void Init(){
	int i;
	cout<<"属性文法为:"<<endl;//该文法用于将二进制无符号定点小数转化为十进制小数 
	cout<<"N->.S     {S.f=1;print(S.v)}"<<endl;
	cout<<"S->BS1    {S1.f=S.f+1;B.f=S.f;S.v=B.v+S1.v}"<<endl;
	cout<<"S->ε     {S.v=0}"<<endl;
	cout<<"B->0      {B.v=0}"<<endl;
	cout<<"B->1      {B.v=2^(-B.f)}"<<endl;
	cout<<"输入字符串:"<<endl;
	for(i=0;;i++){//输入内容以#结尾 
		cin>>str[i];
		if(str[i]=='#')
		break;
	}
	N();//转入判断 
}

//左侧为N的产生式 
void N(){//if的判断语句来源于N的first集 
	float Sf,Sv;
	if(str[temp]=='.'){
		Match('.');
		Sf=1;
		Sv=S(Sf);
		cout<<"S.val="<<Sv<<endl;
	}
	else
	cout<<"syntax error!"<<endl;
}

//左侧为S的产生式 
float S(float f){//if的判断语句来源于S的first集 
	float Bf,Bv,S1f,S1v,Sv;
	if(str[temp]=='0'|str[temp]=='1'){
		Bf=f;
		Bv=B(Bf);
		S1f=f+1;
		S1v=S(S1f);
		Sv=Bv+S1v; 
	}
	else if(str[temp]=='#')
	Sv=0;
	else{
		cout<<"syntax error!"<<endl;
		exit(0);
	}
	return Sv;
}

//左侧为B的产生式 
float B(float f){//if判断语句来源于B的first集 
	float Bv; 
	if(str[temp]=='0'){
		Match('0');
		Bv=0;
	}
	else if(str[temp]=='1'){
		Match('1');
		Bv=pow(2,-f);
	}
	else{
		cout<<"syntax error!"<<endl;
		exit(0);
	}
	return Bv;
}

//进行字符串匹配的判断 
void Match(char ss){//终结符的匹配 
	if(str[temp]!=ss){//若当前字符不匹配 
    	cout<<"syntax error"<<endl;
    }
	else//若当前字符匹配,进行下一字符 
	temp++;
}

//主函数 
int main(){
	Init();//初始化 
} 



大家若遇到什么问题,请留言说明,谢谢!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语义计算的递归下降(预测)翻译程序 的相关文章

  • Could not identify launch activity: Default Activity not found

    运行Java程序出现下面的问题 因为在AndroidManifest xml中没有定义activity xff0c 加上activity的定义就可以了 span class token operator lt span intent spa
  • 基于对话框的MFC界面添加菜单栏

    在资源视图中右键单击 gt 添加资源 gt menu gt 新建 并命名ID为IDR MENU1 新建之后默认ID为IDR MENU1 xff08 若想要修改ID xff0c 可以找到属性栏 xff08 方法见下 xff09 xff0c 之
  • Ubuntu修改文件权限

    修改文件权限 xff1a chmod chmod 修改文件权限有两种使用格式 xff1a 字母法与数字法 给文件的同组用户和其他用户减去读权限 ps 只能对自己的文件进行权限操作 增加读写权限 设置文件所有者的权限为读 修改文件所有者 xf
  • PyQGIS中一次性加载多个shp文件

    目录 遍历添加多个图层 打印图层列表清单 打开QGIS Desktop 3 22 16 xff0c 点击菜单栏 设置 gt Python控制台 在Python控制台中点击 显示编辑器 按钮 xff0c 打开Python编辑器 点击Pytho
  • PyQGIS获取要素以及要素中的几何属性

    from qgis core import QgsProject QgsVectorLayer 1 指定输入图层路径 path to airports layer 61 r 34 E PyQGIS Source Data Ex5 pt sh
  • 【解决思路】当前不会命中断点,还未为文档加载任何符号

    问题 xff1a 在调试代码过程中 xff0c 计算机突然蓝屏而强制关闭并重启 xff0c 以至于vs在运行调试的过程中就在非正常的情况下被迫关闭 重启之后 xff0c 继续打开并运行项目 xff0c 却发现无法进行调试代码 于是我把鼠标移
  • PyQGIS获取字段列表

    from qgis core import QgsVectorLayer QgsProject path to airports layer 61 r 34 E PyQGIS Source Data Ex5 pt shp 34 layer
  • 【用示例学习与理解C++系列】类的构造方法

    前言 本文主要是通过简单的示例 xff0c 去学习与理解C 43 43 类的构造方法 构造方法的作用 为什么存在构造方法 xff1f 为什么需要构造方法 xff1f 那是因为当我们在代码中定义一类变量 xff08 实例化一个类的实例 对象时
  • CSP-M2 :神奇的序列

    文章目录 HRZ的序列题目输入输出解题代码 HRZ学英语 滑动窗口题目输入输出解题代码 咕咕东的奇妙序列题目输入输出解题代码 HRZ的序列 题目 相较于咕咕东 xff0c 瑞神是个起早贪黑的好孩子 xff0c 今天早上瑞神起得很早 xff0
  • 转化Foggy_Cityscapes数据集为voc和yolo格式用作目标检测

    目录 一 数据集下载 xff08 1 xff09 解压后文件夹目录 xff08 2 xff09 gtFine格式如下所示 xff1a 二 转换为VOC数据集格式 xff08 1 xff09 生成xml标签 xff08 2 xff09 将le
  • 如何获取数据库的逻辑文件名、数据库文件的路径

    1 sp helpdb 数据库名 2 获取数据库文件路径 select ltrim rtrim filename from 数据库名 sysfiles where charindex 39 MDF 39 filename gt 0 sele
  • Linux进度条以及makefile相关知识

    一 在Linux环境下实现进度条 xff0c 其原理是 xff1a 用sleep函数或usleep函数控制每隔多长时间输出一次 xff0c 每次输出字符会比上次输出字符多一个 在此代码中 xff0c 用 r而不用 n的原因 xff1a n表
  • hdu - 4642 - Fliping game(博弈)

    题意 xff1a Alice和Bob玩游戏 xff0c 一个N M的矩阵 xff0c 里面是1或0 xff0c 每人每次选择一个1的位置 xff0c 然后将这个位置到右下角的整个矩形元素全部取反 xff08 1变0 xff0c 0变1 xf
  • 图形界面报错“已拒绝X11转移申请”的解决方法

    今天想通过本机给虚拟机起x manager图形界面的时候报出 解决办法 xff1a 原来X11 forwarding依赖 xorg x11 xauth 软件包 xff0c 所以必须先安装 xorg x11 xauth 软件包 yum ins
  • bash: ifconfig: command not found 解决办法

    经常遇到 34 bash xxxx command not found 34 这样的问题 xff0c 用root用户也不行 xff0c 在网上查阅了此问题 xff0c 解决方法如下 xff1a 原文1 http hi baidu com j
  • 用CMfcShellTree和CMFCShellListCtrl实现资源管理器并过滤扩展名

    资源管理器 CMfcShellTree和CMFCShellListCtrl是VS2008 SP1和VS2010内自带的控件 xff0c 用这两个控件实现资源管理器只需几行代码 CMFCShellTreeCtrl m tree CMyShel
  • 解决虚拟机下CentOS系统无法识别usb设备

    其实不是什么 解决 xff0c 虚拟机默认是自动挂载usb设备的 只是要注意插usb设备的时候 xff0c 虚拟机必须要处于当前窗口 然后就会自动弹出已安装好usb设备的提示 xff08 如果系统比较卡 xff0c 需要多等一会 xff09
  • 基于MDK的汇编语言编写及小灯闪烁的汇编程序实现

    基于MDK的STM32汇编语言编写及小灯闪烁的汇编程序实现 一 新建工程二 配置环境1 选择设备2 选择运行环境3 添加源文件 三 测试代码1 源码2 仿真器设置3 编译调试 四 HEX文件解读五 闪烁LED的程序六 总结参考 一 新建工程
  • WIndows10连接虚拟机显示connection confused

    Windows10连接虚拟机显示connection confused 当我们想由win10连接虚拟机终端时 xff0c 使用第三方软件Putty或者win10的cmd都可能出现connection confused问题 xff0c 解决这
  • 交换两个数字(不使用其他变量)

    面试题 交换两个数字 xff08 不使用其他变量 xff09 一 题目要求 xff1a 有两个整数变量a 61 6 b 61 100不使用其他变量 xff0c 交换两个变量的值 二 解法 解法1 xff08 使用其他变量 xff09 xff

随机推荐

  • unity如何使用电脑模拟VR环境

    unity如何通过VRTK模拟VR环境 如何在没有HTC VIVE的前提下使用VR xff1f 由于作者研究室课题是基于虚拟现实的人机交互 xff0c 需要用到VR下的场景 xff0c 但由于实验室设备只有一套 xff0c 而当我们想要随时
  • 笔试算法:青蛙跳台阶

    笔试算法 xff1a 青蛙跳台阶 1 题目表述 假设青蛙正在跳台阶 需要 n 阶你能到达楼顶 每次青蛙可以跳 1 或 2 个台阶 xff0c 但不可以连续跳2个 请问有多少种不同的方法可以到楼顶呢 xff1f 注意 xff1a 给定 n 是
  • 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数

    输入一行字符 xff0c 分别统计出其中英文字母 空格 数字和其他字符的个数 首先需要判断各自所出的范围 xff1a 中英文字母 xff1a a到z A到Z 空格 xff1a 空一个字符 数字 xff1a 1 9 然后则对一串字符进行逐个比
  • 逆波兰式的实现及表达式的值

    逆波兰式的实现 1 概念 逆波兰式也叫后缀表达式 xff0c 这里先简单帮大家理解一下概念性问题 像我们平常使用到的表达式如 a 43 b c
  • C语言栈的用法(创建、入栈、出栈、遍历)

    C语言栈的用法 xff08 创建 入栈 出栈 遍历 xff09 本篇博客主要简单介绍如何使用C语言构建栈 xff0c 元素入栈 xff0c 元素出栈以及遍历所有的栈内元素 1 栈的定义 首先对栈进行定义 xff0c 构建一个简单的结构体 x
  • 我印象中的徐志摩

    我印象中徐志摩 在我上中学的时候 xff0c 徐志摩对于我来说是一个神圣不可侵犯的名字 xff0c 那么一个具有才华和能力 xff0c 从他的作品里感受到他那浪漫的文艺气息和对自由生活的追求 xff0c 无不令我们这些初入青春期的孩子们留下
  • 根据文法规则,判断文法类型

    根据文法规则 xff0c 判断文法类型 1 实验要求 输入 xff1a 文法规则 输出 xff1a 文法类型 2 实验原理 文法规则 xff1a 以四元组的形式展示出来 xff1a 文法G 定义为四元组G 61 Vn Vt P S Vn x
  • 根据文法进行表达式推导

    根据文法进行表达式推导 xff08 编译原理 xff09 1 实验要求 已知文法 xff1a E gt T E 43 T T gt F T F F gt E i 请给出下述表达的推导公式 xff1a i 43 i i i 43 i i 2
  • (编译原理)正规文法转正规式(原代码)

    xff08 编译原理 xff09 正规文法转正规式 一 实验要求 输入 xff1a 正规文法输出 xff1a 正规式 例 xff1a 输入 xff1a S gt aB B gt b 输出 xff1a ab 输入 xff1a S gt aS
  • PDF转Word转换器

    PDF转换器 这款PDF转换器可以将PDF文件转换为Word Excel和PPT等 而且是免费的 xff0c 不用考虑PDF页数问题 xff0c 全都是免费的哦 1 安装链接 https pan baidu com s 18ySVrh wn
  • 构造LL(1)文法的递归下降子程序

    构造LL 1 文法的递归下降子程序 1 要求 输入 LL 1 文法输出 xff1a 递归下降子程序如 xff1a 文法G S S AaS BbS d A a B e若输入 xff1a aad 则输出 xff1a S AaS A a S d
  • 编译原理LL(1)文法的判断(first集、follow集和select集)

    编译原理LL 1 文法的判断 xff08 first集 follow集和select集 xff09 1 问 如何通过给定的文法 xff0c 判断该文法是否是LL 1 文法 xff1f 2 答 求出该文法的first集 follow集和sel
  • Matlab2017A安装教程

    Matlab2017A安装教程 1 链接 链接 xff1a https pan baidu com s 13BO9i885aOMIvX9z5Dh CQ 提取码 xff1a 0p44 2 安装步骤 首先进入链接进行保存下载 xff0c 解压文
  • LR(0)分析表的构建

    LR 0 分析表的构建 一 实验要求 构建LR xff08 0 xff09 分析表 例 xff1a G E E gt aA E gt bB A gt cA A gt d B gt cB B gt d 二 实验原理 在网上找了好久 xff0c
  • 子非鱼

    子非鱼 前几天在微信的一个公众号上面看到了一个推荐的纪录片 xff0c 叫做 子非鱼 xff0c 讲述的是居住在香港的底层人民的生活状况 xff0c 他们孩子的上学历程 xff0c 看着颇为感叹 里面主要是围绕着余伟豪及其同学的学习生活进行
  • Michael Scofield in Break Prison(越狱)

    Michael Scofield in Break Prison xff08 越狱 xff09 前段时间紧赶慢赶将越狱的最后一季给看完了 xff0c 着实内心极度的不平静 记得最开始看第一季第一集时 xff0c 还是因为听说非常之好看 男主
  • 计算机类期刊投稿心得

    1 杂志名称 计算机应用研究 成都 杂志文章包含专业 建模 xff0c 仿真 xff0c 网络 xff0c 人工智能 xff0c 比较杂 投稿联系方式 注册在线投稿审稿 投稿费用 审稿费无 xff0c 250元 页 杂志级别 国家一级期刊
  • 《物流配送中VRP问题的多目标优化方法研究》个人小结

    物流配送中VRP问题的多目标优化方法研究 个人小结 物流配送中VRP问题的多目标研究方法 xff0c 自从去年开始了这项大学生创新创业 xff0c 就一直围绕在我的身边 xff0c 时时刻刻会想着她 xff0c 尽可能地去多学一点相关的VR
  • 《科研方法导论》

    科研方法导论 这本书在开学的时候听说有这门课要上就在网上下单了 xff0c 目前已将近一整个学期过去了 xff0c 距离老师的最后一次课也有好几个月了 xff0c 才新建一份Word文档准备将老师上课所讲述的知识和这本书的整体内容进行读后感
  • 语义计算的递归下降(预测)翻译程序

    语义计算的递归下降 xff08 预测 xff09 翻译程序 一 实验内容 实现属性文法的递归下降翻译程序 xff27 xff3b xff2e xff3d xff1a N gt S S f 61 1 print S v S gt BS1 S1