【20200416】编译原理课程课业打卡十六之构造预测分析表&递归下降分析程序


叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
在这里插入图片描述

一、课业打卡十六之构造预测分析表&递归下降分析程序

在这里插入图片描述
问题描述

对下面的文法G:
E->TE'
E'->+E|ε
T->FT'
T'->T|ε
F->PF'
F'->*F'|ε
P->(E)|a|b|^

(1)计算这个文法的每个非终结符的First集合Follow集。
(2)证明这个文法是LL(1)的。
(3)构造它的预测分析表。
(4)构造它的递归下降分析程序。

题目解析:

(1)计算这个文法的每个非终结符的First集合Follow集。
在这里插入图片描述
在这里插入图片描述

(2)证明这个文法是LL(1)的。

在这里插入图片描述
在这里插入图片描述

(3)构造它的预测分析表。
在这里插入图片描述
(4)构造它的递归下降分析程序。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、知识巩固

1、预测分析表构造步骤

(1)计算first集;
(2)计算follow集;
(3)计算select集;
(4)得出预测分析表。
预测分析表的构造

2、预测分析表【LL(1)分析表】的构造实例详解

算法:

对于G中的每一个产生式, A -> α ,执行以下2步:
1、for  ∀ a ∈ FIRST(α), 将 A -> α 填入 M [A, a ];
2、if(ε ∈ FIRST(α))
   ∀ a ∈ FOLLOW (A) , 将 A -> ε 填入 M [A, a ];

注意: 这里的 a 包括 # 

例子:

文法:
E -> TE'
E' -> +TE' | ε
T -> FT'
T' -> *FT' | ε
F -> (E) | id 

实例解析:

1.E -> TE' 

FIRST(TE')={(,i}     所以 E -> TE'   填入  M[E, i] 和 M[ E, ( ] 
步骤2不满足

2.E' -> +TE'

FIRST(+TE')={+}     所以 E' -> +TE'  填入  M[E', +]
步骤2不满足

3.E' -> ε

FOLLOW(E')={ ), # }   所以 E' -> ε 填入 M[E', )]   和 M[E', #]
步骤1不满足

4.T -> FT'

FIRST(FT')={(,i}    所以T -> FT' 填入 M[T, (]    和 M[T, i]
步骤2不满足

5.T' -> *FT'

FIRST(*FT')={*}     所以 T' -> *FT' 填入 M[T' , * ]
步骤2不满足

6. T' -> ε

FOLLOW(T')={ +, ), # }   所以 T' -> ε  填入M[T', +]、M[T', )] 和M[T', #]
步骤1不满足

7.F -> (E)

FIRST((E))={(}   所以F -> (E) 填入  M[F, (]
步骤2不满足

8.F ->  id

FIRST(id)={i}   所以 F ->  id 填入 M[F,   i]
步骤2不满足

结果如下:
在这里插入图片描述

3、预测分析表的构造实例拓展

在这里插入图片描述
在这里插入图片描述

4、递归下降分析程序设计实现

**递归下降程序**一般是针对某一个文法的。而递归下降的预测分析是为每一个非终结符号写一个分析过程,由于文法本身是递归的,所以这些过程也是递归的。

Sample

1、假如给的是正规式子,首先要做的是将其改为文法表示

(int∣float)id(,id) ∗

2、以上式子为例,将其改为文法表示

D−−>TL
T−−>int∣float
L−−>L,id∣id

3、然后消除其左递归

D−−>TL
T−−>int∣float
L−−>idR
R−−>,idR∣ε

4、求其FIRST集和FOLLOW集

FIRST(D)=(int,float) 
FIRST(T)=(int,float) 
FIRST(L)=(id)
FIRST( R )=(, ,ε) 

FOLLOW(D)=($) 
FOLLOW(L)=($)
FOLLOW(T)=(id) 
FOLLOW( R )=($) 

5、Code

//递归下降分析程序
#include<iostream>
#include<cstdio>
#include<sstream>
#include<cstring>
#include<string>
#include<cstdlib>
using namespace std;
string str;
size_t lookahead = 0;
string alphabet[] = {
	"int","float","(",")","id",","
};
//( int | float )id(,id)* 
//正规式表达
void D();
void T();
void L();
void R();
void error();

void error() {
	cout<<"Syntax Error!"<<endl;
}
void D() {
	T();
	L();
}

void T() {
	string m1 = str.substr(lookahead, 3);
	string m2 = str.substr(lookahead, 5);
	if (m1 == "int")
	{
		lookahead += 3;
	}
	else if (m2 =="float") {
		lookahead += 5;
	}
	else
		error();
}

void L() {
	string m3 = str.substr(lookahead, 2);
	if (m3 == "id") {
		lookahead += 2;
		R();
	}
	else
		error();
}

void R() {
	if (str[lookahead] == ',') {
		lookahead += 1;
		string m4 = str.substr(lookahead, 2);
		if (m4 == "id") {
			lookahead += 2;
			R();
		}
		else
			error();
	}
}

int main(void) {
	int n;
	cout<<"Test Number:" << endl;
	cin >> n;
	while (n--)
	{
		cout << "Input:";
		cin >> str;
		str.append("$");
		str.append("\0");
		D();
		if (str[lookahead] == '$')
			cout << "Accepted" << endl;
		else
			error();
		lookahead= 0;
	}
	return 0;
}

Ending!
更多课程知识学习记录随后再来吧!

就酱,嘎啦!

在这里插入图片描述

注:
1、人生在勤,不索何获。
2、LL(1)文法–递归下降程序参见博文:
https://blog.csdn.net/Enterprise_/article/details/83514487

原创文章 88 获赞 132 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43543789/article/details/105698120