码迷,mamicode.com
首页 > 其他好文 > 详细

递归下降分析程序报告

时间:2016-12-18 20:51:47      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:class   修改   word   default   getc   .exe   执行   运行   递归   

 

实验一、递归下降分析程序实验

专业 商业软件工程   姓名 姓名 学号 201506110148

一、        实验目的

 

编译递归下降分析程序识别c语言文法

 

二、        实验内容和要求

  1. 简单写出c语言文法
  2. 分析c语言文法是否为LL1文法,若不是,修改成LL1文法。
  3. 编写程序实现对c语言LL1文法判断是否有语法错误

 

三、        实验方法、步骤及结果测试

 1.      源程序名:递归下降分析程序

源程序名递归下降分析程序.c

可执行程序名:递归下降分析程序.exe

2.      原理分析及流程图

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

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

#include<stdio.h>
#include <string.h>
void scaner();
void E();
void E1();
void T();
void T1();
void F();
void error();
char proce[100],ch,token[20];
int syn,i,j,m,sum=0;
char *keyword[6]= {"begin","if","then","while","do","end"};
main()
{
    i=0;//记录输入多少个字符
    printf("\n 请输入词法分析程序:");
      do{
                 ch=getchar();
                 proce[i]=ch;
                 i++;
      }while (ch!=‘#‘);
      i=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");

    i=0;

    scaner();
     E();
     if (syn==0)
              printf("\n 语法正确. \n");
     else     printf("\n  语法失败. \n");

}
void scaner()
{
        for (j=0;j<20;j++)
            token[j]=NULL;//将token赋值为空
        m=0;
        sum=0;
        ch=proce[i];
        i++;
        while (ch==‘ ‘)
        {
            ch=proce[i++];
        }
        if (ch>=‘a‘&& ch<=‘z‘)
           {while (ch>=‘a‘&& ch<=‘z‘||ch>=‘0‘ && ch<=‘9‘)
                  {
                   token[m++]=ch;
                   ch=proce[i++];//继续看后面的
                  }

            syn=10;i--;//判断为变量
            for (j=0;j<6;j++)
                if(strcmp(token,keyword[j])==0)
                    {
                        syn=j+1;
                         break;
                     }//如果有可以匹配的就为关键字
           }
 else
            if(ch>=‘0‘ && ch<=‘9‘)
            {while (ch>=‘0‘ && ch<=‘9‘)
              {
                sum=sum*10+(ch-‘0‘);
                ch=proce[i];
                i++;
              }
              syn=11;
              i--;
            }
          else
                switch(ch)
                {
                  case ‘<‘: token[m]=ch;
                             m++;
                            ch=proce[i];
                            i++;
                            if (ch==‘>‘)
                                {
                                    syn=21;
                                   token[m]=ch;
                                   m++;
                                 }
                            else if (ch==‘=‘)
                                {
                                    syn=22;
                                   token[m]=ch;
                                   m++;
                                 }
                                 else
                                    {
                                        syn=20;
                                        i--;
                                    }
                             break;

                  case ‘>‘: m=0;
                            token[m]=ch;
                            m++;
                            ch=proce[i];
                            i++;
                            if (ch==‘=‘)
                            {
                             syn=24;
                             token[m]=ch;
                             m++;
                            }
                            else
                                {
                                    syn=23;
                                    i--;
                                }
                            break;
                  case ‘:‘: m=0;
                            token[m++]=ch;
                            ch=proce[i++];
                            if (ch==‘=‘)
                            {
                                syn=18;
                              token[m++]=ch;
                            }
                            else
                                {
                                    syn=17;
                                    i--;
                                }
                            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;
                }
}
void E()
{
    printf("E ");
    T();
    E1();

}
void E1()
{
    printf("E1 ");
    if (syn==13)
    {
        scaner();
        T();
        E1();
    }
    else {
        if (syn!=28 && syn!=0)
        error();
    }
}
void T()
{
    printf("T ");
    F();
    T1();
}
void T1()
{
    printf("T1 ");
    if (syn==15) {
        scaner();
        F();
        T1();
    }
    else {
        if (syn!=28 && syn!=0 && syn!=13) error();
    }
}

void F()
{
    printf("F ");
    if (syn==27)
    {
        scaner();
        E();
        if(syn==28) scaner();
        else error();
    }
    else if (syn==11 || syn==10)
      scaner();

}

void error()
{
    printf("\n (%d,%s)语法错误! \n",syn, token);
}
  1. 4.      运行结果及分析

  技术分享

四、        实验总结

 程序还有问题,今后在改进

 

递归下降分析程序报告

标签:class   修改   word   default   getc   .exe   执行   运行   递归   

原文地址:http://www.cnblogs.com/RE148/p/6195298.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!