十一次作业——LL(1)文法的判断,递归下降分析程序
1. 文法 G(S):
(1)S -> AB
(2)A ->Da|ε
(3)B -> cC
(4)C -> aADC |ε
(5)D -> b|ε
验证文法 G(S)是不是 LL(1)文法?
解:
FIRST集:
FIRST(Da)={b,a}
FIRST(ε)={ε}
FIRST(aADC)={a}
FIRST(b)={b}
FOLLOW集:
FOLLOW(A)=FIRST(B)+FIRST(B)+FIRST(B)+FOLLOW(C)={c,a,b,#}
FOLLOW(C)={#}
FOLLOW(D)={a,#}
SELECT集:
SELECT(A->Da)={b,a}
SELECT(A->ε)={c,b,a,#}
SELECT(C->aADC)={a}
SELECT(C->ε)={#}
SELECT(D->b)={b}
SELECT(D->ε)={a,#}
因为:
SELECT(A->Da)∩SELECT(A->ε)≠∅
所以此文法不为LL(1)文法。
2.法消除左递归之后的表达式文法是否是LL(1)文法?

答:是LL(1)文法。
3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。
E()
{T();
E'();
}
E'()
T()
T'()
F()
答:
void ParseE(){
ParseT();
ParseE'();
}
void ParseT() {
ParseF();
ParseT'();
}
void ParseE'() {
switch(lookahead):
case +:
MatchToken(+);
ParseT();
ParseE'();
break;
case #:
break;
case ):
break;
default:
printf('synax error!\n');
exit(0);
}
void ParseF() {
switch(lookahead):
case (:
MatchToken(();
ParseE();
MatchToken());
break;
case i:
MatchToken(i);
break;
default:
printf('synax error!\n');
exit(0);
}
void ParseT'()
{
switch(lookahead):
case *:
ParseF();
MatchToken(*);
ParseT'();
break;
case #:
break;
case ):
break;
case +:
break;
default:
printf('synax error!\n');
exit(0);
}
4.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。
十一次作业——LL(1)文法的判断,递归下降分析程序的更多相关文章
- 作业十一——LL(1)文法的判断,递归下降分析程序
作业十一——LL(1)文法的判断,递归下降分析程序 判断是否为LL(1)文法 选取有多个产生式的求select,只有一条产生式的无需求select 同一个非终结符之间求交集,全部判断为空后则为LL(1 ...
- 第十一次作业 LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...
- 第十一次 LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...
- LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da | ε (3)B -> cC (4)C -> aADC | ε (5)D -> b | ε 验证文法 G ...
- 编译原理之LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...
- 编译原理:LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...
- LL(1)文法--递归下降程序
递归下降程序 递归下降程序一般是针对某一个文法的.而递归下降的预测分析是为每一个非终结符号写一个分析过程,由于文法本身是递归的,所以这些过程也是递归的. 以上是前提. Sample 假如给的是正规式子 ...
- 作业十一——LL(1)文法的判断
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...
- 2017-2018-2 20179205《网络攻防技术与实践》第十一周作业 SQL注入攻击与实践
<网络攻防技术与实践>第十一周作业 SQL注入攻击与实践 1.研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 缓冲区溢出原理 在计算机内部,输入数据通常被存放在一个临时空间内, ...
随机推荐
- Zookeeper作为配置中心使用说明
为了保证数据高可用,那么我们采用Zookeeper作为配置中心来保存数据.SpringCloud对Zookeeper的集成官方也有说明:spring_cloud_zookeeper 这里通过实践的方式 ...
- BZOJ 2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(这是我写过最骚气的dp!)
题目描述 贝西和邦妮找到了一个藏宝箱,里面都是金币! 但是身为两头牛,她们不能到商店里把金币换成好吃的东西,于是她们只能用这些金币来玩游戏了. 藏宝箱里一共有N枚金币,第i枚金币的价值是Ci.贝西 ...
- MongoDB自学------(1)MongoDB4.0安装
一.环境 操作系统 安装包 安装方式 Ubuntu18.04 mongodb4.0 apt安装 Ubuntu18.04 mongodb4.0 docker安装 二.apt安装 sudo apt-key ...
- OTA升级详解(三)
君子知夫不全不粹之不足以为美也, 故诵数以贯之, 思索以通之, 为其人以处之, 除其害者以持养之: 出自荀子<劝学篇> 终于OTA的升级过程的详解来了,之前的两篇文章OTA升级详解(一)与 ...
- day1-python初识以及变量
一.变量:将输入的内容赋值给变量,即变量=输入的内容 n1=input('请输入用户名:') 二. 变量名可以是 -英文. -数字.数字不能开头 -下划线,但是不可以下划线开头 不能是关键字 'and ...
- 小白学 Python(24):Excel 基础操作(下)
人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...
- 【SQL SERVER】2017 Developer 安装教程
官网下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 1.下载之后双击exe文件,选择基本 自定义都行 2.选择 ...
- iOS:应用程序扩展开发之Today扩展(Today Extesnsion)
一.简介 iOS应用程序扩展是苹果在iOS8推出的一个新特性,可以将自定义的功能和内容扩展到应用程序之外,在之后又经过不断地优化和更新,已经成为开发中不可或缺的功能之一.扩展也是一个Target项目, ...
- 获取jar包内部的资源文件
通常获取一个资源文件很简单,问题是对于jar包内的资源文件,可能会发生意外.假如这里有一个文件操作的类: public class FileLoader { public boolean exists ...
- nyoj 366 D的小L (全排列)
D的小L 时间限制:4000 ms | 内存限制:65535 KB 难度:2 描述 一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...