南华大学
计算机科学与技术学院
编译原理课程设计名:赋值语句,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、课程设计报告(纸质版和电子版都要交,电子版放上面那个文件夹下):包括选题说明,简单的软件需求分析说明,软件设计说明,设计经验总结。
n 功能描述:该程序具有什么功能?
n 程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;另外可以附加函数之间的调用关系图、程序总体执行流程图。
n 设计经验总结包括下列方面:你对你的软件如何评价?你的设计有何特色?你自己觉得应该给多少分?你在编程过程中花时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题?遇到了哪些难题?你是怎么克服的?你的收获有哪些?
四、结果分析:
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");
}
}