zoukankan      html  css  js  c++  java
  • 作业十一

    1. 文法 G(S):

    (1)S -> AB

    (2)A ->Da|ε

    (3)B -> cC

    (4)C -> aADC |ε

    (5)D -> b|ε

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

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

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

    E()

        {T();

           E'();

         }

    E'()

    T()

    T'()

    F()

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

    1.

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

    所以文法G(S)不是LL(1)文法

    2.

     消除左递归:

    E-->TE'

    E'-->+TE' | ε 

    T-->FT' 

    T'-->*FT' | ε 

    F-->(E) | i

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

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

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

    SELECT(T'-->ε )=FOLLOW(T')={#}

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

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

    所以

    SELECT(E'-->+TE' )  ∩  SELECT(E'-->ε )= ∅

    SELECT(T'-->ε )  ∩   SELECT(F-->(E) )= ∅

    SELECT(F-->(E) )  ∩   SELECT(F-->i)= ∅

    该文法是LL(1)文法。

    3.

    void ParseE(){

        switch(lookahead){
            case (,i:
                ParseT();
                ParseE'();
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
    }
    void ParseE'(){
        switch(lookahead){
            case +:
                MatchToken(+);
                ParseT();
                ParseE'();
                break;
            case #,):
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
    }
    void ParseT(){
        switch(lookahead){
            case (,i:
                ParseF();
                ParseT'();
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
         
    }
    void ParseT'(){
        switch(lookahead){
            case *:
                MatchToken(*);
                ParseF();
                ParseT'();
                break;
            case #,),+:
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
    }
    void ParseF(){
        switch(lookahead){
            case (:
                MatchToken(();
                ParseE()
                MatchToken());
                break;
            case i:
                MatchToken(i);
                break;
            default:
                printf("syntax error ");
                exit(0);
        }
    }
     
     
     
     
    4.
  • 相关阅读:
    为什么基于TCP的应用需要心跳包(TCP keep-alive原理分析)
    「DDoS攻击」兴风作浪,教你如何有效防护!
    你还敢乱粘贴吗?
    TODO git如何去掉烦人的merge?
    Git修改已经push到远程的commit信息
    Oracle删除唯一索引失败提示ORA-01418:指定的索引不存在 ORACLE
    mybatis逆向生成代码 [ERROR] No plugin found for prefix 'mybatis-generator' in the current project and in the plugin groups
    MySQL 中 redo log、undo log、binlog 的总结
    VATT: Transformers for Multimodal Self-Supervised Learning from Raw Video, Audio and Text
    OPT: Omni-Perception Pre-Trainer for Cross-Modal Understanding and Generation
  • 原文地址:https://www.cnblogs.com/dengweijiang/p/11908444.html
Copyright © 2011-2022 走看看