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. 十一:外观模式详解(Service,action与dao)

    定义:外观模式是软件工程中常用的一种软件设计模式.它为子系统中的一组接口提供一个统一的高层接口.这一接口使得子系统更加容易使用. 该定义引自百度百科,它的表现很简单,将一系列子接口的功能进行整理,从而 ...

  2. curl sftp libcurl 功能使用

    #include <curl/curl.h> #undef DISABLE_SSH_AGENT struct FtpFile { const char *filename; FILE *s ...

  3. A dependency may only have one source

    在使用Flutter的时候添加依赖报错了 Error on line 21, column 5 of pubspec.yaml: A dependency may only have one sour ...

  4. vue学习指南:第七篇(详细) - Vue的 组件通信

    Vue 的 父传子 子传父 一.父组件向子组件传值: 父传子 把需要的数据 传递给 子组件,以数据绑定(v-bind)的形式,传递到子组件内部,供子组件使用  缩写是(:) 1.创建子组件,在src/ ...

  5. AI 的架构与核心

    AI 的架构 人工智能的架构分为三层:应用层.技术层和基础层. 应用层聚焦在人工智能和各行业各领域的结合.技术层是算法.模型和技术开发.基础层则是计算能力和数据资源. 数据收集:获取什么类型的数据,数 ...

  6. SQL的概念与发展 - 极客时间学习笔记

    了解SQL SQL的两个重要标准是SQL92和SQL99. SQL语言的划分 DDL,也叫Data Definition Language,也就是数据定义语言,用来定义数据库对象,包括数据库.数据表和 ...

  7. jar 冲突、class 冲突的检测脚本

    思路很简单,解开war包,解开 jar 包,发现有同名 package.class 就报出来,不管是否“兼容” .. import zipfile import io from collections ...

  8. PDFium-PDF开源之旅

    1.安装python 2.7 https://blog.csdn.net/lzfly/article/details/27077487 https://www.jianshu.com/p/8bb348 ...

  9. Nginx配置参数中文详细说明

    #定义Nginx运行的用户和用户组user www www;##nginx进程数,建议设置为等于CPU总核心数.worker_processes 8;##全局错误日志定义类型,[ debug | in ...

  10. windows 上jenkins slave 执行脚本提示成功,但是没有运行

    控制台结果,但是脚本没有运行Started by user admin Building remotely on test_1110 in workspace D:\jenkins\workspace ...