一、实验目的
1.熟悉LL(1)语法分析的基本原理,语法分析的过程,以及语法分析中要注意的一些问题。
2. 复习高级语言及线性表、栈、图等典型数据结构,进一步加强用高级语言来解决实际问题的能力。
二、实验内容
编程实现下面的功能:
输入一个上下文无关文法,按照教材5.2节算法,求出各个非终结符能否推出ε,存储并显示结果。

1.计算能推出空的非终结符。

原理部分摘自清华大学出版社出版的《编译原理》一书
第一步:求能推出#的非终结符

结果如下图:

是否=>#
S

T

N

推导步骤:
(1)初值:“未定”

(2)扫描:

①先删除右部有终结符(只要有就删除)的产生式,若某符号的产生式全部被删除光了,则定义“否”(这里S直接可以定义否)

这个时候产生式剩下:

T->SN

N->,SN

N->#

②若某产生式右部为#,则该非终结符标“是”,并删除该终结符相关的所有产生式; (这里N可以定义为“是”,并N在左部的所有产生式)

这个时候产生式剩下:

T->SN

(3)扫描右部的每一个符号

①右部“是”对应的非终结符都要被删除(在经历(2)中的扫描产生的“是”的非终结符,这里是指N ; 这里的删除值得是删除单个字符,),若这使得某个某个产生式右部为空,则该产生式左部的符号,可以直接标“是”,然后删除该符号的相关产生式

例子:

经历扫描前还剩下 T->SN

之后删除N

T->S

(4)扫描右部的每一个符号

同上,右部如果对应为“否”的符号,则删除整个产生式(注意:区别上面的(3)上面是先删除单个字符,这里是直接删除整个产生式),若这使得产生式左部相关符号的所有的产生式都被删除,则标记“否”

S标记为“否”,则删除T->S,这时,关于T的所有产生式都被删除,这时T被标记“否”

得下图(也就是上文的图标):

是否=>#
S

T

N

#include<bits/stdc++.h>
using namespace std;
/*
未知-1
非空1
空0
*/
/*
在1
不在0
*/
int zjf(char c)
{if(c>='A'&&c<='Z'){return 0;}else if(c=='@'){return 0;}else if(c==','||c=='.'||c==':'||c=='?'){return 0;}else{return 1;}
}
int zj(string s)
{for(int i=0; i<s.size(); i++){if(zjf(s[i])){return 1;}}return 0;
}
string delchar(char c,string s)
{string str= "";for(int i=0;i<s.size();i++){if(s[i]!=c)str+=s[i];}return str;
}
int main()
{int n;map<string,int>ma;set<char> se;cout<<"输入文法产生式的个数(<=50):";cin>>n;string s[51];cout<<"输入各产生式(每行一条,空用'@'表示):"<<endl;for(int i=0; i<n; i++){cout<<"("<<i+1<<"):";cin>>s[i];ma[s[i]]=1;se.insert(s[i][0]);}set<char>::iterator it;int k=0;char a[51];for(it=se.begin(); it!=se.end(); it++) //使用迭代器进行遍历{a[k++]=*it;}map<char,int> m;for(int i=0; i<k; i++){m[a[i]]=-1;
//      cout<<m[a[i]]<<" ";}//(1)for(int i=0; i<k; i++){int cnt=0,cnt1=0;for(int j=0; j<n; j++){if(zj(s[j].substr(3))){ma[s[j]]=0;}if(zj(s[j].substr(3))&&s[j][0]==a[i]){cnt++;}if(s[j][0]==a[i]){cnt1++;}}if(cnt1==cnt){m[a[i]]=1;}}//(2)for(int i=0; i<n; i++){if(ma[s[i]]==1){if(s[i].substr(3)=="@"){m[s[i][0]]=0;}}}for(int i=0; i<n; i++){if(m[s[i][0]]==0){ma[s[i]]=0;}}
//  (3)while(1){int flag=0;for(int i=0; i<n; i++){if(ma[s[i]]==1){char de[51];int kk=0;for(int j=3; j<s[i].size(); j++){if(m[s[i][j]]==0){de[kk++]=s[i][j];}}for(int w=0;w<kk;w++){s[i]=s[i].substr(0,3)+delchar(de[w],s[i].substr(3));ma[s[i]]=1;}
//              cout<<s[i]<<endl;if(s[i].size()==3){m[s[i][0]]=0;ma[s[i]]=0;flag=1;}}}for(int i=0; i<n; i++){for(int j=3; j<s[i].size(); j++){if(ma[s[i]]==1){ma[s[i]]=0;int ff=0;for(int k=0; k<n; k++){if(ma[s[k]]==1){if(s[i][0]==s[k][0]){ff=1;}}}if(ff==0){m[s[i][0]]=1;flag=1;}}}}if(flag==0)break;}for(int i=0; i<k; i++){cout<<a[i]<<"-> "<<m[a[i]]<<endl;}
}
/*
S->a
S->^
S->(T)
T->SN
N->,SN
N->@
*/

编译原理—实验二LL(1)语法分析(一)相关推荐

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

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

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

    编译原理实验二:赋值语句的语法分析程序设计 1.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. 编译原理 实验二 简单计算器的设计与实现

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

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

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

最新文章

  1. ios_UITextField右侧小圆叉
  2. 结束语:投递简历和选公司的策略
  3. php超市结算,超市物品结算简易程序代码
  4. java i 原理_Java I/O模型及其底层原理
  5. excel进销存添加网页模块,可手机开单
  6. 无锁编程的原理和应用
  7. OSChina 周二乱弹 —— 基于现代生物化学的长生不老药炼制教程
  8. go语言中同一个package下的文件相互引用怎么做?
  9. android 同根动画_[转载]Android anim动画切换效果
  10. RealsenseD415/D435深度相机常用资料汇总
  11. DaZeng:京东放大镜demo
  12. CycleGAN中欺骗相反域的鉴别器是什么意思
  13. syncthing数据同步应用-docker部署
  14. spring 是如何保证一个事务内获取同一个Connection?
  15. 认证资料大全(二十一)------ SAIR认证列表
  16. 准备学计算机怎么样,计算机的学生应怎么样去考研?
  17. 我吃的肉里都有量子力学了?
  18. Windows系统下安装ROS系统
  19. 【总结】56个JavaScript 实用工具函数助你提升开发效率!
  20. Epicor中的时间格式转换 - How to convert time from string to time format

热门文章

  1. 输入一个3×3的整型矩阵,求该矩阵主对角线元素之和
  2. I帧、P帧、B帧、GOP、IDR 和PTS, DTS之间的关系
  3. 神通数据库自助在线查询
  4. 在虚拟机关机时,提示Ubuntu-Unattended upgrade in progress during shutdown, please don‘t turn off
  5. vue姓名筛选模糊搜索
  6. Django——admin功能、注册模型类、模型管理类
  7. 利用c51进行数模转换并在液晶屏上显示_单片机数模转换
  8. vue项目如何区分开发、生产和测试环境
  9. intval()很重要
  10. csp认证考试准备Day-3