1. 文法 G(S):

(1)S -> AB

(2)A ->Da|ε

(3)B -> cC

(4)C -> aADC |ε

(5)D -> b|ε

验证文法 G(S)是不是 LL(1)文法?

解:

  Select(A -> Da) = First(Da) = {b,a}

  Select(A -> ε) = (Follow(ε)-{ε})∪Follow(A) = {b,a,c,ε}

  Select(C -> aADC) = First(aADC) = {a}

  Select(C -> ε) = (Follow(ε)-{ε})∪Follow(C) = {ε}

  Select(D -> b) = First(b) = {b}

  Select(D -> ε) = (Follow(ε)-{ε})∪Follow(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' -> ε) = (FIRST(ε) - { ε }) U FOLLOW(E') = FOLLOW(E') = { ) , ε }

SELECT(T' -> *FT') = FRIST(*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 -> i) = ø

∴ 该文法是LL(1)文法。

3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。

E()

{T();

E'();

}

E'()

T()

T'()

F()

解:

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)文法的判断,递归下降分析程序的更多相关文章

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

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

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

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

  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)文法--递归下降程序

    递归下降程序 递归下降程序一般是针对某一个文法的.而递归下降的预测分析是为每一个非终结符号写一个分析过程,由于文法本身是递归的,所以这些过程也是递归的. 以上是前提. Sample 假如给的是正规式子 ...

  8. 作业十一——LL(1)文法的判断

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

  9. 小程序内嵌H5页面判断微信及小程序环境

    判断微信及小程序环境 1.H5页面引入jweixin-1.3.2.js 2. var ua = window.navigator.userAgent.toLowerCase(); if(ua.matc ...

随机推荐

  1. openwrt配置内核,加载air720 4G模块的USB串口设备

    1,进入openwrt源码包,键入 make menuconfig 2,配置如下 kernel modules  ---> USB Support---> <*> kmod-u ...

  2. Ubuntu下的安装notepad++

    Ubuntu下的安装方法: sudo add-apt-repository ppa:notepadqq-team/notepadqq sudo apt-get update sudo apt-get ...

  3. select into outfile的sql语句

             SELECT INTO…OUTFILE语句把表数据导出到一个文本文件中,并用LOAD DATA …INFILE语句恢复数据.但是这种方法只能导出或导入数据的内容,不包括表的结构,如果 ...

  4. jmeter之-非GUI模式&登录实战

    1.执行测试脚本 jmeter -n -t JMeter分布式测试示例.jmx 2.指定结果文件及日志路径 jmeter -n -t JMeter分布式测试示例.jmx -l report\01-re ...

  5. ASP.NET MVC 分页之HtmlHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptograph ...

  6. JS-动态加载

    var s = document.createElement('script'); s.setAttribute('src', ''); s.setAttribute('type', 'text/ja ...

  7. pandas中的quantile函数

    https://blog.csdn.net/weixin_38617311/article/details/87893168 data.price.quantile([0.25,0.5,0.75]) ...

  8. 用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表

    目录 目录 前文列表 扩展阅读 定义数据模型 models 创建表 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 ...

  9. PHP面试 MySQL查询优化

    MySQL查询优化 面试题一 请简述项目中优化SQL语句执行效率的方法,从那些方面,SQL语句性能如何分析? 优化查询过程中的数据访问.优化长难的查询语句.优化特定类型的查询语句 分析SQL语句方法 ...

  10. 弹出框中的AJAX分页

    $(function() { $("body").on("click",".set-topic",function(){ /*获取所有题目接 ...