⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bianyiyaunli xifa.c

📁 编写一个C语言的子集的词法分析程序
💻 C
字号:
#include"stdio.h"
#include"string.h"
char proc[80],token[8];/*proc shi huanchognqu,token shi yonglai cunfang danci fuhao */
char ch;
char inputstring[80];
int i ;
int syn,p,m,n,sum;
int lrparser();
 int yucu();
int kk;
int col;/* 定义列*/
int row; /*定义行*/
char *rwtab[6]={"begin","if","then","while","do","end"};
 main()
{p=0;
i=0;
clrscr();
printf("\nplease input a string (end with '#'):\n");
gets(inputstring);
do { ch =inputstring[i++];
proc[p++]= ch;
  }while(ch!='#');
  p=0;
do
{scaner();
 switch(syn)
 {case 11:printf("(%d,%d)",syn,sum);break;
 case -1:fail(1);break;
 default:printf("(%d,%s)",syn,token);
 }
}while(syn!=0);

}

scaner()
{  int sumletter=0;
 m=0;
sum=0;
for(n=0;n<8;n++) token[n]=0;
ch=proc[p++];
while(ch==' ')ch=proc[p++];
if(ch>='a'&&ch<='z')
{    while(ch>='a'&&ch<='z')
      {token[m++]=ch;

ch=proc[p++];
 if (m==7){  while (proc[p++]!=' ');
 break;      }
	}
      while(ch>='0'&&ch<='9')
     {token[m++]=ch;
      ch=proc[p++];
      if (m==7){  while (proc[p++]!=' ');
 break;      }
 }
       token[m++]='\0';
        p=p-1;  /*回退字符*/
       for(n=0;n<6;n++)
      { if (strcmp(token,rwtab[n])==0)
	{ syn=n+1;
	break;
	 }
       else syn=10;
       }

}
else
    if (ch>='0'&&ch<='9')   /* ch是否是数字*/
     {
while(ch>='0'&&ch<='9')
     { sum=sum*10+ch-'0';
	ch=proc[p++];   /*输入下个字符*/
    }

   
if(ch>='a'&&ch<='z')
      {
      
while(ch>='a'&&ch<='z')
      {token[m++]=ch;
      ch=proc[p++];
         }

token[m++]='\0';
     syn=-1;  }
   else syn=11;
 p=p-1;  /*回退字符*/
}
 else
   switch(ch)
    {  case'<' :m=0;token[m++]=ch;
	       ch= proc[p++];/*读下一个字符*/
               if(ch=='>')
                 { syn=21;
                   token[m++]=ch;
                 }
                else if(ch=='=')
                  {syn=22;
                     token[m++]=ch;
                 }
                else
                 {syn=20;
                  p=p-1;  /*回退字符*/ }
                 break;
      case'>':m=0;token[m++]=ch;
               ch= proc[p++];/*读下一个字符*/
               if(ch=='=')
                 { syn=24;
                   token[m++]=ch;
                 }
                 else
                 {syn=23;
                  p=p-1;  /*回退字符*/ }
                 break;
        case':':m=0;token[m++]=ch;
               ch= proc[p++];/*读下一个字符*/
               if(ch=='=')
                 { syn=18;
                   token[m++]=ch;
                 }
                 else
                 {syn=17;
                 p=p-1;  /*回退字符*/ }
                 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=25 ;token[0]=ch;break;
        case';':syn=26 ;token[0]=ch;break; 
        case'(':syn=27 ;token[0]=ch;break; 
         case')':syn=28 ;token[0]=ch;break;
        case'#':syn=0 ;token[0]=ch;break;
}

}
 fail(int i )
{
 switch(i)
  { case 0:break;
   case 1: printf("\nDefined %d%s error\n",sum,token); break;
   }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -