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

  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 ...

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

    递归下降程序 递归下降程序一般是针对某一个文法的.而递归下降的预测分析是为每一个非终结符号写一个分析过程,由于文法本身是递归的,所以这些过程也是递归的. 以上是前提. 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. 第十三次作业——回归模型与房价预测&第十一次作业——sklearn中朴素贝叶斯模型及其应用&第七次作业——numpy统计分布显示

    第十三次作业——回归模型与房价预测 1. 导入boston房价数据集 2. 一元线性回归模型,建立一个变量与房价之间的预测模型,并图形化显示. 3. 多元线性回归模型,建立13个变量与房价之间的预测模 ...

随机推荐

  1. MyBatis面试题集合,90%会遇到这些问题

    1.#{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc. ...

  2. .Net捕获网站异常信息记录操作日志

    第一步:在Global.asax文件下的Application_Error()中写入操作日志 /// <summary> /// 整个网站出现异常信息,都会执行此方法 /// </s ...

  3. JPA笔记1 ManyToOne

    persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence ver ...

  4. Django基本知识

    一.安装及使用 下载安装 命令行:pip3 install django==1.11.21 pycharm 创建项目 命令行: 找一个文件夹存放项目文件,打开终端: django-admin star ...

  5. JMETER 使用随机变量

    使用场景 在发起流程时,我们需要模拟实际情况,不同的用户可以产生不一样数量的流程实例,因此我们可以使用随机变量还进行模拟. 随机变量实例 1.添加一个循环计数器 2.添加一个循环 循环次数是根据随机变 ...

  6. Code::Blocks 免安装版本下载及配置

    在编程的时候选择一款好用的IDE非常重要,对于初学者或需要开发项目的程序员来说更为重要,众多的IDE中 Code::Blocks 是一个不错的选择.Code::Blocks开源.版本多,并且还有免安装 ...

  7. JS高阶---定时器相关

    首先看几个问题: [主体] (1)定时器真的时定时执行的吗? 顺序验证: 测试结果: 接下来对上述代码做下修改,增加一个长时间工作的消耗,此时再来验证下定时器运行的精准度 结果如下: (2)定时器回调 ...

  8. python 函数,模块知识点运用示例

    给定验证码长度n,生成随机验证码,验证码由数字.字母组成(参考chr()内置方法) # 给定验证码长度n,生成随机验证码,验证码由数字.字母组成(参考chr()内置方法) # 第33-126号(共94 ...

  9. woocommerce根据标题获取相关产品

    我们知道woocommerce的相关文章是根据分类category或标签tag来获取的,能不能实现根据标题来调取相关产品呢?get_posts() 函数可以根据库存.价格.自定义项.搜索条件等不同的标 ...

  10. String强制转换为Date,freemarker标签里date数据的显示问题

    String强制转换为Date,freemarker标签里date数据的显示问题 http://blog.sina.com.cn/s/blog_617f5d090101ut63.html (2014- ...