📄 gramma_paradise.cpp
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<string.h>
struct cifa
{ int syn;
char *token;};
cifa cf[80];
int i=0,kk=0,l=0;
void scaner();
void lrparser();
void yucu();
void statement();
void expression();
void term();
void factor();
char scanner(int Len,char * Str)
{ int j=0,k=0,m=0,n=0;
char ch;
char skey[]="";
for(j=0;j<10;j++){skey[j]='\0';}//置空
while(i<Len)
{ if(Str[i]!=' ')//滤掉空格
{cf[m].token=new char[];//分配空间
for(j=0;j<=k;j++)cf[m].token[j]='\0';
switch(Str[i])
{case '+': n=13; break;
case '-': n=14; break;
case '*': n=15; break;
case '/': n=16; break;
case ':': i++; if(Str[i]=='=')
{n=18;skey[0]=Str[i-1];skey[1]=Str[i];}
else
{n=17;skey[0]=Str[i-1];} break;
case '<': i++;
if(Str[i]=='>')
{n=21;skey[0]=Str[i-1];skey[1]=Str[i];}
else { if(Str[i]=='=')
{n=22;skey[0]=Str[i-1];skey[1]=Str[i];}
else {n=20;skey[0]=Str[i-1];} }
break;
case '>': i++; if(Str[i]=='=')
{ n=24;skey[0]=Str[i-1];skey[1]=Str[i];}else {n=23;skey[0]=Str[i-1];} break;
case '=': n=25; break;
case ';': n=26; break;
case '(': n=27; break;
case ')': n=28; break;
case '#': n=0; break;
case 'b': k=strlen("begin");
for(j=i;j<k+i;j++)
{skey[j-i]=Str[j]; }
if(strncmp(skey,"begin",k)==0)
{n=1;i=i+k-1;}
else
{ for(j=0;j<=k;j++){skey[j]='\0';}
j=i; skey[j-i]=Str[j]; j++;
while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
{
skey[j-i]=Str[j]; j++;}
n=10; k=j-i;i=j-1;} break;
case 'i': k=strlen("if");
for(j=i;j<k+i;j++)
{skey[j-i]=Str[j]; }
if(strncmp(skey,"if",k)==0)
{n=2;i=i+k-1;}
else { for(j=0;j<=k;j++){skey[j]='\0';}
j=i; skey[j-i]=Str[j]; j++;
while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
{
skey[j-i]=Str[j]; j++;} n=10;
k=j-i; i=j-1;}break;
case 't': k=strlen("then");
for(j=i;j<k+i;j++)
{ skey[j-i]=Str[j]; }
if(strncmp(skey,"then",k)==0)
{n=3;i=i+k-1;}
else
{ for(j=0;j<=k;j++){skey[j]='\0';}
j=i; skey[j-i]=Str[j]; j++;
while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
{ skey[j-i]=Str[j];
j++;} n=10; k=j-i; i=j-1; } break;
case 'w': k=strlen("while");
for(j=i;j<k+i;j++)
{ skey[j-i]=Str[j]; }
if(strncmp(skey,"while",k)==0)
{n=4;i=i+k-1;}
else
n=10;break;
case 'd': k=strlen("do");
for(j=i;j<k+i;j++)
{ skey[j-i]=Str[j]; }
if(strncmp(skey,"do",k)==0)
{n=5;i=i+k-1;}
else { for(j=0;j<=k;j++){skey[j]='\0';}
j=i; skey[j-i]=Str[j]; j++;
while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
{
skey[j-i]=Str[j]; j++;}
n=10; k=j-i; i=j-1; } break;
case 'e': k=strlen("end");
for(j=i;j<k+i;j++)
{skey[j-i]=Str[j]; }
if(strncmp(skey,"end",k)==0)
{n=6;i=i+k-1;}
else
{ for(j=0;j<=k;j++){skey[j]='\0';}
j=i; skey[j-i]=Str[j]; j++;
while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
{ skey[j-i]=Str[j];
j++;}
n=10; k=j-i; i=j-1; } break;
default:
if(Str[i]>'a'&&Str[i]<'z'||Str[i]>'A'&&Str[i]<'Z'||Str[i]=='a'||Str[i]=='z'||Str[i]=='A'||Str[i]=='Z')//字母打头
{
j=i; skey[j-i]=Str[j];j++;
while(Str[j]>'a'&&Str[j]<'z'||Str[j]>'A'&&Str[j]<'Z'||Str[j]=='a'||Str[j]=='z'||Str[j]=='A'||Str[j]=='Z'||Str[j]>'0'&&Str[j]<'9'||Str[j]=='0')//字母数字组合
{ skey[j-i]=Str[j]; j++;}
n=10; k=j-i; i=j-1; }
else
{if(Str[i]>'0'&&Str[i]<'9'||Str[i]=='0'||
Str[i]=='9')//数字组合
{ j=i; skey[j-i]=Str[j];j++;
while(Str[j]>'0'&&Str[j]<'9'||Str[j]=='0'||Str[j]=='9')
{skey[j-i]=Str[j];j++;}
n=11; k=j-i; i=j-1;}
else n=-1; } break; }
if(skey[0]=='\0')
{ cf[m].syn=n;
cf[m].token[0]=Str[i]; }
else
{cf[m].syn=n;
strcpy(cf[m].token,skey); }
for(j=0;j<=k;j++){skey[j]='\0';}
m++;}i++;}
return ch;}
void scaner()
{ cf[l]; l++;}
void lrparser()
{ if(cf[l].syn==1)
{ scaner();
yucu();
if (cf[l].syn==6)
{scaner();
if (cf[l].syn==0&&kk==0)
cout<<"success!"<<endl; }
else
{ if(kk!=1)cout<<"be short of:end,error!"<<endl; kk=1; }}
else
{
cout<<"be short :begin,error!"<<endl;
kk=1;}}
void yucu()
{ statement();
while(cf[l].syn==26)
{scaner();
statement();}
return;
}
void statement()
{
if(cf[l].syn==10)
{scaner();
if(cf[l].syn==18)
{scaner();
expression();}
else {cout<<"赋值号错误!"<<endl;kk=1; }
}
else {cout<<cf[l].syn<<cf[l].token<<endl;
cout<<"语句错误!"<<endl;kk=1;}
}
void expression()
{
term();
while(cf[l].syn==13||cf[l].syn==14)
{scaner();
term();}
return;
}
void term()
{
factor();
while(cf[l].syn==15||cf[l].syn==16)
{scaner();
factor();
}
return;
}
void factor()
{
if(cf[l].syn==10||cf[l].syn==11)
{scaner();}
else {
if(cf[l].syn==27)
{
scaner();
expression();
}
else {cout<<"'('错误!"<<endl;kk=1;}
if (cf[l].syn==28)
{scaner();}
else {cout<<"')'错误!"<<endl; kk=1;}
cout<<"表达式错误!"<<endl; kk=1;}
return;
}
void main()
{ fstream infile;
infile.open("file1.txt",ios::in);
if(!infile)
{
cout<<"file1.txt can't open.\n";
abort();
}
int len;
char s[100], str[100];
while(!infile.eof())
{
infile.getline(s,sizeof(s));
cout<<s<<endl;
strcpy(str,s);
len=strlen(s);
if(i<len)
{
scanner(len,str);}
}
lrparser();
infile.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -