文法

一、        实验目的

 

      编制一个语法分析程序,实现对词法分析程序所列出的单词序列进行语法检查和分析。

 

二、        实验内容和要求

     实验内容:做一个可以对以下语法的分析程序

              Ssd|a

              Hsf-|&

              Kf+Dg|&

              Mf|*LM

              &(空串);

 实验要求:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。

 

  1. 3.      主要程序段及其解释:

#include<stdio.h>

#include<string.h>

char prog[800],token[20];

char ch;

int syn,p,m,n,sum;

char *rwtab[6]={"begin","if","then","while","do","end"};

main()

{

    p=0;

    printf("\n Please input the source code:\n");

    do

    {

        ch= getchar();

        prog[p++]=ch;

 

    }while(ch='#');

    p=0;

    do

    {

        scaner();

        switch(syn)

        {

            case 11: printf("\n(%d,%d)",syn,sum);break;

            case -1: printf("\n(%s, )",token);break;

            default: printf("\n(%d,%s)",syn,token);

        }

    }while(syn!=0);

    printf("\n  Token Over. \n");

 system("pause");

 

 p=0;

 scaner();

 E();

 if(syn==0)

    printf("\n Syntax success. \n");

 else printf("\n  Syntax fall.  \n");

}

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'||ch>='0'&&ch<='9')

            {

                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=21;token[m++]=ch;

                            }

                            else if(ch='=')

                            {

                                syn=22;token[m++]=ch;

                            }

                            else

                            {

                                sum=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;

                }

    }

    E()

    {

        printf("E ");

        T();

        E1();

    }

    E1()

    {

        printf("E1");

        if(syn==13)

        {

            scaner();

            T();

            E1();

        }

        else

        {

            if(syn!=28&&syn!=0)error();

        }

    }

    T()

    {

        printf("T");

        F();

        T1();

    }

    T1()

    {

        printf{"T1"};

        if(syn==15)

        {

            scaner();

            F();

            T1();

        }

        else

        {

            if(syn!=28&&syn!=13)error();

        }

    }

    F()

    {

        printf("F");

        if(syn==27)

        {

            scaner();

            E();

            if(syn==28)scaner();

            else error();

        }

        else if(syn==11||syn==10) scaner();

    }

    error()

    {

        printf("\n (%d,%s)Syntax Error!\n",syn,token);

    }

 

 

四、        实验总结

 

首先,要明白实验的目的,这个可以让我们了解什么是LL1语法;其次,要写出分析表然后写出实验输出的分析过程;接着写代码;最后显示实验结果。

 

 

posted @ 2016-12-16 21:57  215-万峰  阅读(120)  评论(0)    收藏  举报