资源简介
编译原理实验七:LL(1)文法的判断,zip文件里包含实验报告和源代码两部分。
代码片段和文件信息
#include
#include
using namespace std;
#define max 100
typedef struct Chomsky //定义一个产生式结构体
{
string left; //定义产生式的左部
string right; //定义产生式的右部
}Chomsky;
int n;//产生式总数
string strings;//存储产生式
string noend;//存放文法中的非终结符
string empty;//存放可以推出空的非终结符
string first[max];//存放非终结符的first集
string follow[max];//存放非终结符的follow集
string select[max];//存放产生式的select集
void apart(Chomsky *pint i) //分开产生式左右部,i代表产生式的编号
{
int j;
for(j=0;j if(strings[j]==‘-‘)
{
p[i].left=strings.substr(0j);//从0开始的j长度的子串,即0~j-1
p[i].right=strings.substr(j+1strings.length()-j);//从j+1开始的后面子串
}
}
/*string is_empty(Chomsky *p)//判断某非终结符能否直接推出空,空用#代替
{
//如果可以,返回1
//不可以,返回0
int i;
string s;
for(i=0;i {
if (p[i].right[0]=“#“&&p[i].right.length()==1)//直接推出空的
{
empty=empty+p[i].left;
}
}
s=empty;
return s;//s存放能直接推出空的非终结符
}
string isempty(Chomsky *p)//可以间接推出空的非终结符
{
int ij;
string s1;
for(i=0;i {
if(is_empty(p).find(p[i].left)>=0)//若此非终结符已经存在直接推出空那里,在此无需重复计算
{
}
else
{
for(j=0;j<(int)p[i].right.length();j++)
{
if(is_empty(p).find(p[i].right.[j])<0)
{
}
}
if(j==(int)p[i].right.length())//如果右部所有符号都在直接推出空那里,则此左部也可以推出空
{
s1=s1+p[i].left[0];
}
}
}
}*/
void search(Chomsky *pint n)//提取产生式中的非终结符
{
int ij;
for(i=0;i {
if(!(noend.find(p[i].left[0])>=0&&noend.find(p[i].left[0]) noend=noend+p[i].left;
for(j=0;j {
if(‘A‘<=p[i].right[j]&&p[i].right[j]<=‘Z‘)
{
if(noend.find(p[i].right[j])>=0&&noend.find(p[i].right[j]) break;
else
noend=noend+p[i].right.substr(j1);
}
}
}
}
void First(Chomsky *pint nchar mint mm)//求文法中非终结符的First集
{
int length=noend.length();
string f;
int ijxy;
int flag=0;
for(i=0;i {
if(m==p[i].left[0])
{
if(‘a‘<=p[i].right[0]&&‘z‘>=p[i].right[0])
first[mm]=first[mm]+p[i].right.substr(01);
if(p[i].right[0]==‘#‘)
first[mm]=first[mm]+p[i].right.substr(01);
if(‘A‘<=p[i].right[0]&&‘Z‘>=p[i].right[0])
{
for(j=0;j {
if(‘A‘<=p[i].right[j]&&p[i].right[j]<=‘Z‘)flag++;
}
if(flag==j)//产生式的右部均为非终结符
{
flag=0;
for(j=0;j {
for(x=0;x if(p[i].right[j]==p[x].left[0]&&p[x].right[0]==‘#‘)
{
flag++;
break;
}
}
if(flag==j)//产生式右部的全部非终结符均能推出空
{
for(j=0;j {
for(x=0;x {
if(p[i].right[j]==noend[x])break;
}
y=x;
if(first[y]==““)First(pnp[i].right[j]x);
f=first[y];
for(x=0;x {
if(f[x]==‘#‘)
{
if(x==f.length()-1)f=f.substr(0x);
els
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7068 2014-06-04 17:16 7.cpp
文件 80384 2015-12-13 20:43 编译原理实验七:LL(1)文法的判断 .doc
- 上一篇:编译原理实验四:正规式到正规文法的转换
- 下一篇:halcon_17 深度学习
相关资源
- 编译原理实验四:正规式到正规文法
- 编译原理实验三:正规文法到正规式
- 程序设计语言编译原理课后习题答案
- 编译原理-LL1文法的判定
- 东北大学软件学院编译原理
- 构造识别规范句型活前缀DFA的程序设
- 计算机编译原理第三版张幸儿课后答
- 计算机编译原理文法压缩
- 编译作业2.3.jpg
- 预备工作1——了解你的编译器
- 太原理工大学编译原理实验
- 编译原理实验 中间代码优化 代码 报
- 编译原理龙书第二版答案看评论酌情
- 编译原理习题答案,1-8章龙书第二版
- 合肥工业大学编译原理课程设计报告
- 简单文法压缩程序可对文法做等价压
- 编译原理三级项目pl0扩展
- 编译原理课后练习习题
- 编译原理考点,编译原理考点整理。
- 2018燕山大学软件工程编译原理
- 编译原理实验-计算器-完成品
- 编译原理实验 C0编译器的 设计与实现
- 编译原理陈火旺第三版课后练习答案
- 北邮编译原理课程设计
- 西农编译原理实习报告
- 广工2015编译原理实验报告
- 程序设计语言编译原理第三版-成火旺
- 华中科技大学编译原理实验yacc源码
- 编译原理识别活缀的DFA
- 编译原理实验 计算器 语法树 逆波兰
评论
共有 条评论