【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