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. 写入文件writelines 换行问题

    知识点:在python中没有数组的概念,有列表.元组.字典的概念 问题描述: 在写循环语句的时候,我需要把输出的列表存放到文件上,但是如果没有换行的话,存下的文件就是一坨的字. 所以在存入文件的时候就 ...

  2. angular获取时间

    获取24小时制的时间<h1> {{time}} </h1> <script> angular.module('app', []) .controller('ctrl ...

  3. centos下非yum方式安装docker环境

    1.下载docker源码包 docker官网地址: https://download.docker.com/linux/static/stable/ 选择.tgz的包下载,例如:https://dow ...

  4. Laravel向表里插入字段

    执行: php artisan make:migration add_字段_to_表名_table --table=表名 此时在database/migrations文件夹下会生成一个相应文件,更改如 ...

  5. jvm默认的并行垃圾回收器和G1垃圾回收器性能对比

    http://www.importnew.com/13827.html 参数如下: JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xss256k -XX:M ...

  6. php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpos

    php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpossubstr_count($haystack, $needle [,$o ...

  7. python 排序和查找算法

    一.搜索 1.顺序查找 数据存储在具有线性或顺序关系的结构中时,可顺序访问查找 def sequential_search(ilist, item): pos = 0 while pos < l ...

  8. maven 学习---POM机制

    POM 代表工程对象模型.它是使用 Maven 工作时的基本组建,是一个 xml 文件.它被放在工程根目录下,文件命名为 pom.xml. POM 包含了关于工程和各种配置细节的信息,Maven 使用 ...

  9. vue学习指南:第六篇(详细) - Vue的组件 component

    1. 什么是组件?有两种解释 1. 第一种解释: 什么是组件? 1. 组件是 vue 中的一个可复用的实例,所以new Vue() 是vue中最大的那个组件(根组件),有名字,使用的时候以单标签或双标 ...

  10. composer install 出现“Please provide a valid cache path”

    本文背景:通过deployer部署PHP项目[deployer部署工具:https://deployer.org/] 问题:Php 的laravel框架中执行 composer install 后, ...