zoukankan      html  css  js  c++  java
  • 11 LL(1)文法的判断,递归下降分析程序

    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 -> ε) ≠ ∅

        Select(C -> aADC) ∩ Select(C -> ε) = ∅

        Select(D -> b) ∩ Select(D -> ε) = ∅

    ∴文法G(s)不是LL(1)文法。

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

    G(s)消除左递归后文法G‘(s):

      E -> TE'  

      E' -> +TE'|ε

      T -> FT'

      T' -> *FT'|ε

      F -> (E) | i

    Select(E' -> +TE') = First(+TE') = {+}

    Select(E' -> ε) = (First(ε)-{ε})∪Follow(E') = {),#}

    Select(T' -> *FT') = First(*FT') = {*}

    Select(T' -> ε) = (First(ε)-{ε})∪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 ) = ∅

    ∴ 文法G‘(s)是LL(1)文法。

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

    void ParseE(){

      switch(lookhead){

        ParseT();

        ParseE'();

        break;

      }

    void PareseE'(){

      switch(lookhead){

        case +:

          MatchToken(+);

          ParseT();

          ParseE'();

          break;

        case ),#:

          MatchToken(#);

          break;

        default:

          print("syntax error ");

          exit(0);

      }

    }

    void ParseT(){

      switch(lookhead){
        case (,i:

          ParseF();

          ParseT'();

          break;

         default:

           print("syntax error ");

           exit(0);

      }

    }

    void ParseT'(){

      switch(lookhead){

        case *:

          MatchToken(*);

          ParseF();

          ParseT'();

          break;

         case #:

           MatchToken(#);

          MatchToken(+);

           MatchToken());

           break;

        default:

          print("syntax error ");

          exit(0);

      }

    }

    void ParseF(){

      switch(lookhead){

        case (:

          MatchToken(();

          ParseE();

          MatchToken());

          break;

        case i:

          MatchToken(i);

          break;

        default:

           print("syntax error ");

           exit(0);

      }

    }

     

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

  • 相关阅读:
    使用QQ邮箱发送邮件,QQ邮箱的smtp设置
    Linux常用命令
    Pycharm批量查找替换功能
    HTML/CSS学习笔记
    什么样的人适合做自动化测试
    如何测试一个WEB的输入框?
    我收集的学习网站
    SQL查询练习(一)
    linux消息队列应用编程
    linux共享内存简单介绍以及编码演示
  • 原文地址:https://www.cnblogs.com/HvYan/p/11888337.html
Copyright © 2011-2022 走看看