1. 文法 G(S):

(1)S -> AB

(2)A ->Da|ε

(3)B -> cC

(4)C -> aADC |ε

(5)D -> b|ε

验证文法 G(S)是不是 LL(1)文法?

FIRST(Da)={b,a}

  FIRST(ε)={ε}

  FIRST(aADC)={a}

  FIRST(b)={b}

  FOLLOW(A)={c,b,a,#}

  FOLLOW(C)={#,}

  FOLLOW(D)={a,#}

  SELECT(A->Da)=FIRST(Da)={b,a}

  SELECT(A->ε)=FIRST(ε)-{ε}UFOLLOW(A)=FOLLOW(A)={c,b,a,#}

  ∵ SELECT(A->Da) ∩ SELECT(A->ε) ≠ Ø

  ∴ G(S)不是 LL()文法。

2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?


解析:

  表达式文法为:

  (1)E->TE'

  (2)E'->+TE' | ε

  (3)T->FT'

  (4)T'->*FT' | ε

  (5)F->(E) | i

 

 FIRST(+TE')={+}

  FIRST(ε)={ε}

  FIRST(*FT')={*}

  FIRST((E))={ ( }

  FIRST(i)={i}

  FOLLOW(E')={ ),# }

  FOLLOW(T')={+,),#}

  FOLLOW(F)={*,+,),#}

  SELECT(E'->+TE')=FIRST(+TE')={+}

  SELECT(E'->ε)=FIRST(ε)-{ε}UFOLLOW(E')=FOLLOW(E')={ ),# }

  SELECT(T'->*FT')=FIRST(*FT')={*}

  SELECT(T'->ε)=FIRST(ε)-{ε}UFOLLOW(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()文法。

3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。


E()

{T();

E'();

}

E'()

T()

T'()

F()

 解析:

 SELECT集:

  SELECT(E->TE')=FIRST(TE')={ (, i }

  SELECT(E'->+TE')=FIRST(+TE')={+}

  SELECT(E'->ε)=FIRST(ε)-{ε}UFOLLOW(E')=FOLLOW(E')={ ),# }

  SELECT(T->FT')=FIRST(FT')={ (,i }

  SELECT(T'->*FT')=FIRST(*FT')={*}

  SELECT(T'->ε)=FIRST(ε)-{ε}UFOLLOW(T')=FOLLOW(T')={ +,),# }

  SELECT(F->(E))=FIRST((E))={ ( }

  SELECT(F->i)=FIRST(i)={i}

  递归下降语法分析程序:

  void ParseE(){

    switch(lookahead){

      case '(','i':

        ParseT();

        ParseE'();

        break;

      default:

        print("syntax error \n");

        exit();

    }

  }

  void ParseE'(){

    switch(lookahead){

      case '+':

        MatchToken('+');

        ParseT();

        ParseE'();

        break;

      case ')','#':

        break;

      default:

        print("syntax error \n");

        exit();

    }

  }

  void ParseT(){ 

    switch(lookahead){

      case '(','i':

        ParseF();

        ParseT'();

        break;

      default:

        print("syntax error \n");

        exit();

    }

  }

  void ParseT'(){

    switch(lookahead){

      case '*':

        MatchToken('*');

        ParseF();

        ParseT'();

        break;

      case '+',')','#':

        break;

      default:

        print("syntax error \n");

        exit();

    }

  }

  void ParseF(){

    switch(lookahead){

      case '(':

        MatchToken('(');

        ParseE();

        MatchToken(')');

        break;

      case 'i':

        MatchToken('i');

        break;

      default:

        print("syntax error \n");

        exit();

    }

4.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

最新文章

  1. 【代码笔记】iOS-由身份证号码返回性别
  2. 163邮箱问题:554 DT:SPM 163 smtp5,D9GowACHO7RNWNdXmXs1Bw--.9035S2
  3. RunLoop(官方文档翻译)
  4. jQuery 基础(3) -- jQuery 事件
  5. MYSQL 免安装版(windows 7/64)
  6. hiho一下120周 后缀数组一·重复旋律
  7. The file 'MemoryStream' is corrupted! 的解决办法
  8. Log4Net写入到数据库配置过程中的一些小问题备忘
  9. 要源码的快来啊,价值500的OA商业源码免费送给大家,望大家年底奖金多多......
  10. Android之读取 AndroidManifest.xml 中的数据
  11. String的成员方法的使用
  12. Groovy新手教程
  13. HTML5 拼图游戏
  14. PHP反射ReflectionClass、ReflectionMethod 入门教程
  15. Android中显示和隐式Intent的使用
  16. 关于OC中浮点型的计算
  17. Opencv读取并获取视频属性
  18. 简单模拟 Spring
  19. 【BZOJ4126】【BZOJ3516】【BZOJ3157】国王奇遇记 线性插值
  20. Linux下通过命令行mail发送e-mail

热门文章

  1. Linux命令学习神器!命令看不懂直接给你解释!
  2. React项目实战:react-redux-router基本原理
  3. 使用python3编写程序,生成10个随机数,每个元素的值介于1到100之间,并计算所有元素的和、平均值。
  4. Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式
  5. 2020Ubuntu server1804最新安装后的配置
  6. 使用 ALSAlib 播放 wav
  7. 本地Hadoop集群搭建
  8. C语言程序设计(八) 数组
  9. 用Setuptools构建和分发程序包
  10. 详解分页组件中查count总记录优化