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

     

  • 相关阅读:
    HDU1312 ZOJ2165 Red and Black
    HDU1312 ZOJ2165 Red and Black
    HDU1181 变形课【DFS】
    codevs1017 乘积最大
    codevs1220 数字三角形
    codevs1169 传纸条
    codevs1219 骑士游历
    codevs1010 过河卒
    codevs1166 矩阵取数游戏
    codevs1154 能量项链
  • 原文地址:https://www.cnblogs.com/zzj420133722/p/11892394.html
Copyright © 2011-2022 走看看