1010コンパイル原理(新版)
23433 ワード
#include<stdio.h>
#include <string.h>
#include<iostream.h>
main(){
char a[100];
char ch,bh;
int i,s,t,j,q;
s=0;
t=0;
printf(" ( # ):");
do
{
scanf("%c",&ch);
a[s++]=ch;
}while(ch!='#');
for(i=0;i<s;i++)
{
bh=a[i];
if(bh>='a'&&ch<='z')
{
if(a[i]=='b'&&a[i+1]=='e'&&a[i+2]=='g'&&a[i+3]=='i'&&a[i+4]=='n')
{
printf("<1,begin >
");
i=i+4;
continue;
}
else if(a[i]=='i'&&a[i-1]=='f')
{
printf("<2,if >
");
i=i+1;
continue;
}
else if(a[i]=='t'&&a[i+1]=='h'&&a[i+2]=='e'&&a[i+3]=='n')
{
printf("<3,then >
");
i=i+3;
continue;
}
else if(a[i]=='w'&&a[i+1]=='h'&&a[i+2]=='i'&&a[i+3]=='l'&&a[i+4]=='e')
{
printf("<4,while >
");
i=i+4;
continue;
}
else if(a[i]=='d'&&a[i+1]=='o')
{
printf("<5,do >
");
i=i+1;
continue;
}
else if(a[i]=='e'&&a[i+1]=='n'&&a[i+2]=='d')
{
printf("<6,end >
");
i=i+2;
continue;
}
else if(a[i]=='l'&&a[i+1]=='('&&a[i+2]=='l'&&a[i+3]=='|'&&a[i+4]=='d'&&a[i+5]==')'&&a[i+6]=='*')
{
printf("<10,l(l|d)* >
");
i=i+6;
continue;
}
else if(a[i]=='d'&&a[i+1]=='d'&&a[i+2]=='*')
{
printf("<11,dd* >
");
i=i+2;
continue;
}
}
if(bh==':')
if(a[i+1]=='='){
printf("<18,:= >
");
i=i+1;
continue;}
if(bh=='<')
if(a[i+1]='='){
printf("<21,<= >
");
i=i+1;
continue;}
if(bh=='<')
if(a[i+1]=='>'){
printf("<22,<> >
");
i=i+1;
continue;}
if(bh=='>')
if(a[i+1]=='='){
printf("<24,>= >
");
i=i+1;
continue;}
t=i;
j=i;
while(a[i]>='0'&&a[i]<='9'){
if(a[t]>='0'&&a[t]<='9')
{
t=t+1;
}
else
{
q=t-j;
printf("<11,");
for(j;j<t;j++)
{
printf("%c",a[j]);
}
printf(" >
");
i=i+q;
break;
}
}
switch(bh)
{
case '+':
printf("<13,%c >
",bh);
break;
case '-':
printf("<14,%c >
",bh);
break;
case '*':
printf("<15,%c >
",bh);
break;
case '/':
printf("<16,%c >
",bh);
break;
case ':':
printf("<17,%c >
",bh);
break;
case '(':
printf("<27,%c >
",bh);
break;
case ')':
printf("<28,%c >
",bh);
break;
case '#':
printf("<0,%c >
",bh);
break;
case '>':
printf("<23,%c >
",bh);
break;
case '<':
printf("<20,%c >
",bh);
break;
case ';':
printf("<26,%c >
",bh);
break;
}
}
}