编译原理课程设计

时间:2024.4.21

    

南华大学

计算机科学与技术学院 

编译原理课程设计名:赋值语句,if语句,while循环语句词法,语法及语义分析,中间代码生成程序设计

  专业:计算机科学与技术     班级:计算机091        

  姓名:Dragon              学号20094440116      

  实验地点:8栋 2-209       任课老师:刘星          

 

完成日期:2012.5.14

《编译原理》课程设计指导书

一、 课程设计教学的目的与要求

课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。   

要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写。

设计时间: 1周。

开发工具:

(1)   DOS环境下使用Turbo C;

(2)   Windows环境下使用Visual C++ 。

(3)   其它熟悉语言。

二、课程设计的内容:

设计题一:算术表达式的语法分析及语义分析程序设计。

1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

2.设计内容及要求:

       算术表达式的文法:

〈无符号整数〉∷= 〈数字〉{〈数字〉}

〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉}

〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉}

〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉}

〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’

〈加法运算符〉∷= +|-

〈乘法运算符〉∷= *|/

(1)   可以选择递归下降法、LL(1)、算符优先分析法、LR法完成以上任务,中间代码选用逆波兰式或四元式。

(2)   写出算术表达式的符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(3)   编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

设计题二:布尔表达式的语法分析及语义分析程序设计。

1.目的

通过设计、编制、调试一个布尔表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

2.设计内容及要求

(1)可以选择递归下降法、LL(1)、算符优先分析法、LR法完成以上任务,中间代码选用逆波兰式或四元式。

(2)如1题写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

设计题三:条件语句的语法分析及语义分析程序设计。

1.目的

通过设计、编制、调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。

2.设计内容及要求

IF 〈布尔表达式〉 THEN  〈赋值语句〉  ELSE 〈赋值语句〉

        其中

(1)可以选择递归下降法、LL(1)、算符优先分析法、LR法完成以上任务,中间代码选用四元式。

(2)如1题写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

设计题四:循环语句的语法分析及语义分析程序设计。

1.目的

通过设计、编制、调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。

2.设计内容及要求

WHILE〈布尔表达式〉DO〈赋值语句〉

其中

(1)可以选择递归下降法、LL(1)、算符优先分析法、LR法完成以上任务,中间代码选用四元式。

(2)如1题写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(3)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

设计题五:自选一种常见高级语言为背景,对其进行简化.例如只包括整型常数和其四则运算以及相应的赋值语句,转移语句,条件语句和最简单的输入输出语句等.编制一个包括必要处理阶段(词法分析、语法分析、语义分析、代码生成)简化又完整的编译程序.。

1.目的

对编译的完整过程有一个感性认识,对各个环节的任务,处理方法有一定的熟悉。

2.设计内容及要求

(1)如1题写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(2)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

三、课程特色

《编译原理》课程是理论性较强的课程。其特点是概念多、内容抽象。尤其是文法、形式语言及自动机的概念是计算机专业的理论学习和研究的基础。编译原理与方法对于深刻理解程序设计语言、深入了解程序在计算机中的运行机制、掌握程序设计语言的翻译方法起到不可替代的作用。同时《编译原理》课程也是实践性很强的课程,要求学生在基本掌握了编译理论和技术的基础上,综合应用先修课程及本课程的知识,完成课程的实验和课程设计。

四、课程设计步骤与方法

第一步需要同学给出语法分析方法及中间代码形式的描述及文法和属性文法的描述;或者词法分析方法及符号表和TOKEN代码的设计。

第二步需要同学进行简要的分析与概要设计;

第三步需要同学按照学过的语法分析方法和语法制导翻译方法进行详细的算法设计,然后进行实际编程。

五、课程设计说明书与图纸

课程设计报告书的内容应包括:

1.         设计题目、班级、学号、姓名、完成日期;

2.         给出语法分析方法及中间代码形式的描述、文法和属性文法的设计;或者词法分析方法及符号表和TOKEN代码的设计。

3.         简要的分析与概要设计;

4.         详细的算法描述;

5.         源程序清单;

6.        给出软件的测试方法和测试结果;

7.        设计的评价、收获与体会。

六、课程设计答辩

课程设计完成后由教师上机现场检查并由学生回答老师的提问

七、课程设计进度表

