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 }

递归下降语法分析程序:

  1. void ParseE() {
  2.  
  3. switch (lookahead) {
  4.  
  5. case '(','i':
  6.  
  7. ParseT();
  8.  
  9. ParseE '();
  10.  
  11. break;
  12.  
  13. default:
  14.  
  15. print("syntax error \n");
  16.  
  17. exit(0);
  18.  
  19. }
  20.  
  21. }
  22.  
  23. void ParseE'(){
  24.  
  25. switch(lookahead)
  26.  
  27. {
  28.  
  29. case '+':
  30.  
  31. MatchToken('+');
  32.  
  33. ParseT();
  34.  
  35. ParseE '();
  36.  
  37. break;
  38.  
  39. case ')','#':
  40.  
  41. break;
  42.  
  43. default:
  44.  
  45. print("syntax error \n");
  46.  
  47. exit(0);
  48.  
  49. }
  50.  
  51. }
  52.  
  53. void ParseT() {
  54.  
  55. switch (lookahead) {
  56.  
  57. case '(','i':
  58.  
  59. ParseF();
  60.  
  61. ParseT '();
  62.  
  63. break;
  64.  
  65. default:
  66.  
  67. print("syntax error \n");
  68.  
  69. exit(0);
  70.  
  71. }
  72.  
  73. }
  74.  
  75. void ParseT'(){
  76.  
  77. switch(lookahead){
  78.  
  79. case'*':
  80.  
  81. MatchToken('*');
  82.  
  83. ParseF();
  84.  
  85. ParseT'();
  86.  
  87. break;
  88.  
  89. case'+',')','#':
  90.  
  91. break;
  92.  
  93. default:
  94.  
  95. print("syntax error \n");
  96.  
  97. exit(0);
  98.  
  99. }
  100.  
  101. }
  102.  
  103. void ParseF(){
  104.  
  105. switch(lookahead){
  106.  
  107. case'(':
  108.  
  109. MatchToken('(');
  110.  
  111. ParseE();
  112.  
  113. MatchToken(')');
  114.  
  115. break;
  116.  
  117. case'i':
  118.  
  119. MatchToken('i');
  120.  
  121. break;
  122.  
  123. default:
  124.  
  125. print("syntax error \n");
  126.  
  127. exit(0);
  128.  
  129. }
  130.  
  131. }

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(S)是不 ...

  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. TINY语言采用递归下降分析法编写语法分析程序

    目录 自顶向下分析方法 TINY文法 消左提左.构造first follow 基本思想 python构造源码 运行结果 参考来源:聊聊编译原理(二) - 语法分析 自顶向下分析方法 自顶向下分析方法: ...

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

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

随机推荐

  1. selenium处理隐藏元素的方法

    <li class="navbar-nav-item ">       <a href="#" id="cust"> ...

  2. Kotlin协程通信机制: Channel

    Coroutines Channels Java中的多线程通信, 总会涉及到共享状态(shared mutable state)的读写, 有同步, 死锁等问题要处理. 协程中的Channel用于协程间 ...

  3. zabbix自动发现 url 以及对http返回状态码监控实现 告警

    2019-06-04 18:39:12 目的:批量监控业务URL的返回状态码,通过zabbix监控判断业务好坏. 1.zabbix安装 请查看此永久链接:https://www.cnblogs.com ...

  4. php弹出确认框

    下面的代码只需要放在同一个文件中就可以运行了~~ html<a href="__URL__/shanchu/id/{$vo.id}" onclick='return del( ...

  5. 计算机硬件-CPU

    计算机硬件-CPU 冯.诺依曼计算机体系 1.计算机硬件设备由存储器.运算器.控制器.输入设备和输出设备五部分 2.采取二进制形式和指令 3.将程序(数据和指令序列)预先存放在主存储器中,使计算机在工 ...

  6. react可拖动的好用的树结构插件

    react tree 可拖动树结构: github地址: github地址:react-sortable-tree 安装: NPM npm install react-sortable-tree –s ...

  7. 不服跑个分:ARM鲲鹏云服务器实战评测——华为云鲲鹏KC1实例 vs. 阿里云G5实例【华为云技术分享】

    原文链接:https://m.ithome.com/html/444828.htm 今年一月份,华为正式发布了鲲鹏920数据中心高性能处理器,该处理器兼容ARM架构,采用7纳米制造,最高支持64核,主 ...

  8. 使用python实现http服务器

    主要使用python实现了一个http服务器.http服务器实现了用户的注册和登录的简单功能,当然还可以继续扩展. 数据的存储使用的是文件,有兴趣的话可以使用数据库进行存储.当然根据个人兴趣而定. 本 ...

  9. Oracle触发器用法--基础教学

    1.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行.因此触发器不需要人为的去调用,也不能调用.然后,触发器的触发条件其实在你定义的时候就已经设定好了.这里面需 ...

  10. 小白学 Python 爬虫(17):Requests 基础使用

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