编译原理--LL(1)分析法实验C++

一、实验项目要求

1.实验目的

根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL(1)分析法的理解。

2.实验要求

对下列文法,用LL(1)分析法对任意输入的符号串进行分析:

(1)E->TG

(2)G->+TG|—TG

(3)G->ε

(4)T->FS

(5)S->*FS|/FS

(6)S->ε

(7)F->(E)

(8)F->i

输出的格式如下:

(1)LL(1)分析程序,编制人:姓名,学号,班级

(2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串

(3)输出过程如下: 

步骤

分析栈

剩余输入串

所用产生式

1

E

i+i*i#

E->TG

(4)输入符号串为非法符号串(或者为合法符号串)

备注:

(1)在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错”;若成功结束则写为“分析成功”。

(2)在此位置输入符号串为用户自行输入的符号串。

(3)上述描述的输出过程只是其中一部分的。

注意:

1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;

2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);

二、理论分析或算法分析

1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。

2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。

3.程序编写

(1)定义部分:定义常量、变量、数据结构。

(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);

(3)控制部分:从键盘输入一个表达式符号串;

(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

三、实验方法

程序流程图如图所示:

四、实验结果分析

实验结果图

遇到的问题

(1)遇到如图所示的问题

解决办法

(1)在程序最前面加#define _CRT_SECURE_NO_WARNINGS后可以解决;

在本次实验中,不仅使我编译原理的知识更加巩固,而且可以使理论与实践相结合,更好的掌握所学知识。我也发现自己的不足之处,以后会多加改正。

五、代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<dos.h>
char A[20];/*分析栈*/
char B[20];/*剩余串*/
char v1[20] = { 'i','+','-','*','/','(',')','#' };/*终结符  */
char v2[20] = { 'E','G','T','S','F' };/*非终结符   */int j = 0, b = 0, top = 0, l;/*L为输入串长度 */typedef struct type/*产生式类型定义      */
{char origin;/*大写字符  */char array[5];/*产生式右边字符 */int length;/*字符个数      */
}type;type e, t, g, g1, g2, s, s2, s1, f, f1;/*结构体变量  */
type C[10][10];/*预测分析表      */void print()/*输出分析栈  */
{int a;/*指针*/for (a = 0; a <= top + 1; a++)printf("%c", A[a]);printf("\t\t");
}/*print*/void print1()/*输出剩余串*/
{int j;for (j = 0; j < b; j++)/*输出对齐符*/printf(" ");for (j = b; j <= l; j++)printf("%c", B[j]);printf("\t\t\t");
}/*print1*/void main()
{int m, n, k = 0, flag = 0, finish = 0;char ch, x;type cha;/*用来接受C[m][n]*//*把文法产生式赋值结构体*/e.origin = 'E';strcpy(e.array, "TG");e.length = 2;t.origin = 'T';strcpy(t.array, "FS");t.length = 2;g.origin = 'G';strcpy(g.array, "+TG");g.length = 3;g1.origin = 'G';strcpy(g1.array, "-TG");g1.length = 3;g2.origin = 'G';g2.array[0] = '^';g2.length = 1;/s.origin = 'S';strcpy(s.array, "*FS");s.length = 3;s1.origin = 'S';strcpy(s1.array, "/FS");s1.length = 3;s2.origin = 'S';s2.array[0] = '^';s2.length = 1;f.origin = 'F';strcpy(f.array, "(E)");f.length = 3;f1.origin = 'F';f1.array[0] = 'i';f1.length = 1;for (m = 0; m <= 4; m++)/*初始化分析表*/for (n = 0; n <= 5; n++)C[m][n].origin = 'N';/*全部赋为空*//*填充分析表*/
//char v1[20]={'i','+','-','*','/','(',')','#'};/*终结符  */
//char v2[20]={'E','G','T','S','F'};/*非终结符   */C[0][0] = e; C[0][5] = e;C[1][1] = g; C[1][2] = g1; C[1][3] = C[1][4] = C[1][7] = g2;C[2][0] = t; C[2][3] = t; C[2][5] = t;C[3][1] = C[3][2] = s2; C[3][3] = s; C[3][4] = s1; C[3][6] = C[3][7] = s2;C[4][0] = f1;     C[4][5] = f;printf("LL(1)分析程序,编制人:孙志英,27号,1920542班\n");printf("输入一以#结束的符号串(包括+ - * / () i #):");do/*读入分析串*/{scanf("%c", &ch);if ((ch != 'i') && (ch != '+') && (ch != '-') && (ch != '*') && (ch != '/') && (ch != '(') && (ch != ')') && (ch != '#')){printf("输入串中有非法字符\n");exit(1);}B[j] = ch;j++;} while (ch != '#');l = j;/*分析串长度*/ch = B[0];/*当前分析字符*/A[top] = '#'; A[++top] = 'E';/*'#','E'进栈*/printf("步骤\t\t分析栈 \t\t剩余字符 \t\t所用产生式 \n");do{x = A[top--];/*x为当前栈顶字符*/printf("%d", k++);printf("\t\t");for (j = 0; j <= 7; j++)/*判断是否为终结符*/if (x == v1[j]){flag = 1;break;}if (flag == 1)/*如果是终结符*/{if (x == '#'){finish = 1;/*结束标记*/printf("acc!\n");/*接受 */getchar();getchar();exit(1);}/*if*/if (x == ch){print();print1();printf("%c匹配\n", ch);ch = B[++b];/*下一个输入字符*/flag = 0;/*恢复标记*/}/*if*/else/*出错处理*/{print();print1();printf("%c出错\n", ch);/*输出出错终结符*/exit(1);}/*else*/}/*if*/else/*非终结符处理*/{for (j = 0; j <= 4; j++)if (x == v2[j]){m = j;/*行号*/break;}for (j = 0; j <= 7; j++)if (ch == v1[j]){n = j;/*列号*/break;}cha = C[m][n];if (cha.origin != 'N')/*判断是否为空*/{print();print1();printf("%c->", cha.origin);/*输出产生式*/for (j = 0; j < cha.length; j++)printf("%c", cha.array[j]);printf("\n");for (j = (cha.length - 1); j >= 0; j--)/*产生式逆序入栈*/A[++top] = cha.array[j];if (A[top] == '^')/*为空则不进栈*/top--;}/*if*/else/*出错处理*/{print();print1();printf("%c出错\n", x);/*输出出错非终结符*/exit(1);}/*else*/}/*else*/} while (finish == 0);
}/*main*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实际中进行GC调整

调优垃圾回收与任何其他性能调优活动没有什么不同。 您需要确保了解当前的情况和期望的结果&#xff0c;而不是因为对应用程序的随机部分进行调整而产生了诱惑。 通常&#xff0c;只需执行以下过程即可&#xff1a; 陈述您的绩效目标 运行测试 测量 与目标比较 进行更改并…

达梦数据库出现卡慢简单分析点

1.检查是否有锁表 查询锁表&#xff1a;select sess_id,sql_text from v$sessions sess,v$lock lck where sess.trx_idlck.trx_id and lck.blocked1; --查询僵死会话 解锁&#xff1a;根据会话ID&#xff0c;停止会话 sp_close_session(sess_id); 2.根据v$sessions,V$L…

对象的属性

首先要理解的是“实例变量”。 我们在__init__方法中并不是创建了实例变量&#xff0c;我们是添加了一个或者多个属性给实际的对象 在__init__内部 self.x 5和外部 f.x 5没有什么不同。 那么类呢&#xff1f; 1 >>> class Bar(object): 2 pass 3 4 >>>…

hibernate.session.get()方法不能获取表中最新数据解决方式样例

1.A a (A)session.get(A.class, id); sess.createSQLQuery("update A set name where id ").executeUpdate(); A a1 (A)session.get(A.class, id);//a1中获取不到修改后的name值 sess.refresh(a1);//刷新a1对象&#xff0c;取出数据库数据 注&#xff1a;hibern…

hibernate 映射_Hibernate映射集合性能问题

hibernate 映射首先&#xff0c;本文的灵感来自于Burt Beckwith在2011年1月27日于SpringOne 2GX上发表的有关高级GORM –性能&#xff0c;自定义和监视的演讲 。 简而言之&#xff0c; Burt Beckwith讨论了使用映射集合和GORM中的Hibernate 2级缓存的潜在性能问题&#xff0c;以…

SEL selector (二)

SEL消息机制工作原理是什么 引用下面文章&#xff1a; 我们在之前有提到,一个类就像一个 C 结构.NSObject 声明了一个成员变量: isa. 由于 NSObject 是所有类的根类,所以所有的对象都会有一个 isa 的成员变量[公共继承].而该 isa 变量指向该对象的类(图3.15)[类在Objective-C中…

Ext grid 根据行号获取行数据

var storeExt.getCmp(grid_id).store;// var storerowstore.getAt(row_num);//行数据 var phonenumberstorerow.get(phonenumber);//列信息 //------------------------------------------------------------------------- var dataExt.getCmp(grid_id).store.data; var d…

mobile cpu上禁用alpha test的相关总结

因为&#xff0c;每家芯片的特性不同&#xff0c;根据向framebuffer写法的不同&#xff0c;分为tile-based的mobile cpu&#xff0c;如ImgTec PowerVR&#xff0c;ARM Mali&#xff0c;一部分老版本Qualcomm Adreno。还有标准的direct&#xff08;immediate&#xff09;的mobil…

学习笔记_jquery(js)遍历页面标签

$(#selectTable tr).each(function(i){ // 遍历 tr $(this).children(td).each(function(j){ // 遍历td var id $(this).context.id; }); }); //---------------------- $("input[namename1]").each(function(){ //遍历name…

简易分享功能(非第三方)

在做一个新项目时&#xff0c;需要一个新浪和微信的分享功能&#xff0c;起初看到这个需求&#xff0c;感觉没有什么&#xff0c;直接使用第三方比较成熟的分享组件就可以的&#xff0c;比如&#xff1a;jiathis、百度分享组件&#xff0c;这些都可以很轻松并且方便的完成所需要…

达梦定时迁移数据

1. 生成迁移源代码 1.1 启动DM迁移工具&#xff08;bin/dts.exe&#xff09; 1.2 右击迁移管理空白处 -> 新建工程 1.3 展开工程 -> 右击迁移&#xff0c;新建迁移 -> 输入迁移名称&#xff0c;确认 1.4 右击迁移名称&#xff0c;打开 -> 输入源数据库连接信息&…

JSP教程–最终指南

编者注&#xff1a; JavaServer Pages&#xff08;JSP&#xff09;技术使您可以轻松创建同时包含静态和动态组件的Web内容。 JSP技术提供了Java Servlet技术的所有动态功能&#xff0c;但提供了一种更自然的方法来创建静态内容。 JSP技术的主要功能包括用于开发JSP页面的语言&…

CRC校验(转)

CRC即循环冗余校验码&#xff08;Cyclic Redundancy Check[1] &#xff09;&#xff1a;是数据通信领域中最常用的一种差错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查&#xff08;CRC&#xff09;是一种数据传输检错功能&#xff0c;对数据…

tongweb6数据源使用中时常报空异常处理方式

1.在tongweb控制台 -> jdbc配置中设置数据源参数 1.1 勾选空闲超时&#xff0c;时间默认 1.2 勾选泄露超时时间 &#xff0c;时间为半天&#xff08;14400&#xff09; 1.3 勾选连接有效性检查、创建连接验证、获取连接验证、归还连接验证 图中设置泄露超时时间为900…

Ios tab Bar 使用方法

http://blog.sina.com.cn/s/blog_63578f140100w56m.html UITabBar* tabBar [[UITabBar alloc] initWithFrame:CGRectMake(40,0.0,240,30)]; [mainView addSubview:tabBar]; [tabBar release]; UITabBarItem *tabBarItem1 [[UITabBarItem alloc] initWithTitle:"排队人数…

spring smtp_使用Spring使用Java发送电子邮件– GMail SMTP服务器示例

spring smtp对于使用Java发送电子邮件&#xff0c; JavaMail API是标准解决方案。 如官方网页所述&#xff0c;“ JavaMail API提供了独立于平台和协议的框架来构建邮件和消息传递应用程序”。 必需的类包含在JavaEE平台中&#xff0c;但是要在独立的JavaSE应用程序中使用它&am…

关闭uboot MMU 会导致android2.3 S5pv210 系统不稳定?!why

问题描述在uboot里面屏蔽了MMU 使能//#define CONFIG_ENABLE_MMU就导致android 2.3 在S5pv210 上不稳定了&#xff0c;如果没屏蔽就稳定很多&#xff0c;why&#xff1f;&#xff01;坑爹的人啊&#xff0c;问了一些做了几年linux和android的人说没影响的&#xff0c;啥玩意啊&…

Java 9中的5个功能将改变您开发软件的方式(还有2个不会)

有望在Java 9中发布的最令人兴奋的功能是什么&#xff1f; 不要对Java 9的相对沉默近来分散注意力。JDK提交者正在努力准备下一个版本&#xff0c;该版本预计将在2015年12月完成&#xff0c;而功能将在几个月后完成 。此后&#xff0c;它将通过严格的测试和错误修复了将其计划…

eclipse远程tomcat javaweb debug样例(windows)

1.tomcat配置可被远程debug端口参数 catalina.bat 中添加 set CATALINA_OPTS-Xdebug -agentlib:jdwptransportdt_socket,servery,suspendn,address8000 导出项目war包到tomcat/webapps/目录下 切换到tomcat/bin目录下 双击startup.bat启动运行项目 2.eclipse中启动远程debug…

总账分录追溯发票或者付款

--总账分录追溯发票 SELECT DISTINCT AIA.*FROM AP_AE_HEADERS_ALL AAH, --帐户分录头表AP_AE_LINES_ALL AAL, --账户分录行表&#xff0c;每一个会计事件都会在此表中产生会计分录GL_JE_BATCHES GJB,GL_JE_HEADERS GJH,GL_JE_LINES GJL,AP_INVOICES_ALL …