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. 图解SSH原理_20190613

    SSH仅仅是一协议标准,其具体的实现有很多,既有开源实现的OpenSSH,也有商业实现方案.使用范围最广泛的当然是开源实现OpenSSH. 2. SSH工作原理 在讨论SSH的原理和使用前,我们需要分 ...

  2. centos 升级python

    1.下载python3.6.1的包 wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz 2.解压 tar -zxvf Pytho ...

  3. 最大流的SAP算法模板

    明天补充~~~先上代码 #include<iostream> #include<string> #include<queue> #include<vector ...

  4. Cascade R-CNN目标检测

    成功的因素: 1.级联而非并联检测器 2.提升iou阈值训练级联检测器的同时不带来负面影响 核心思想: 区分正负样本的阈值u取值影响较大,加大iou阈值直观感受是可以增加准确率的,但是实际上不是,因为 ...

  5. Java中"String.equals()“和"=="的区别

    Do NOT use the `==`` operator to test whether two strings are equal! It only determines whether or n ...

  6. C/C++ C++ 11 std::bind()

    { #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA ...

  7. php 后台转发和重定向的区别及kohana框架当前url加参数方式

    1.重定向是浏览器行为,浏览器地址有变化:转发是后台服务器完成, url地址不变化. 2.kohana获取URL 当前url是http://soyoung.kohana.com/blog/add?id ...

  8. JavaWeb解决中文乱码

    1.Get请求,方案有两种 A:修改Tomcat配置文件 server.xml   URIEncoding="UTF-8" 如:<Connector port="8 ...

  9. visual studio code -- python

    录: 前提: 已安装python 在vsc中安装pthon模块 快速入门 打开控制台(ctrl+shift+P):Python: Select Interpreter,选择python解释器 或者在软 ...

  10. FFMpeg视频解码初探

    在视频解码前,先了解以下几个基本的概念: 编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分. 容器/多媒体文件(Container/File):没有了解 ...