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, #}
  FIRST(B)
  FIRST(D), FIRST(C), FOLLOW(C)
Follow(C)={#}
Follow(D)={a,#}

所以

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->ε)有交集所以该G(S)不是LL(1)文法。

2.判断下列文法是否是LL(1)文法?

E -> TE'
E' -> +TE' | ε
T -> FT'
T' -> *FT' | ε
F -> (E) | i

解:由题可得

SELECT(E'->+TE')=FIRST(+TE')={+}
SELECT(E'->ε)=follow(E')=follow(E)={#, )}
SELECT(T'->*FT')=FRIST(*FT')={*}
SELECT(T'->ε)=follow(T')=follow(T)={#, ), +}
SELECT(F->(E))=FRIST((E)) ={(}
SELECT(F->i)=FRIST(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(E->TE) =FIRST(TE')=FIRSI(T)-FIRST(F)U{*}={(, i, *}
SELECT(E'->+TE')=FIRST(+TE')={+}
SELECT(E'->ε)=follow(E')=follow(E)={#, )}
SELECT(T -> FT')=FRIST(FT')=FIRST(F)={(, i}
SELECT(T'->*FT')=FRIST(*FT')={*}
SELECT(T'->ε)=follow(T')=follow(T)={#, ), +}
SELECT(F->(E))=FRIST((E)) ={(}
SELECT(F->i)=FRIST(i) ={i}

伪代码:

void ParseE(){
  switch(lookahead){
    case '(','i', '*':
      ParseT();
      ParseEP();
      break;
    default:
      print("语法错误 \n");
      exit(0);
  }
} void ParseEP(){
  switch(lookahead){
    case '+':
      MatchToken('+');
      ParseT();
      ParseEP();
      break;
    case '#', ')':
      break;
    default:
      print("语法错误 \n");
      exit(0);
  }
} void ParseT(){ 
  switch(lookahead){
    case '(','i':
      ParseF();
      ParseTP();
      break;
    default:
      print("语法错误 \n");
      exit(0);
  }
}
void ParseTP(){
  switch(lookahead){
    case '*':
      MatchToken('*');
      ParseF();
      ParseTP();
      break;
    case '#', ')', '+':
      break;
    default:
      print("语法错误 \n");
      exit(0);
    }
  }
void ParseF(){
  switch(lookahead){
    case '(':
      MatchToken('(');
      ParseE();
      MatchToken(')');
      break;
    case 'i':
      MatchToken('i');
      break;
    default:
      print("语法错误 \n");
      exit(0);
    }
  }

  

 4.加上词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

编译原理之LL(1)文法的判断,递归下降分析程序的更多相关文章

  1. 作业十一——LL(1)文法的判断,递归下降分析程序

    作业十一——LL(1)文法的判断,递归下降分析程序 判断是否为LL(1)文法 选取有多个产生式的求select,只有一条产生式的无需求select 同一个非终结符之间求交集,全部判断为空后则为LL(1 ...

  2. 编译原理 #02# 简易递归下降分析程序(js实现)

    // 实验存档 截图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

  3. 编译原理:LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  4. 十一次作业——LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  5. LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da | ε (3)B -> cC (4)C -> aADC | ε (5)D -> b | ε 验证文法 G ...

  6. 第十一次作业 LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  7. 第十一次 LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  8. Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析

    Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...

  9. 编译原理-递归下降分析法 c程序部分的分析

    实验三 语法分析程序实验 专业 商软2班   姓名 黄仲浩  学号 201506110166 一. 实验目的      编制一个部分文法分析程序. 二. 实验内容和要求 输入:源程序字符串 输出:正确 ...

随机推荐

  1. poi-tl二次开发

    poi-tl二次开发 poi-tl是一款非常好用的word模板生成库,更新响应快.文档demo齐全.堪称word模板界的小军刀! 写在前面 如果你对word模板技术有了解.或者有兴趣,更甚者工作中接触 ...

  2. set容器

    set容器简介: 1) set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2) set采用红黑树变体的数据结构实现,红 ...

  3. react-native 相对项目路径导入组件 ___ babel-plugin-module-resolver

    babel-plugin-module-resolver 是一个Babel模块解析插件, 在.babelrc中可以配置模块的导入搜索路径. 为模块添加一个新的解析器.这个插件允许你添加新的" ...

  4. Spring简介即Spring Ioc

    Spring框架简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE De ...

  5. Ceph 提供iSCSI存储

    Tgtd+Ceph部署 一.yum安装tgt [root@c720181 ~]# yum --enablerepo=epel -y install scsi-target-utils libxslt ...

  6. 【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求 ...

  7. Qt5教程: (9) Qt多线程

    目录 0. 创建工程 1. QThread 源码一览 2. QThread相关方法介绍 2.1 启动线程 2.2 关闭线程 2.3 阻塞线程 2.4线程状态判断 2.5 设置优先级 2.6 信号 3. ...

  8. 小白学 Python 爬虫(20):Xpath 进阶

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  9. ORACLE存储过程详解

    1.定义 所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给 ...

  10. jq触发oninput事件

    之前一直在用jq的change()方法来处理输入框的值变化事件,以及触发输入框的变化事件. 后来发现change()方法有个弊端,change事件的发生条件是:输入框的值value发生变化,并且输入框 ...