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 }

递归下降语法分析程序:

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. 编译原理 #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. Batch Normalization详解

    目录 动机 单层视角 多层视角 什么是Batch Normalization Batch Normalization的反向传播 Batch Normalization的预测阶段 Batch Norma ...

  2. 【JavaEE】之MyBatis插入数据后获取自增主键

    很多时候,我们都需要在插入一条数据后回过头来获取到这条数据在数据表中的自增主键,便于后续操作.针对这个问题,有两种解决方案: 先插入,后查询.我们可以先插入一条数据,然后根据插入的数据的各个字段值,再 ...

  3. Prometheus 安装

    目录 简介 安装部署 环境准备 安装 配置环境变量 配置 启动 简介 prometheus存储的是时序数据,即按相同时序(相同名称和标签),以时间维度存储连续的数据的集合. 时序(time serie ...

  4. Java多线程——锁

    Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...

  5. jQuery九宫格抽奖

    <div id="box"> <div class="content content-1">1</div> <div ...

  6. php 7.4 的 Unpacking inside arrays (...)

    总的说明 php 7.4 增加了一个很有意思的功能 这是官方说明: Unpacking inside arrays <?php$parts = ['apple', 'pear'];$fruits ...

  7. idea 使用下Java JDK安装

    下载idea 百度云: 链接:https://pan.baidu.com/s/1pmDTH-W1_BhSYJAlcAvljQ          提取码:sgmk 下载Java1.8(jdk-8u181 ...

  8. webpack4.0安装及使用(一)

    前言  1.什么是webpack 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建 ...

  9. IO 单个文件的多线程拷贝

    package FileCopyThread; //自建的包,根据个人调整 import java.io.File; import java.io.FileNotFoundException; imp ...

  10. nitacm20317 来自张司机的挑战书

    题目:让你求从x到y中(1<=x<=y<=10^18),二进制一的个数最多的数是哪个,如果有多个相同的答案,输出最小的. 题目链接:https://www.nitacm.com/pr ...