资源简介
第三次上机作业
1. 编写First和Follow函数,实现其求解过程。
(1)FIRST集合计算方法:
① 若Xa.., 则将终结符a加入FIRST(X)中;
② 若X,则将加入FIRST(X)中;
③ 若XY…,且Y属于非终结符,则将FIRST(Y)\{}加入到FIRST(X)中;(注:“\”表示除去元素,即FIRST(Y)中的非元素加入到FIRST(X)中。以下同理。)
④ 若XY1Y2..YK,且Y1,Y2,..Yi-1都是非终结符,且Y1,Y2,..Yi-1的FIRST集合中均包含,则将FIRST(Yj)的所有非元素加入到FIRST(X)中,(j=1,2,..i).特别地,若Y1~YK均有产生式,则将加到FIRST(X)中。
(2)FOLLOW集合计算方法:
① 对文法开始符号S,置$于FOLLOW(S)中。
② 若有AB,则将FIRST()\{} 加入FOLLOW(B)中。 (此处 可以为空)
③ 若A B 或A B ,且 * (即 属于FIRST()),则将 FOLLOW(A)加入FOLLOW(B)中(此处 可以为空)。
2. 测试文法:
A->BCDE
B->aBA|ε
C->F|ε
D->b|c|ε
E->e|ε
F->d|ε
代码片段和文件信息
#include
#include
#include
#include
using namespace std;
#define MAX 50
int NONE[MAX] = { 0 };
string strings; //产生式
string Vn; //非终结符
string Vt; //终结符
string first[MAX]; //存放每个终结符的first集
string First[MAX]; //存放每个非终结符的first集
string Follow[MAX]; //存放每个非终结符的follow集
int N; //产生式个数
struct STR
{
string left;
string right;
};
void rec(STR *p) //识别Vn和Vt
{
int i j;
for (i = 0;i < N;i++) //第i个产生式
{
for (j = 0;j < (int)p[i].left.length();j++)//左侧
{
if ((p[i].left[j] >= ‘A‘&&p[i].left[j] <= ‘Z‘)) //左侧第j个字母是大写
{
if (Vn.find(p[i].left[j])>100) //Vn里没找到返回很大的值
Vn += p[i].left[j];
}
else
{
if (Vt.find(p[i].left[j])>100) //小写字母放Vt
Vt += p[i].left[j];
}
}
for (j = 0;j < (int)p[i].right.length();j++)//右侧
{
if (!(p[i].right[j] >= ‘A‘&&p[i].right[j] <= ‘Z‘))
{
if (Vt.find(p[i].right[j])>100)
Vt += p[i].right[j];
}
else
{
if (Vn.find(p[i].right[j]) > 100)
Vn += p[i].right[j];
}
}
}
}
void getlr(STR *p int i) //将产生式的左右部分别放入left,right
{
int j;
for (j = 0;j { if (strings[j] == ‘-‘&&strings[j + 1] == ‘>‘)
{ p[i].left = strings.substr(0 j);
p[i].right = strings.substr(j + 2 strings.length() - j);
}
}
}
string Letter_First(STR *p char ch)
{
int t;
if (!(Vt.find(ch)>100)) //在Vt里,first就是自身
{
first[Vt.find(ch)] = ch;
return first[Vt.find(ch) - 1];
}
if (!(Vn.find(ch) > 100)) //在Vn中的第i个
{
for (int i = 0;i < N;i++) //第i个产生式
{
if (p[i].left[0] == ch) //左侧字符是ch
{
if (!(Vt.find(p[i].right[0])>100))
{
if (First[Vn.find(ch)].find(p[i].right[0]) > 100) //右侧第一个字符是Vt,加入Vni的first集合中
{
First[Vn.find(ch)] += p[i].right[0];
}
}
if (p[i].right[0] == ‘#‘)
{
if (First[Vn.find(ch)].find(‘#‘) > 100) //右侧第一个字符是空,加入Vni的first集合中
{
First[Vn.find(ch)] += ‘#‘;
}
}
if (!(Vn.find(p[i].right[0]) > 100)) //右侧第一个字母是Vn
{
if (p[i].right.length() == 1) //只有一个字母
{
string ff;
ff = Letter_First(p p[i].right[0]); //把右侧字母的first集合加入到左侧字母中
for (int k = 0;k < ff.length();k++)
{
if (First[Vn.find(ch)].find(ff[k])>100)
{
First[Vn.find(ch)] += ff[k];
}
}
}
else //多个字母都是Vn
{
for (int j = 0;j < p[i].right.length();j++)
{
string TT;
TT = Letter_First(p p[i].right[j]);
if (!(TT.find(‘#‘)>100) && (j + 1) < p[i].right.length()) /
- 上一篇:姿态解算c代码
- 下一篇:C++中文分词系统代码
相关资源
- 编译原理c语言编译器
- 编译原理实验-词法分析(c语言代码)
- 北邮-编译原理-词法分析
- 现代编译原理-C语言描述
- 编译原理实验报告+代码+使用说明
- 编译原理课程设计-C语言子集编译器
- 赋值语句翻译c语言实现四元式
- 编译原理用C++消除左递归
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- 山东大学编译原理实验源代码c++版
- 简单函数绘图语言的解释器
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
- C语言实现一个编译器-编译原理南开大
- 编译原理课程实验报告词法分析器及
评论
共有 条评论