以上布置的任务是基本设计任务,希望同学们自己加大难度,取得更好成绩;同时要求同学们不得出现抄袭现象。

上交内容 :

n   1、以学号命名的文件夹,包括程序源代码,一组较完备的测试数据(存在一个文本文件中);

n   2、课程设计报告(纸质版和电子版都要交,电子版放上面那个文件夹下):包括选题说明,简单的软件需求分析说明,软件设计说明,设计经验总结。

功能描述:该程序具有什么功能?

程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;另外可以附加函数之间的调用关系图、程序总体执行流程图。

设计经验总结包括下列方面:你对你的软件如何评价?你的设计有何特色?你自己觉得应该给多少分?你在编程过程中花时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题?遇到了哪些难题?你是怎么克服的?你的收获有哪些?

           

四、结果分析

1.输入条件语句:if (a > 0 ) a = b;#(正确输入)

2.错误输入:if ( ;# (错误输入,则判断有语法错误)

3.if 语句语法,语义,及中间代码生成

    中间代码

     4.while语句词法及语义,语法分析

While语句的中间代码生成

   

5.  while和if语句综合分析

  

 

                                图5-1

六、课程设计总结:

词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。而语法分析的运行过程,主程序大致流程为:“置初值”à调用scaner函数读下一个单词符号à调用IrParseà结束。递归下降分析的大致流程为:“先判断是否为begin”à不是则“出错处理”,若是则“调用scaner函数”à调用语句串分析函数à“判断是否为end”à不是则“出错处理”,若是则调用scaner函数à“判断syn=0&&kk=0是否成立”成立则说明分析成功打印出来。不成立则“出错处理”。当词法,语法都分析完成后进行重点的语义分析和中间代码生成。首先,用三地址代码表示中间代码,这需要对输入串判断,是为if语句,while语句,还是赋值语句,不同的输入串将跳转到不同的函数进行相应的处理,并得出最终的中间代码。整个过程花费2天的时间,一天用于编写主要代码,并调试出词法功能模块,第二天主要调试语法及语义功能模块的实现,及中间代码生成工作。在设计条件语句的语义的实现算法时,遇到的小小的困难,经过赖心的调试后解决。之 后while循环中尝试加入条件和赋值语句时没遇到什么困难。

自己评分:整个设计于调试总共花费4天左右时间,程序基本实现了赋值语句,if语句,

While循环语句的词法分析与语法分析及语义分析和中间代码生成的功能。程序能找出简单的错误所在及原因。因此我自己觉得可以打优秀!!!

源代码:

//编译原理实验,可进行简单的词法分析和语法分析和语义分析,中间代码生成

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

char prog[80],token[8],ch,ana[80];

int syn,p,m,n,sum,i;

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

char array[10][20];

int liter = 0, W_flag = 0, if_flag = 0;

void  scaner();

int doanaly();

int  yuyi();

void  middle_code();

int main()

{

    while(1)

    {

           p= i = 0;

           W_flag = if_flag = liter = 0;

           printf("\n please input a string(end with '#'):\n\n");

           do{

                  scanf("%c",&ch);

                  prog[p++]= ana[i++] =ch;

                  }while(ch!='#');

           ana[i] = '\0';

           p=0;

        printf("**开始词法分析:**\n");

           do{

                  scaner();

                  switch(syn)

                  {

                         case 11:printf("( %-10d%5d )\n",sum,syn);

                                break;

                         case -1:printf("you have input a wrong string when in scaner\n");

                                getchar();

                                break;//exit(0);

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

                                break;

                  }

          

           }while(syn!=0);

           printf("\n");

           i = doanaly();

           if (i == -1)

           {

                         printf("\n语法分析: a wrong string when in analysis\n");

           }

           else

           {    

                  printf("\n语法分析:  0 error(s), 0 warning(s)\n");

               middle_code();

           }

           getchar();

    }

    return 0;

 }

void  scaner()

 { 

    sum=0;

    for(m=0;m<8;m++)

           token[m++]=NULL;

    ch=prog[p++];

    m=0;

    while((ch==' ')||(ch=='\n'))

           ch=prog[p++];

    if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

    {

                  while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

                  {

                         token[m++]=ch;

                         ch=prog[p++];

                  }

                  p--;

                  syn=10;

                  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++];

           }

           p--;

           syn=11;

    }

    else switch(ch)

    {

           case '<':token[m++]=ch;

                         ch=prog[p++];

                         if(ch=='=')

                         { 

                                syn=22;

                                token[m++]=ch;

                         }

               else

                     { 

                            syn=20;

                                p--;

                         }

              break;

      case '>':token[m++]=ch;

            ch=prog[p++];

            if(ch=='=')

            {

                         syn=24;

                token[m++]=ch;

            }

           else

            { syn=23;

              p--;

            }

           break;

     case '+': token[m++]=ch;

          ch=prog[p++];

          if(ch=='+')

            { syn=17;

              token[m++]=ch;

            }

          else

            { syn=13;

              p--;

            }

          break;

     case '-':token[m++]=ch;

          ch=prog[p++];

          if(ch=='-')

            { syn=29;

              token[m++]=ch;

            }

          else

            { syn=14;

              p--;

            }

          break;

     case '!':ch=prog[p++];

          if(ch=='=')

           { syn=21;

             token[m++]=ch;

           }

          else

          { syn=31;

             p--;

          }

          break;

     case '=':token[m++]=ch;

          ch=prog[p++];

          if(ch=='=')

            { syn=25;

              token[m++]=ch;

            }

          else

            { syn=18;

              p--;

            }

          break;

     case '*': syn=15;

           token[m++]=ch;

           break;

     case '/': syn=16;

           token[m++]=ch;

           break;

     case '(': syn=27;

           token[m++]=ch;

           break;

     case ')': syn=28;

           token[m++]=ch;

           break;

     case '{': syn=5;

           token[m++]=ch;

           break;

     case '}': syn=6;

           token[m++]=ch;

           break;

     case ';': syn=26;

          token[m++]=ch;

          break;

     case '\"': syn=30;

           token[m++]=ch;

           break;

     case '#': syn=0;

           token[m++]=ch;

           break;

     case ':':syn=17;

           token[m++]=ch;

           break;

    default: syn=-1;

         break;

       }

    token[m++]='\0';

 }

 int doanaly()

 {

    int len, i = 0,j =0,leftk = 0, rightk = 0 ,endofk = 0 ,result = 0;

    while(ana[i] == ' ')

           i++;

    len = strlen(ana) - i - 1;

equal:

    //judge the "if"

    if (len > 2 && (strncmp(ana + i,"if",2) == 0))

    {

           if_flag = 1;

           i += 2;   //jump over the "if"

           while(ana[i] == ' ')

                  i++;

           if (ana[i] != '(')

           {    

                  printf("Lose '(' after if \n");

                  result = -1;

           }

           i++; // jump the '('

           leftk++;

           j = i;

           while(ana[i] != '#')

           {

                  if (ana[i] == '(')

                         leftk++;

                  else if (ana[i] == ')')

                  {     rightk++;

                      endofk = i;

                  }

                  else if (ana[i] == ';' && leftk != rightk)

                  {

                      printf("Lose ')'  before ';' \n");

                         result = -1;

                  }

                  else if (ana[i] == '+'|| ana[i] =='-' ||ana[i]!= '&' || ana[i] == '|')

                  {

                         char ch = ana[i];

                         int count = 0;

                         while(ana[i] == ch)  //lian xu suan fu de ge shu bu da 2

                         {    

                                count++;

                                i++;

                         }

                         if (count > 2 )

                         {    

                                printf("The error near the %c\n",ch);

                                result = -1;

                         }

                         i--;

                  }

                  i++;

           }

           if (leftk != rightk)       //judge whether the number of  '(' equals to that of  ')'

           {

               if (leftk > rightk)

                         printf("Lose ')' in the if\n");

                  else

                         printf("Lose '(' in the if\n");

                  result = -1;

           }

           i = endofk;

           if (ana[i] == ')')

                  i++; //jump the right ')'

           while(ana[i] == ' ')  // delete the ' '

                  i++;

           if (ana[i] != ';')    //if not like this "if(....);"  

                  goto equal;

    }

    //judge the "while"

    else if (len > 5 && (strncmp(ana + i , "while", 5) == 0 ))

    {

           W_flag = 1;

           int flag1 = 0, flag2 = 0,t = 0, s =0;

           char arg[2][10];

        i += 5; //jump the "while" five chars

           memset(arg,0,20);

           while(ana[i] == ' ')

                  i++;

        if (ana[i] != '(')   //judge "while" followed by '('

                  result = -1;

        i++;

           while(ana[i] != '#' && ana[i] != ')')

           {    

                if (ana[i] == '<' )

                   { flag1++;t++;s = 0;}

                   else if (ana[i] == '>')

                   { flag2++; t++;s = 0;}

             else

                          arg[t][s++] =ana[j];

             i++;

           }

           if (s == 0)  //judge the param in the"while(param)"

           {

                  printf("the error in the (), no param\n");

                  result = -1;

           }

           if (t != 0 && (arg[0][0] == 0 || arg[1][0] == 0))

           {// judge the two side of ">"

                  if (flag1 != 0)

                         printf("The error near the '<'\n");

                  else if (flag2 != 0)

                         printf("The error near the '>'\n");

                  result = -1;

           }

           if (ana[i] != ')')

           {

                  printf("The while lose ')'\n");

                  result = -1;

           }

           i++;

           while(ana[i] == ' ')

                  i++;

           if (ana[i] != ';')   //goto "=" when such string :"a = b" in the while

                  goto equal;

    }

    else   //finish the "=" analysis

    {

          

           //get the left side string  of "="

        int re = 0, right_para = 0;

//      printf("entry equal\n");

           re = yuyi();

           if (re != 2)

                  return re;

   

        while((ana[i] >= 'A' && ana[i] <= 'Z' )|| (ana[i] >= 'a' && ana[i] <= 'z'))

                  i++;

          

           while(ana[i] == ' ')

                         i++;

   

           //judge the right localtion of "="

           if ((ana[i] == '+' && ana[i + 1] != '=') ||

                  (ana[i] == '-' && ana[i + 1] != '=')|| (ana[i] == '=' && ana[i +1] == '#'))

           {

                  printf("The error near '=' \n");

                  result = -1;

           }

           i++;

           while(ana[i] == ' ') //jump the ' '

                  i++;

           //get the right side string of "="

           while((ana[i] >= 'A' && ana[i] <= 'Z' )|| (ana[i] >= 'a' && ana[i] <= 'z')||

                  (ana[i] >= '0' && ana[i] <= '9'))

           {

                  i++;

                  right_para++;

           }

           if (right_para == 0)

           {

                  printf("Lose right para near the '=' \n");

                  result = -1;

           }

           if (ana[i] == ' ')// check the ";"

           {

                  while(ana[i] == ' ')

                         i++;

                  if (ana[i] != ';')

                  {    

                         printf("Lose ';' \n");

                         result = -1;

                  }

           }

           else if (ana[i] != ';' && ana[i] != ' ')//end up with no ";" wrong

           {    

                         printf("Lose ';' \n");

                         result = -1;

           }

    }

    return result;

 }

 int  yuyi()

 {

     int  rep = 0, i = 0, j= 0, nu = 0;

     char bA[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ", para[8][10], *stoken = NULL;

     int t = 0,eq_begin = 0,r = 0,c = 0,len, s = 0,result = 0, equ_flag =0;

     char plu_all[8];

     while(prog[i] != '#')

     { 

            if (prog[i] == '=')  //find the '='

            {   

                  eq_begin = i;

                  break;

            }

           i++;

     }

     if (eq_begin == 0)  //no '=' in the string

            return -1;

   

     i = 0;

     j = t = 0;

     while(prog[j] != '#')

     {   

            //record the flag

            if(prog[j] == '+' || prog[j] == '-' || prog[j] == '*' || prog[j] == '/')      

                   plu_all[t++] = prog[j];

            if (prog[j] == ';')  // find the ';' in the string

                   equ_flag = 1;

            j++;

     }

    if (t == 0)     //t = 0 means that this string is a equal

           return 2;

     

     printf("**开始语义分析:**\n");

     prog[j] = '\0';

     len = strlen(prog);

     j = eq_begin -1;

     while(prog[j] == ' ') j--;

     while(j >=0)    // return to the beginning of equal dialogue

     {

           if ((prog[j] >= 'A' && prog[j] <= 'Z' )|| (prog[j] >= 'a' && prog[j] <= 'z'))

                  j--;

           else

                  break;

     }

     for(r= 0; r < (len -1 -j); r++)    //delete the "if(a>0)" in "if(a>0) a=g+g+h;"

            prog[r] =prog[r + j +1];

     prog[r] = '\0';

 

     stoken = strtok(prog,"=");  //get the left para of '='

     r = c = 0;

     len = strlen(stoken);

     while(c < len)

            para[r][c++] = *stoken++;

     

     para[r][c] = '\0'; //save the para in the array and make sure that it ends up with '\0'

     while((stoken = strtok(NULL,"+-*/;")) != NULL) // get all the paras

     {

             r++;

             c= 0;

             len = strlen(stoken);

          while(c < len)

                  para[r][c++] = *stoken++;

             para[r][c] = '\0';

     }

     if (r != (t+1))     //judge whether the number of para equals to the number of flag

     {   

            printf("less para near right side of '='\n");

            result = -1;

     }

     if ( t > 1)       //more than two flags

     {

                  s = 0;

                  nu = t;

                  int flag = 0, be = 0;

                  while(s < t && nu > 1) //manage the '*' and '/' first

                  {

                      //first '*' || '/'   

                         if ((plu_all[s] == '*' || plu_all[s] == '/') && flag == 0)

                         {                  

                                printf("%c = %s %c %s\n",bA[rep],para[s + 1],plu_all[s],para[s + 2]);

                                sprintf(array[liter],"%c = %s %c %s\n",bA[rep],para[s + 1],plu_all[s],para[s + 2]);

                                liter++;

                                flag++;

                                nu--;

                                plu_all[s] = 0;

                                be = s;      //record the starting  of server "*" || "/"

                                para[s+1][0] = bA[rep]; //save the change

                                para[s+1][1] ='\0';

                                rep++;

                         }

                         //second lian xu '*' || '/'

                         else if ((plu_all[s] == '*' || plu_all[s] == '/') && flag != 0 &&

                                (plu_all[s-1] == 0 || plu_all[s-1] == 0))

                         {    

                                printf("%c = %c %c %s\n",bA[rep],bA[rep - 1],plu_all[s],para[s + 2]);

                                sprintf(array[liter],"%c = %c %c %s\n",bA[rep],bA[rep - 1],plu_all[s],para[s + 2]);

                                liter++;

                                plu_all[s] = 0;

                                int gg = be;  //use the new bA represent the old bA[]

                                while(gg <= s)

                                {

                                       para[gg+1][0] = bA[rep];      //save the change

                                       para[gg+1][1] ='\0';

                                       gg++;

                                }

                                nu--;

                                rep++;

                         }

                         //not lian xu '*' || '/'

                         else if ((plu_all[s] == '*' || plu_all[s] == '/') && flag != 0 &&

                                (plu_all[s-1] != 0 && plu_all[s-1] != 0))

                         {    

                                printf("%c = %s %c %s\n",bA[rep],para[s+1],plu_all[s],para[s + 2]);

                                sprintf(array[liter],"%c=%s %c %s\n",bA[rep],para[s+1],plu_all[s],para[s + 2]);

                                liter++;

                                plu_all[s] = 0;

                                nu--;

                                para[s+1][0] = bA[rep];

                                para[s+1][1] ='\0';

                                rep++;

                         //     printf("ffff\n");

                         }           

                         s++;

                  }    

//                printf("dddddfffffffffffffffd\n");

                  int g= 0;

                  nu = s = 0;

                  while(s < t)    //computer the number of flag

                  {    

                         if (plu_all[s] != 0)

                         {    

                                nu++;

                                g = s;

                         }

                         s++;

                  }

                  if (nu == 1 )

                  { //only one flag last

           //            printf("dddd\n");

                         if (g == 0) //if leave the first flag

                         {     printf("%s = %c %c %s\n",para[0], bA[rep-1], plu_all[g], para[1]);

                             sprintf(array[liter],"%s = %c %c %s\n",para[0], bA[rep-1], plu_all[g], para[1]);

                                liter++;

                         }

                         else     // not the first flag

                         {     printf("%s = %c %c %s\n",para[0], bA[rep-1], plu_all[g], para[g + 2]);

                             sprintf(array[liter],"%s = %c %c %s\n",para[0], bA[rep-1], plu_all[g], para[g + 2]);

                                liter++;

                         }

                  }

                  else  //more than two flags

                  {

                         s = -1;

                         while(nu > 1)     //continue when more than one flag

                         {  

                 

                                s++;

                                if (plu_all[s] != 0 && rep > 0 )//if rep bigger than zero

                                {                                 //means that having '*' || '/' in the ahead

                                    if (s !=0 ) //judge whether is the first flag

                                       {     printf("%c = %c %c %s\n",bA[rep], bA[rep-1], plu_all[s], para[s+ 2]);

                                              sprintf(array[liter],"%c = %c %c %s\n",bA[rep], bA[rep-1], plu_all[s], para[s+ 2]);

                                              liter++;

                                       }

                                       else if (s == 0)

                                       {     printf("%c = %s %c %s\n",bA[rep], para[s+1], plu_all[s], para[s+ 2]);

                                              sprintf(array[liter],"%c = %s %c %s\n",bA[rep], para[s+1], plu_all[s], para[s+ 2]);

                                              liter++;

                                       }

                                       nu--;plu_all[s] = 0;

                                       rep++;    

                                }

                                else if (plu_all[s] != 0 && rep== 0)

                                {

                                       printf("%c = %s %c %s\n",bA[rep], para[s+1], plu_all[s], para[s+ 2]);

                                       sprintf(array[liter],"%c = %s %c %s\n",bA[rep], para[s+1], plu_all[s], para[s+ 2]);

                                       liter++;

                                       nu--;plu_all[s] = 0;

                        rep++;

                                }

                         }    

                         s = 0;

                         while(plu_all[s] == 0)    //find last flag

                                s++;

                         printf("%s = %c %c %s\n",para[0], bA[rep-1], plu_all[s], para[s + 2]);

                         sprintf(array[liter],"%s = %c %c %s\n",para[0], bA[rep-1], plu_all[s], para[s + 2]);

                         liter++;

                  }

     }

     else if (t == 1)  //only one flag

     {

                  printf("%s = %s %c %s\n\n",para[0],para[1],plu_all[0],para[2]);

                  sprintf(array[liter],"%s = %s %c %s\n\n",para[0],para[1],plu_all[0],para[2]);

                  liter++;

     }

     if (equ_flag == 0)

     {    printf("Lose ';' in the end\n");

         result = -1;

     }

    return result;

 }

 void print_arr()

 {

     int j = 0;

     while(j <= liter)

     {

                  printf("    %s\n",array[j]);

                  j++;

     }

 }

 void middle_code()

 {

          

        int L = 0, j = 0, c = 0, cc = 0;

           char wh[10];

      

        printf("\n*******MIDDLE CODE*******\n");

        if (if_flag == 1 && W_flag == 1)

           {

                  printf("L%d:  while ",L);

                  L++;

            j = 0;

                  while(ana[j] != '(')

                         j++;

                  j++;

                  while(ana[j] != ')')

                  {     printf("%c",ana[j]);

                         wh[c++] = ana[j];

                         j++;

                  }

                  printf(" goto L%d\n", L);

                  L++;

                  printf("    Ti := 0 \n    goto out\n");

                  printf("L%d :    if ", L -1);

                  j++;

                  while(ana[j] != '(')

                         j++;

                  j++;

                  while(ana[j] != ')')

                         printf("%c", ana[j++]);

                  printf(" goto L%d\n", L);

                  L++;

                  printf("    Ti := 0 \n    goto out\n");

                  printf("L%d:\n", L-1);

                  print_arr();

                  printf("L%d:    if ", L);

                  cc = 0;

                  while(cc < c)

                         printf("%c", wh[cc++]);

                  L = 0;

                  printf(" goto L%d \n",L);

                  printf("    Ti := 0 \n    goto out\n");

                  printf("out: \n");

           }

           else if(W_flag == 1 && if_flag == 0)

           {

                  printf("L%d:  while ",L);

                  L++;

            j = 0;

                  while(ana[j] != '(')

                         j++;

                  j++;

                  c = 0;

                  while(ana[j] != ')')

                  {     printf("%c",ana[j]);

                         wh[c++] = ana[j];

                         j++;

                  }

                  printf(" goto L%d\n", L);

                  L++;

                  printf("    Ti := 0 \n    goto out\n");

                  printf("L%d:\n", L-1);

                  print_arr();

                  printf("L%d:   if ", L);

                  cc = 0;

                  while(cc < c)

                         printf("%c", wh[cc++]);

                  printf(" goto L%d \n", 0);

                  printf("    Ti := 0 \n    goto out\n");

                  printf("out: \n");

           }

           else if (if_flag == 1 && W_flag == 0)

           {

                  printf("L%d:  if ",L);

                  L++;

            j = 0;

                  while(ana[j] != '(')

                         j++;

                  j++;

                  while(ana[j] != ')')

                  {     printf("%c",ana[j]);

                         wh[c++] = ana[j];

                         j++;

                  }

                  printf(" goto L%d\n", L);

                  L++;

                  printf("    Ti := 0 \n    goto out\n");

                  printf("L%d: \n", L -1);

                  print_arr();    

                  printf("out: \n");

           }

 }

更多相关推荐:
编译原理课程设计报告

南京航空航天大学编译原理课程设计题目一个PASCAL语言子集PL0编译器的设计与实现专业班号学号姓名指导老师答辩日期20xx年1月1设计的题目一个PASCAL语言子集PL0编译器的设计与实现2课程设计的要求PL...

编译原理课程设计报告 编译器

软件工程0801班和春辰U20xx18016编译技术课程设计编译技术课程设计实验报告实验名称编译器程序说明下载请好评姓名向难学号20xx12110106班级计算机系08本一班20xx年11月12日目录一二三四五...

编译原理课程设计报告

编译原理课程设计报告实验1用Lex设计词法分析器1实验目的学会用lex设计一个词法分析器实验内容使用lex为下述文法语言写一个词法分析器实验要求输入为用该语言所写的源程序文件输出为记号序列每个记号显示为二元组记...

编译原理课设报告

北华航天工业学院编译原理课程设计课程设计题目编译程序构造作者所在系部计算机科学与工程系作者所在专业计算机科学与技术作者所在班级作者学号作者姓名指导教师姓名完成时间20xx年6月18日课程设计任务书摘要编译原理是...

广工20xx编译原理课程设计报告

课程设计课程名称编译原理题目名称PL0编译器的扩充学生学院计算机学院专业班级计算机科学与技术124学号31120xx901学生姓名柏石先指导教师李杨20xx年12月28日一实验目的与要求基本内容成绩范围中及格或...

编译原理课程设计报告

20xx20xx学年第二学期编译原理课程设计报告学院班级学生姓名成绩指导教师学号时间20xx年5月目录一课程设计的目的1二课堂实验及课程设计的内容121课堂实验内容122课程设计内容1三visualstudio...

编译原理课程设计报告

编译原理课程设计编译原理课程设计报告学院系班级电子信息与电气工程学院计算机系F0603034徐晓峰学号张冬茉5060309852学生姓名指导教师版本信息日期20xx1237版本10作者徐晓峰1编译原理课程设计一...

编译原理词法分析器设计课程设计报告

盐城工学院编译原理课程设计报告设计词法分析器专业计算机科学与技术20xx年1月10日学生姓名班学级号完成日期编译原理课程设计目录1前言22报告主体221设计目的222设计内容及要求2221课程设计内容2223测...

机械原理课程设计报告

青岛理工大学琴岛学院课程设计报告课题名称机械原理课程设计学院机电工程系专业班级机械084学号20xx020xx32学生刘源指导老师李明涛青岛理工大学琴岛学院教务处20xx年12月23日

机械原理课程设计报告

青岛理工大学琴岛学院课程设计报告课题名称机械原理课程设计学院机电工程系专业班级学号学生指导老师青岛理工大学琴岛学院教务处20xx年6月20日

机械原理课程设计报告

青岛理工大学琴岛学院课程设计报告课题名称机械原理课程设计学院机电工程系专业班级机械设计制作及其自动化112学号20xx020xx62学生杨柳指导老师周燕青岛理工大学琴岛学院教务处20xx年12月27日

机械原理课程设计结题报告

机械原理课程设计自动网球发球机班级05020xx4小组成员吴军061201周少丰061209毛海龙指导老师葛文杰机械原理课程设计报告目录一设计背景简介3二初始设想方案简介3类牛头刨床机构3三最终选择方案简介4四...

编译原理课程设计报告(23篇)