第十一次作业 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(A) = { b , a , ε}
FIRST(C) = { a , ε}
FIRST(D) = { b , ε}
FOLLOW集:
FOLLOW (A) = { c , b , a , ε}
FOLLOW (C) = { # }
FOLLOW (D) = { a , #}
SELECT集:
SELECT( A -> Da ) = FIRST( Da ) = { b , a }
SELECT( A -> Da) = FIRST(Da) = { b, a }
SELECT( A -> ε) = FOLLOW( A) = { c, b, a, # }
SELECT( C -> aADC) = FIRST( aADC) = { a }
SELECT( C -> ε) = FOLLOW(C) = { # }
SELECT( D -> b) = FIRST(b) = { b }
SELECT( D -> ε ) =FOLLOW(D) = { a, # }
因为SELECT( A -> Da) ∩ SELECT( A -> ε) = { a } ≠ ∅,所以文法G(S)不是 LL(1)文法。
2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?
将以下文法消除左递归,分析符号串 i*i+i 。
并分别求FIRST集、FOLLOW集,和SELECT集
E -> E+T | T
T -> T*F | F
F -> (E) | i
消除左递归:
E -> TE'
E' -> +TE' | ε
T -> FT'
T' -> *FT' | ε
F -> (E) | i
FIRST集:
FIRST(E) = { ( , i }
FIRST(E') = {+ , ε }
FIRST(T) = { ( , i }
FIRST(T') = { * , ε }
FIRST(F) = { ( , i }
FOLLOW集:
FOLLOW(E) = { ) , # }
FOLLOW(E') = { ) , # }
FOLLOW(T) = { + , ) ,#}
FOLLOW(T') = {+ , ) ,#}
FOLLOW(F) = {* , + , ) ,#}
SELECT集:
SELECT (E -> TE') = FIRST(TE') = { ( , i }
SELECT(E' -> +TE') = FIRST(+TE') = { + }
SELECT(E' -> ε) = FIRST(ε) - {ε} U FOLLOW(E') = FOLLOW(E') = { ) , # }
SELECT(T -> FT') = FIRST(FT') = { ( , i }
SELECT(T' -> *FT') = FIRST(*FT') = { * }
SELECT(T' -> ε) = FIRST(ε) - {ε} U FOLLOW(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 -> (E)) = ∅,
所以该文法是 LL(1)文法
3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。
void ParseE(){
if(lookahead==’(’ || lookahead==’i’){
ParseT();
ParseE’();
}else{
printf(“syntax error \n”);
exit(0);
}
}
void ParseE’(){
switch(lookahead){
case ’+’:
MatchToken(’+’);
ParseT();
ParseE’();
break;
case ’)’,’#’:
break;
default:
printf(“syntax error \n”);
exit(0);
}
}
void ParseT(){
if(lookahead==’(’ || lookahead==’i’ ){
ParseF();
ParseT’();
} else{
printf(“syntax error \n”);
exit(0);
}
}
void ParseT’(){
switch(lookahead){
case ’*’:
MatchToken(’*’);
ParseF();
ParseT’();
break;
case ’+’,’)’,’#’:
break;
default:
printf(“syntax error \n”);
exit(0);
}
}
void ParseF(){
switch(lookahead){
case ’(’:
MatchToken( ’(’);
ParseE();
MatchToken(’)’ );
break;
case ’i’:
MatchToken(’i’);
break;
default:
printf(“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 ...
- 编译原理: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)是不 ...
- 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示
第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...
随机推荐
- 在Visual Studio 2019中开启预览功能
在Visual Studio 2019 菜单 [工具] > [选项] > [环境] 下的预览功能页面焕然一新!我们介绍了预览功能页面,以便您可以轻松找到这些功能并能够控制其启用.新布局提供 ...
- jakarta-oro-2.0.8.jar-----------JAVA FTP相关
资源不好找,找到了就和大家分享一下! 链接:https://share.weiyun.com/51kBB0y 密码:2hcxcu
- aspx.designer.cs没有自动生成代码(没有自动注册)
遇到这个问题的最大可能是:aspx页面存在bug. 比如说我的主页是从项目里的别的页面复制过来的,但是少复制了一些引用,页面就存在bug,导致aspx.designer.cs没有自动生成代码. 解决方 ...
- js数组试列题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Linux用户和权限——管理文件权限的命令
Linux用户和权限——管理文件权限的命令 摘要:本文主要学习了Linux中修改文件权限的命令. chown命令 chown命令,主要用于修改文件(或目录)的所有者,除此之外,这个命令也可以修改文件( ...
- 一次压测中tomcat生成session释放不及时导致的频繁fullgc性能优化案例
性能问题:老年代一直处于占满状态,为什么没有发生内存溢出 以HotSpot VM的分代式GC为例,普通对象分配都是在young gen进行的,具体是从在位于young gen中的eden space中 ...
- Redis入门学习(一):简介
Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求.同时Redis的诸多高层级功能使其可以胜任消息队列.任务队列等不同的角色. 20 ...
- Windows 10 Java开发环境配置
一.JDK下载 安装java开发环境,第一步就是下载jdk安装包.打开浏览器进入oracle官网下载.这里注意jdk和jre的区别,jdk(java develop environment)是java ...
- Django之 数据库ORM
一.ORM Django的 业务 少不了 跟数据库打交道,不然没有数据库保存一些数据将是一件很糟糕的事情.Django 对 数据库 支持原生的 SQL语句,但更好的对数据库支持,Django自己有一套 ...
- 语义分析的waf 目前就看到长亭 机器学习的waf有fortnet 阿里云的waf也算
近期,在全球权威咨询机构 Gartner 发布的 2019 Web 应用防火墙魔力象限中,阿里云 Web 应用防火墙成功入围,是亚太地区唯一一家进入该魔力象限的厂商! Web 应用防火墙,简称 WAF ...