用java语言编写n!并输出算式12345_分别用for,while,do_while循环语句以及递归方法计算n,并输出算式(java语句)...

该博客介绍了使用C语言实现的递归下降法来解析for循环语句的过程。通过词法分析、保留字识别、结构体存储识别出的单词,以及递归函数进行语法分析,最终输出对应的三地址码。示例代码详细展示了如何处理输入的字符串,并给出了样例输入和输出。
摘要由CSDN通过智能技术生成

///

董超勋的for循环语句翻译 递归下降法 输出三地址码 /

#define MAX 100

#include

#include

#include

char str[MAX];

char ch;

int turn;

char strToken[MAX];

int kind;

int n=0;//存放strtoken[]元素的个数

struct Word//结构体 存放单词

{

int sort;

char word[MAX];//存放strtoken[]的内容

};

//record[x]=new Word;

Word *record[12];//放所有识别出来的单词,分别存放他们的编号以及字符串,x是其下标

词法分析///

int buffer()//载入

{

int i=0;

cout<

for(int n=0;n<=MAX;n++)

{

for(;i<=MAX;i++)

{

scanf("%c",&str[i]);

/cin>>str[i]不可用,用C语言读入字符。

if(str[i]=='#')

break;///如果尾数为识别码#,则表示程序读完,跳出循环.

}

break;

}

return(i);

}

bool IsLetter(char ch)///判断是否是字母

{

if(ch>=65&&ch<=90||ch>=97&&ch<=122)

return(true);

else

return(false);

}

bool IsDigit(char ch)//判断是否是数字

{

if(ch>=48&&ch<=57)

return(true);

else

return(false);

}

char GetChar(int i)///读取字符

{

char ch;

ch=str[i];

return(ch);

}

char GetBC(char ch)判断是不是空格或者换行,如果是,直接读取下一个字符直道不再空白为止

{

if(ch==32||ch==10)

{

turn++;

ch=GetChar(turn);

ch=GetBC(ch);/递归实现

return(ch);

}

else

return(ch);

}

void Concat()/连接,即为strtoken[]赋值

{

strToken[n]=ch;

n++;

}

int Reserve()/以单词为单位查找保留字,是则返回编码,不是则返回0,用来区分标志符和保留字

{

if(strcmp(strToken," DIM\0")==0)///调用strcmp函数实现,

return(1);

else if(strcmp(strToken,"for\0")==0)

return(2);

else if(strcmp(strToken,"step\0")==0)

return(3);

else if(strcmp(strToken,"until\0")==0)

return(4);

else if(strcmp(strToken,"do\0")==0)

return(5);

else

return(6);

}

void clear()

{

n=0;

}

/*语法递归分析*/

int A(int * c,int & q)

{

if(c[q++]==3)

{

if(c[q]==7)

{ q++;

return 1;

}

else {cout<

}else {cout<

}

int B(int * b,int & o)

{

if(b[o++]==4)

{

if(b[o]==7)

{ o++;

return 1;

}

else {cout<

}else {cout<

}

int S2(int * d,int & h)

{

if(d[h++]==6)

{

if(d[h++]==8)

{

if((d[h]==6||d[h]==7)) {h++; return 1;}

else {cout<

}else {cout<

}else {cout<

}

int S1(int * m,int & n)

{

if(S2(m,n))

{

if(A(m,n))

{

if(B(m,n)) return 1;

else return 0;

}else return 0;

}else return 0;

}

int S(int *a,int & z)

{

if (a[z++]==2)

{

if (S1(a,z))

{

if(a[z++]==5)

{

if(S2(a,z))

{

cout<

}else return 0;

}else {cout<

}else return 0;

}else {cout<

}

void main()

{

cout<

cout<for S1 do S2"<

cout<S2AB"<

cout<i=j"<

cout<stepj"<

cout<untilj"<

int num;

turn=0;

num=buffer()-1;

int x=0;//计识别的单词的个数

for(;turn<=num;turn++)//总循环,ch存放刚读入的字符,strtoken[]存放已识别的标志付或保留字,turn是数组str[]的下标

{

ch=GetChar(turn);

ch=GetBC(ch);

if(IsLetter(ch))

{

while(IsLetter(ch)&&turn<=num||IsDigit(ch)&&turn<=num)

{

Concat();

ch=GetChar(++turn);

}

strToken[n]='\0';

ch=NULL;//此ch不是标志符中的符号

turn=turn-1;

kind=Reserve();

record[x]=new Word; record[x]->sort=kind;//12345或6

//cout<

cout<

for(int i=0;i

{

record[x]->word[i]=strToken[i];

cout<word[i];//输出识别的标志符或保留字

}

cout<

record[x]->word[i]='\0';

clear();

x++;

}

else if(IsDigit(ch))

{

while(IsDigit(ch)&&turn<=num)

{

Concat();

ch=GetChar(++turn);

}

ch=NULL;

turn=turn-1;

kind=7;

//

record[x]=new Word;

record[x]->sort=kind;

cout<

for(int i=0;i

{

record[x]->word[i]=strToken[i];

cout<word[i];

}

cout<

record[x]->word[i]='\0';

clear();x++;

}

else if(ch=='=')

{

kind=8;

///

record[x]=new Word;

record[x]->word[0]='=';

record[x++]->sort=kind;

cout<

}

else

cout<

}

//*语法分析*

//int y;

/*for(y=0;y

{cout<sort<

}cout<

int ana[MAX];//存放词法分析得到的单词序列的编号的序列

int m;

for(m=0;m

{

ana[m]=record[m]->sort;//将sort作为数组保存起来

}

/语法分析///

int j=0;

///制导翻译//

if(!S(ana,j)) cout<

else

{ cout<

cout<

int i=0;

while(record[1]->word[i]!='\0')

cout<word[i++];cout<word[0];

i=0;

while(record[3]->word[i]!='\0')

cout<word[i++];cout<

cout<

cout<

i=0;

while(record[1]->word[i]!='\0')

cout<word[i++];cout<

i=0;

while(record[1]->word[i]!='\0')

cout<word[i++];cout<

i=0;

while(record[5]->word[i]!='\0')

cout<word[i++];cout<

cout<

i=0;

while(record[1]->word[i]!='\0')

cout<word[i++];cout<

i=0;

while(record[7]->word[i]!='\0')

cout<word[i++];

cout<

cout<

cout<

i=0;

while(record[9]->word[i]!='\0')

cout<word[i++];cout<

i=0;

while(record[11]->word[i]!='\0')

cout<word[i++];cout<

cout<

cout<

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值