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

📄 aa.cpp

📁 基于C语言子集的词法分析器,编译原理作业
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int i,j,k,sign,number,flag;/*把类号内码等定义成全局变量*/

char ch;/*定义程序可以处理的关键字*/
char words[10]={" "};/*定义一个符号表*/
char program[500]; //用于保存源程序的字符数组  
 
int scan(char program[])  /*扫描器*/
{
    char*keywords[]={"auto","break","case","char","const","continue","default","do","double",
		"else", "enum","extern","float","for","goto", "if","int","long","register","return",
		"short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void", "volatile","while"};
    number=0;
    flag=0;
    j=0;
    ch=program[i++];
  /*处理空格与制表符回车*/
    while((ch==' ')||(ch=='\n')||(ch=='\t')||(ch=='\r'))  ch=program[i++];
  /*处理字母*/
    if((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z'))
	{
        while((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z'))
		{
           words[j++]=ch;
           ch=program[i++];
		}
             
		     words[j++]='\0';
             for(k=0;k<32;k++)
              if(strcmp(words,keywords[k])==0)
                 switch(k)                        //处理相应的字母并生成相应的类号或内码并加到符号表中
			  {
                                case 0:
                                         sign=1;flag=1;break;  //设置类号与内码的值在下面的程序中用
                                case 1:
                                         sign=2;flag=1;break;
                                case 2:
                                         sign=3;flag=1;break;
                                case 3:
                                         sign=4;flag=1;break;
                                case 4:
                                         sign=5;flag=1;break;
                                case 5:
                                         sign=6;flag=1;break;
                                case 6:
                                         sign=7;flag=1;break;
                                case 7:
                                         sign=8;flag=1;break;
                                case 8:
                                         sign=9;flag=1;break;
                                case 9:
                                         sign=10;flag=1;break;
                                case 10:
                                         sign=11;flag=1;break;
                                case 11:
                                         sign=12;flag=1;break;
                                case 12:
                                         sign=13;flag=1;break;
								case 13:
									     sign=14;flag=1;break;

                               	case 14:
									     sign=15;flag=1;break;
								case 15:
									     sign=16;flag=1;break;
								case 16:
									     sign=17;flag=1;break;
								case 17:
									     sign=18;flag=1;break;
								case 18:
									     sign=19;flag=1;break;
						    	case 19:
									     sign=20;flag=1;break;
								case 20:
									     sign=21;flag=1;break;
								case 21:
									     sign=22;flag=1;break;
								case 22:
									     sign=23;flag=1;break;
								case 23:
									     sign=24;flag=1;break;
								case 24:
									     sign=25;flag=1;break;
								case 25:
									     sign=26;flag=1;break;
								case 26:
									     sign=27;flag=1;break;
								case 28:
									     sign=29;flag=1;break;
								case 29:
									     sign=30;flag=1;break;
								case 30:
									     sign=31;flag=1;break;
								case 31:
									     sign=32;flag=1;break;
										



			  }
              if (flag==0)
			  {
	              i--;sign=100;
			  }
	}
        /*处理常数*/
          else if((ch>='0')&&(ch<='9'))
		  {
               number=0;
               while((ch>='0')&&(ch<='9')||ch=='.')
			   {
                   number=number*10+(ch-'0');
                   ch=program[i++];        //把识别出的常数并加到符号表中
			   }
                 sign=200;i--;           //数字的类号设置为200
		  }
        /*处理运算符号*/
            else switch(ch)
			{
                               case'=':
                                        words[j++]=ch;
                                        ch=program[i++];
                                        if(ch=='=')
										{
                                            words[j++]=ch;
                                            sign=401;   
										}
                                        else
										{
                                             i--;
				                              sign=402;
										}
                                                    break;
                                case'>':
                                        words[j++]=ch;
                                        ch=program[i++];
                                       if(ch=='=')
									   {
                                          words[j++]=ch;
                                          sign=403;
									   }
                                       else
									   {
                                           i--;
					                       sign=404;
									   }
                                                             break;
                               case'<':
                                        words[j++]=ch;
                                         ch=program[i++];
                                    if(ch=='=')
									{
                                           words[j++]=ch;
                                           sign=405;
									}
                                    else
									{
                                            i--;
											sign=406;
									}
                                                              break;
                               case'!':
                                       words[j++]=ch;
                                       ch=program[i++];
                                    if(ch=='=')
									{
                                           words[j++]=ch;
                                           sign=407;
									}
                                    else
									{
                                            i--;
											sign=408;
									}
                                                              break;
                               case'+':
                                       words[j++]=ch;
                                       ch=program[i++];
                                          if(ch=='=')
										  {
                                                words[j++]=ch;
                                                sign=409;
										  }
                                           if(ch=='+')
										   {
											    words[j++]=ch;
                                                  sign=410;
										   }
                                           else
										   {
                                                i--;
												sign=411;
										   }
                                                              break;
                                case'-':
                                        words[j++]=ch;
                                        ch=program[i++];
                                          if(ch=='=')
										  {
                                               words[j++]=ch;
                                               sign=412;
										  }
                                          else if(ch=='-')
										  {
                                               words[j++]=ch;
                                               sign=413;
										  }
                                          else
										  {
                                                i--;
												sign=414;
										  }
                                                               break;
                               case'*':
                                        words[j++]=ch;
                                        sign=415;
                                                               break;
                               case'/':
                                        words[j++]=ch;
                                        sign=415;
                                                               break;
                               case';':
                                        words[j++]=ch;
                                        sign=501;
                                                               break;
                               case'(':
                                         words[j++]=ch;
                                         sign=502;
                                                               break;
                               case')':
                                         words[j++]=ch;
                                         sign=503;
                                                               break;
                               case'[':
                                         words[j++]=ch;
                                         sign=504;
                                                               break;
                               case']':
                                         words[j++]=ch;
                                         sign=505;
                                                               break;
                               case'{':
                                         words[j++]=ch;
                                         sign=506;
                                                               break;
                               case'}':
                                         words[j++]=ch;
                                         sign=507;
                                                               break;
                               case':':
                                         words[j++]=ch;
                                         sign=508;
                                                               break;
                               case'"':
                                         words[j++]=ch;
                                         sign=509;
                                                               break;
                               case'%':
                                         words[j++]=ch;
                                         sign=510;
                                                               break;
                               case',':
                                         words[j++]=ch;
                                         sign=511;
                                                               break;
                               case'#':
                                          words[j++]=ch;
                                          sign=512;
                                                               break;
                               case'@':
                                          words[j++]=ch;
                                          sign=0;
                                                               break;
						   	   case'.':
                                          words[j++]=ch;
                                          sign=513;
							   
                                                               break;
						   	   case'\'':
                                          words[j++]=ch;
                                          sign=514;
							   
                                                               break;
                               case'\\':
								          words[j++]=ch;
                                          ch=program[i++];
                                          if(ch=='0')
										  {
                                           words[j++]=ch;
                                           sign=515;
										  }
                                          else if(ch=='n')
										  {
                                               words[j++]=ch;
                                               sign=516;
										  }
                                          else if(ch=='r')
										  {
                                               words[j++]=ch;
                                               sign=517;
										  }

                                         
										  while(ch>='1'&&ch<='7')
										  {
                                               words[j++]=ch;
                                               ch=program[i++];
											   sign=518;
										  }
										  
											 if(ch=='x'||ch=='X')
											 { words[j++]=ch;
											 ch=program[i++];
												 while(ch>='1'&&ch<='9'||ch>='a'&&ch<='f'||ch>='A'&&ch<='F')
													 {    
                                                    words[j++]=ch;
											        ch=program[i++];
											        sign=519;
										  }}break;
                                                                
						      default:   
								          sign=-1;
                             }
		words[j]='\0';
               return sign;
          return number;
 }
void main()                                  /*主函数*/
{
	//源程序输入 
	 FILE *fp;
	 	 
	  printf("★★★★★★★★★★★★★\n");
     
	 if((fp=fopen("kkk.txt","r"))==NULL)
	 {
		 printf("cannot open\n");
		 exit(0);
	 }
     i=0;
    
    do
	{
         ch=fgetc(fp); program[i++]=ch;
	}while(ch!='@');
	fclose(fp);
   i=0;
    do
	{
        sign=scan(program);    //对源程序进行扫描
           if(sign==200)
		   {
                 printf("(%2d,%4d)\n",sign,number);
		   }
           else if(sign==-1)      //出错处理
		   {
                 printf("(%d,error)\n",sign);
		   }
           else
		   {
                 printf("(%2d,%4s)\n",sign,words);   //输出符号表
		   }
		   
	} while(sign!=0);
	printf("★★★★★★★★★★★★★\n");
}
  

⌨️ 快捷键说明

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