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) → { a,b }
FIRST(Da) → { a,b }
FIRST(ε)→{ ε }
FIRST(cC)→{ a,c }
FIRST(b)→{ b }
FOLLOW集:
FOLLOW(S)→{ # }
FOLLOW(A)→{ a,b,c,# }
FOLLOW(B)→{ # }
FOLLOW(C)→{ # }
FOLLOW(D)→{ a,# }
SELECT集:
SELECT(A→Da)={b,a}
SELECT(A→ε)={a,b,c,#}
SELECT(B→cC)={c}
SELECT(C→aADC)={a}
SELECT(C→ε)={#}
SELECT(D→b)={b}
SELECT(D→ε)={a,#}
因为:SELECT(A→Da) ∩ SELECT(A→ε) ≠ Ø
所以G(S)不是 LL(1)文法。
2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?
消除左递归后:
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') → { ( , i }
SELECT(E'→+TE') → {+}
SELECT(E'→ε)= FIRST(ε)-{ ε } U FOLLOW(E') = FOLLOW(E') → { ) , # }
SELECT(T→FT') → { ( , i }
SELECT(T'→*FT') → {*}
SELECT(T'→ε) → {+,),#}
SELECT(F→(E)) → { ( }
SELECT(F→i) → { i }
因为:SELECT(E'→+TE')∩SELECT(E'→ε)= ∅,SELECT(T'→*FT')∩SELECT(T'→ε)=∅,SELECT(F→(E)) SELECT(F→i)=∅
所以文法 G(S)是 LL(1)文法。
3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。
E()
{T();
E'();
}
E'()
T()
T'()
F()
SELECT集:
SELECT(E→TE') → { ( , i }
SELECT(E'→+TE') → {+}
SELECT(E'→ε)= FIRST(ε)-{ ε } U FOLLOW(E') = FOLLOW(E') → { ) , # }
SELECT(T→FT') → { ( , i }
SELECT(T'→*FT') → {*}
SELECT(T'→ε) → {+,),#}
SELECT(F→(E)) → { ( }
SELECT(F→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 ...
- 编译原理 #02# 简易递归下降分析程序(js实现)
// 实验存档 截图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&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)文法的判断,递归下降分析程序
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)是不 ...
- TINY语言采用递归下降分析法编写语法分析程序
目录 自顶向下分析方法 TINY文法 消左提左.构造first follow 基本思想 python构造源码 运行结果 参考来源:聊聊编译原理(二) - 语法分析 自顶向下分析方法 自顶向下分析方法: ...
- 编译原理-递归下降分析法 c程序部分的分析
实验三 语法分析程序实验 专业 商软2班 姓名 黄仲浩 学号 201506110166 一. 实验目的 编制一个部分文法分析程序. 二. 实验内容和要求 输入:源程序字符串 输出:正确 ...
随机推荐
- 在centos7上进行hadoop-3.1.2的伪分布搭建
第一步:配置网络(静态IP) vi /etc/sysconfig/network-scripts/ifcfg-ens33(网卡名称可能不同) 1. 修改: 将该配置文件中的ONBOOT=no修改为ye ...
- 使用three.js创建大小不随着场景变化的文字
使用three.js创建大小不随着场景变化的文字,需要以下两步: 1.将文字绘制到画布上. 2.创建着色器材质,把文字放到三维场景中. 优点: 1.跟用html实现文字相比,这些文字可以被模型遮挡,更 ...
- 学习索引结构的一些案例——Jeff Dean在SystemML会议上发布的论文(下)
[摘要] 除了范围索引之外,点查找的Hash Map在DBMS中起着类似或更重要的作用. 从概念上讲,Hash Map使用Hash函数来确定性地将键映射到数组内的随机位置(参见图[9 ],只有4位开销 ...
- 转:Spring Boot中使用AOP统一处理Web请求日志
在spring boot中,简单几步,使用spring AOP实现一个拦截器: 1.引入依赖: <dependency> <groupId>org.springframewor ...
- NAT回流(Twice NAT)Hairping 参数详解
内网用户需要通过域名访问内网的服务器,一般商用环境是无法访问的,需要经过以下配置,原理不说了,直接说配置. nat (inside,inside) source dynamic inside-net ...
- oracle开启关闭日志归档
oracle归档日志开启之后,会产生大量的日志,需要定时清理以及不重要的数据库可以不开启归档模式,下面介绍一下oracle归档开启.关闭以及日志的删除:一.oracle归档日志开启及关闭1.登录服务端 ...
- 一台电脑如何管理多个ssh key
目录 一.生成ssh key 1.1 生成密钥(必须) 1.2 设置路径 (可选) 1.3 指定密语字符串(可选) 二.设置ssh key的代理 2.1. 首先查看代理 2.2. 添加私钥 三.添加公 ...
- Solr单机配置详解
Solr 单机版安装 安装环境 安装 jdk:JDK 版本: jdk-8u11-linux-x64.tar.gz 环境变量配置; export JAVA_HOME=/usr/local/jdk exp ...
- Cannot forward after response has been committed问题的解决
Cannot forward after response has been committed问题解决及分析 通过TOMCAT把系统启动,可以正常登陆门户,登陆进去选择子系统的时候点击登陆的时候,可 ...
- 从零开始的openGL——四、纹理贴图与n次B样条曲线
前言 在上篇文章中,介绍了如何加载绘制模型以及鼠标交互的实现,并且遗留了个问题,就是没有模型表面没有纹理,看起来很丑.这篇文章将介绍如何贴纹理,以及曲线的绘制. 纹理贴图 纹理加载 既然是贴图,那首先 ...