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

    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()

    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.加上实验一的词法分析程序,形成可运行的语法分析程序,分析任意输入的符号串是不是合法的表达式。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    char prog[]="a+b*c#",token[20]; //输入程序段,单词符号
    char ch;
    int syn,p,m,n,sum;//单词符号类型syn,整数sum
    char *rwtab[6] = {"begin","if","then","while","do","end"};
     
    void E();
    void T();
    void E1();
    void T1();
    void F();
    void error();
     
    void scaner(){
        for (n=0;n<20;n++)
            token[n]=NULL;
        m=0;
        sum=0;
        ch=prog[p++];
        while(ch==' '){ //跳过空格
            ch=prog[p++];
        }
        if(ch>='a'&&ch<='z'){ //判断单词
            while(ch>='a'&&ch<='z'){
                token[m++]=ch;
                ch=prog[p++];
            }
            syn=10;
            p--;
            for(n=0;n<6;n++){
                if(strcmp(token,rwtab[n])==0){
                    syn=n+1;
                    break;
                }
            }
        }
        else{  
            if(ch>='0'&&ch<='9'){ //判断数字
                while(ch>='0'&&ch<='9'){
                    sum=sum*10+(ch-'0');
                    ch=prog[p++];
                }
                syn=11;
                p--;
            }
            else{
                switch(ch){
                    case '<':
                        token[m++]=ch;
                        ch=prog[p++];
                        if(ch=='>'){ //<>
                            syn=22;
                            token[m++]=ch;
                        }
                        else if(ch=='='){   //<=
                            syn=21;
                            token[m++]=ch;
                        }
                        else{   //<
                            syn=20;
                            p--;
                        }
                        break;
                     
                    case '>':
                        m=0;
                        token[m++]=ch;
                        ch=prog[p++];
                        if(ch=='='){    //>=
                            syn=24;
                            token[m++]=ch;
                        }
                        else{   //>
                            syn=23;
                            p--;
                        }
                        break;
                         
                    case ':':
                        m=0;
                        token[m++]=ch;
                        ch=prog[p++];
                        if(ch=='='){    //:=
                            syn=18;
                            token[m++]=ch;
                        }
                        else{   //:
                            syn=17;
                            p--;
                        }
                        break;
                         
                    case '+':syn=13;token[0]=ch;break;
                    case '-':syn=14;token[0]=ch;break;
                    case '*':syn=15;token[0]=ch;break;
                    case '/':syn=16;token[0]=ch;break;
                    case '=':syn=25;token[0]=ch;break;
                    case ';':syn=26;token[0]=ch;break;
                    case '(':syn=27;token[0]=ch;break;
                    case ')':syn=28;token[0]=ch;break;
                    case '#':syn=0;token[0]=ch;break;
                    default:syn=-1;token[0]=ch;break;
                }
            }
        }
    }
     
    void E(){
        T();
        E1();
    }
     
     
     
    void E1(){
        if (syn == 13){
            scaner();
            T();
            E1();
        }
        else if(syn ==0 || syn == 28){
             
        }
        else
            error();
    }
     
    void T(){
        F();
        T1();
    }
     
    void T1(){
        if(syn == 15){
            scaner();
            F();
            T1();
        }
        else if (syn == 0 || syn == 28 || syn ==13){
             
        }
        else
            error();
    }
     
    void F(){
        if(syn == 27){
            scaner();
            E();
            if(syn == 28){
                scaner();
                printf("success
    ");
            }
            else
                error();
        }
        else if(syn == 11 || syn == 10){
            scaner();
            printf("success
    ");
        }  
        else
            error();
    }
     
    void error(){
        printf("error
    ");
        printf("
    (%s,出错!)",token);
    }
     
    main(){
        scaner();
        E();
    }
    

     

  • 相关阅读:
    leetcode 131. Palindrome Partitioning
    leetcode 526. Beautiful Arrangement
    poj 1852 Ants
    leetcode 1219. Path with Maximum Gold
    leetcode 66. Plus One
    leetcode 43. Multiply Strings
    pytorch中torch.narrow()函数
    pytorch中的torch.repeat()函数与numpy.tile()
    leetcode 1051. Height Checker
    leetcode 561. Array Partition I
  • 原文地址:https://www.cnblogs.com/zzj420133722/p/11892394.html
Copyright © 2011-2022 走看看