- #include<stdio.h>
- #include<string.h>
- char prog[80],token[8];
- char ch;
- int syn,p,m,n,sum,kk=0;
- char *rwtab[6]={"beain","if","then","while","do","end"};
- main()
- {p=0;
- printf( "/n please input string : /n");
- do {
- ch=getchar();
- prog[p++]=ch;
- }
- while(ch!='#');
- p=0;
- do
- { scaner();
- switch(syn)
- { case 11: printf("/n(%d,%d)",syn,sum);
- case -1: printf("/n (%s,False!)",token);
- default: printf("/n(%d,%s)",syn,token);
- }
- }while(syn!=0);
- lrparser();
- system("pause");
- }
- scaner()
- {
- for(n=0;n<8;n++) token[n]=NULL;
- m=0;
- sum=0;
- ch=prog[p++];
- while(ch==' ')
- {ch=prog[p++];}
- if(ch>='a'&&ch<='z')
- {while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9')
- {token[m++]=ch;
- ch=prog[p++];
- }
- token[m++]='/0';
- p--;
- syn=10;
- for(n=0;n<6;n++)
- if(strcmp( token,rwtab[n])==0)
- {
- syn=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'<': m=0; token[m++]=ch;
- ch=prog[p++];
- if(ch=='>')
- { syn=21;
- token[m++]=ch;
- }
- else 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 ':': ch=prog[p++];
- if(ch=='=')
- {syn=26; token[m++]=ch;
- }
- else
- {syn=25; p--;
- }
- break;
- case'+':syn=13;token[0]=ch;break;
- case'-':syn=14;token[0]=ch;break;
- case'*':syn=15;token[0]=ch;break;
- case'/':syn=16;token[0]=ch;break;
- case'#':syn=0;token[0]=ch;break;
- default: syn=-1;
- }
- }
- }
- lrparser(){
- if(syn==1){
- scaner();
- yucu();
- if(syn==6){
- scaner();
- if(syn==0&&(kk==0))
- printf("success!");
- }
- else {if(kk!=1) printf("missing end error!");kk=1;
- }
- }
- else{ printf("begin error");kk=1; }
- return;
- }
- yucu(){
- statement();
- while(syn==26){
- scaner();
- statement();
- }
- return;
- }
- statement(){
- if(syn==10){
- scaner();
- if(syn==18){
- scaner();
- expression();
- }
- else {printf(" error" );kk=1;}
- }
- else { printf("input statement error");kk=1;
- }
- return;
- }
- expression(){
- term();
- while(syn==13||syn==14){
- scaner();
- term();
- }
- return 0;
- }
- term() {
- factor();
- while(syn==15||syn==16){
- scaner();
- factor();
- }
- return 0;
- }
- factor(){
- if(syn==10||syn==11)
- scaner();
- else if(syn==27){
- scaner();
- expression();
- if(syn==28)
- scaner();
- else{printf(" ')' error!");kk=1;}
- }
- else { printf("expression error");kk=1;}
- return 0;
- }