作业十一——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(Da) = {b, a}
FIRST(ε) = {ε}
FIRST(aADC) = {a}
FIRST(b) = {b}
FOLLOW(A) = {c, b, a, #}
FOLLOW(C) = {#,}
FOLLOW(D) = {a, #}
SELECT(A -> Da) = FIRST(Da) = {b, a}
SELECT(A -> ε) = FIRST(ε) - {ε}UFOLLOW(A) = FOLLOW(A) = {c, b, a, #}
因为SELECT(A -> Da) ∩ SELECT(A -> ε) ≠ Ø
所以G(S)不是 LL(1)文法。
2.法消除左递归之后的表达式文法是否是LL(1)文法?
答:文法为:(1)E -> TE'
(2)E' -> +TE' | ε
(3)T -> FT'
(4)T' -> *FT' | ε
(5)F -> (E) | i
FIRST(+TE') = {+}
FIRST(ε) = {ε}
FIRST(*FT') = {*}
FIRST((E)) = { ( }
FIRST(i) = {i}
FOLLOW(E') = { ), # }
FOLLOW(T') = {+, ), #}
FOLLOW(F) = {*, +, ), #}
SELECT(E' -> +TE') = FIRST(+TE') = {+}
SELECT(E' -> ε) = FIRST(ε) - {ε}UFOLLOW(E') = FOLLOW(E') = { ), # }
SELECT(T' -> *FT') = FIRST(*FT') = {*}
SELECT(T' -> ε) = FIRST(ε) - {ε}UFOLLOW(T') = FOLLOW(T') = { +, ), # }
SELECT(F -> (E)) = FIRST((E)) = { ( }
SELECT(F->i)=FIRST(i)={i}
因为SELECT(E' -> +TE') ∩ SELECT(E' -> ε) = Ø
SELECT(T' -> *FT') ∩ SELECT(T' -> ε) = Ø
SELECT(F -> (E)) ∩ SELECT(F -> i) = Ø
所以此表达式文法是LL(1)文法。
3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。
E()
{T();
E'();
}
E'()
T()
T'()
F()
答:SELECT集:
SELECT(E->TE')=FIRST(TE')={ (, i }
SELECT(E'->+TE')=FIRST(+TE')={+}
SELECT(E'->ε)=FIRST(ε)-{ε}UFOLLOW(E')=FOLLOW(E')={ ),# }
SELECT(T->FT')=FIRST(FT')={ (,i }
SELECT(T'->*FT')=FIRST(*FT')={*}
SELECT(T'->ε)=FIRST(ε)-{ε}UFOLLOW(T')=FOLLOW(T')={ +,),# }
SELECT(F->(E))=FIRST((E))={ ( }
SELECT(F->i)=FIRST(i)={i}
递归下降语法分析程序:
void ParseE(){
switch(lookahead){
case '(','i':
ParseT();
ParseE'();
break;
default:
print("syntax error \n");
exit(0);
}
}
void ParseE'(){
switch(lookahead){
case '+':
MatchToken('+');
ParseT();
ParseE'();
break;
case ')','#':
break;
default:
print("syntax error \n");
exit(0);
}
}
void ParseT(){
switch(lookahead){
case '(','i':
ParseF();
ParseT'();
break;
default:
print("syntax error \n");
exit(0);
}
}
void ParseT'(){
switch(lookahead){
case '*':
MatchToken('*');
ParseF();
ParseT'();
break;
case '+',')','#':
break;
default:
print("syntax error \n");
exit(0);
}
}
void ParseF(){
switch(lookahead){
case '(':
MatchToken('(');
ParseE();
MatchToken(')');
break;
case 'i':
MatchToken('i');
break;
default:
print("syntax 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(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)是不 ...
- 【大数据作业十一】分布式并行计算MapReduce
作业要求:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319 1.用自己的话阐明Hadoop平台上HDFS和MapReduce的功 ...
- 【大数据应用技术】作业十一|分布式并行计算MapReduce
本次作业在要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319 1.用自己的话阐明Hadoop平台上HDFS和MapRe ...
随机推荐
- Jupter Notebook常用快捷键与常用的魔法命令
jupter notebook快捷键整理 Part1 1.删除Cell——双击D 2.撤销删除——Z 3.新建Cell——A/B (向上/向下) 4.命令窗口——P 5.运行——Ctrl+Enter ...
- vue {{}}的用法
参考链接:https://blog.csdn.net/cofecode/article/details/78666233
- CentOS系统安装配置mysql
一.mysql安装 安装mysql数据库: yum install -y mysql mysql-server 判断mysql是否启动成功: service mysqld start 二.mysql配 ...
- cent8安装postgres
postgres是一款免费.开源的对象型关系数据库,其在cent8的安装方式与cent7的不太一样,特此记录. 步骤: 1 安装postgres server dnf install postgres ...
- C/C++内存知识(一)
一.C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap)- 由程序 ...
- unicode 格式 转汉字
function decodeUnicode($str){ return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', create_function( ...
- python--接口自动化测试(接口状态)
本节开始,开始介绍python的接口自动化测试,首先需要搭建python开发环境,到https://www.python.org/下载python 版本直接安装就以了,建议 下载python2.7.1 ...
- 从业务流程角度:分析TMS系统各个功能模块
TMS的主要功能是协调承运商.运营商.货主三种角色人员分工合作共同完成运输任务,并实现对运输任务的跟踪管理.本文将按照业务流程顺序对TMS系统各个功能模块进行分析说明. 一.业务描述 新零售的兴起及& ...
- 体验三大JavaScript文件上传库(Uppy.js/Filepond/Dropzone)
最近发现了一个高颜值的前端上传组件Uppy.js,立即上手体验了一波,感觉还不错.然后又看到同类型的Filepond以及Dropzone.js,对比体验了一下,感觉都很优秀,但是在体验过程中,都遇到了 ...
- MongoDB知识小结
一.术语 RDBMS MongoDB 数据库 数据库 表格 集合 行 文档 列 字段 表联合 嵌套文档 主键 主键 (MongoDB 提供了 key 为 _id ) 数据库 数据库名可以是满足以下条件 ...