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

📄 新建 文本文档.txt

📁 词法分析器的简单实现
💻 TXT
字号:
#include<string.h>
#include<stdio.h>
#include<fstream.h>
#include<ctype.h>
#include<iostream.h>
#include <stdio.h>
#define  MAX 18//分析表的最大容量
#define  MAXBUF 255
char  ch =' ';// 存放读入当前的输入字符
int lineno;
struct reserve
{
   char lexptr[MAXBUF];
   int token;
};
struct reserve symtable[MAX];
 char * str[]={"iostream","cin","cout","void","main","include", 
 "endl","char","int","real","for","to","if","then","else","do","while","iostream.h"};

//对符号表进行初始化
void init()
{
  int j=0;
  for( j=0; j<18; )
  { 
   strcpy(symtable[j].lexptr,str[j]);
  symtable[j].token=j+3;
  j++;
  }
}

int number(char ch)
{
  return (ch>='0'&&ch<='9');
}//判断是否为数字

int letter(char ch)
{
  return (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch=='.');
}//判断是否为字母


int search(char *temp)
{
  for(int i=0; i<sizeof(symtable)/sizeof(symtable[0]); i++)
  {
    if(!strcmp(symtable[i].lexptr ,temp))
 {
  return  symtable[i].token;
 }
  }
 return 0;
} 
 
   
//分析程序
void analyse(FILE *fpin,FILE *fpout) 
{
   //char *arr;
	char arr[MAXBUF];
   int i=0;
   int j=0;
//读入字符判断,空格、字母、数字、界符
   while((ch=fgetc(fpin))!=EOF)
   {

     if(ch==' '||ch=='\t')
  {
  
  }

     else if(ch=='\n')
  {  
   lineno++;
  }

     else if(number(ch))
  { 
   /////////读入数字
   while(number(ch))
   { 
   arr[j]=ch;
   j++;
   ch=fgetc(fpin);
   } 

   arr[j]='\0';
   j=0;
   fseek(fpin,-1L,SEEK_CUR);
   fprintf(fpout,"%s\n",strcat(arr,"数字")) ;
  }


     else if (letter(ch))
  {

   while(letter(ch)||number(ch))
   {
    arr[j]=ch;
    j++;
    ch=fgetc(fpin);
   }

   fseek(fpin,-1L,SEEK_CUR);
   arr[j]='\0';
   j=0;

   if (search(arr))
   {
     fprintf(fpout,"%s\n",strcat(arr,"   关键字"));
	   ///string b("关键字");
	   ///string a =arr+b;  
  //PrintWriter out =   new   PrintWriter(new   BufferedWriter(new   FileWriter(fpout)));   
  //out.println(a);  
	 //fpout<<arr<< "Reserve   Word"   << endl;  
    ///fprintf(fpout,"%s\n",arr,"  关键字");
   }

   else 
	   fprintf(fpout,"%s\n",strcat(arr,"   标识符"));
    //fprintf(fpout,"%s\n",arr,"  标识符");
  }


  else if(ch==':')
  {
   ch=fgetc(fpin);

   if(ch=='=')
   {
    fprintf(fpout,"%s\n",":=""    特殊符号");
   }

   else
   {
    fprintf(fpout,"%s\n",":" "    特殊符号");
    fseek(fpin,-1L,SEEK_CUR);
   }

  }

  else if (ch=='>')
  {
       ch=fgetc(fpin);
    if(ch=='=')
    {
     fprintf(fpout,"%s\n",">="  "     特殊符号");
    }

    else
    {
     fprintf(fpout,"%s\n",">"  "    特殊符号");
  fseek(fpin,-1L,SEEK_CUR);
    }
  }

  else if(ch=='<')
  { 
    ch=fgetc(fpin);
    if(ch=='>')
    {
     fprintf(fpout,"%s\n","<>""    特殊符号");
    }

    else if(ch=='=')
    {
     fprintf(fpout,"%s\n","<=""    特殊符号");
    }
    else 
    {
      fprintf(fpout,"%s\n", "<""    特殊符号");
   fseek(fpin,-1L,SEEK_CUR);
    }
  }

  else if(ch=='/')
  { 
    ch=fgetc(fpin);
     if(ch=='*')
  {
    ch=fgetc(fpin);
          s:while(ch!='*')
   {
     ch=fgetc(fpin);
   }
            while(ch=='*')
   {
     ch=fgetc(fpin);
     while(ch!='/')
     {
      goto s;
     }
   }
  }

  else if(ch=='/')
  {
    ch=fgetc(fpin);
    while(ch!='\n')
    {
      ch=fgetc(fpin);
    }
  }
     else 
  {  
    fprintf(fpout,"%s\n","/""    特殊符号");
    fseek(fpin,-1L,SEEK_CUR);
  }
  }

    else if(ch=='+')
  {
    fprintf(fpout,"%s\n","+""    特殊符号");
  }

  else if(ch=='-')
  {
   fprintf(fpout,"%s\n","-""    特殊符号");
  }

  else if(ch=='*')
  {
   fprintf(fpout,"%s\n","*""    特殊符号");
  }
  else if(ch=='(')
  {
   fprintf(fpout,"%s\n","(""    特殊符号");
  }
  else if(ch==')')
  {
   fprintf(fpout,"%s\n",")""    特殊符号");
  }
  else if(ch=='[')
  {
   fprintf(fpout,"%s\n","[""    特殊符号");
  }
  else if(ch==']')
  {
    fprintf(fpout,"%s\n","]""    特殊符号");
  }
  //else if(ch=='.')
  //{
    //fprintf(fpout,"%s\n",".","特殊符号");
  //}
  else if(ch==';')
  {
    fprintf(fpout,"%s\n",";""     特殊符号");
  }
  else if(ch=='=')
  {
    fprintf(fpout,"%s\n","=""     特殊符号");
  }
  else if(ch==',')
  {
    fprintf(fpout,"%s\n",",""    特殊符号");
  }
  else if(ch=='#')
  {
    fprintf(fpout,"%s\n","#""    特殊符号");
  }
  else if(ch=='{')
  {
    fprintf(fpout,"%s\n","{""    特殊符号");
  }
  else if(ch=='}')
  {
    fprintf(fpout,"%s\n","}""    特殊符号");
  }
  else fprintf(fpout,"error in unknow character %c\n",ch)  ;
   }
} 

void main()
 {
   
   char filenamein[30];
   char filenameout[30];
      printf("     这是一个小型的词法分析器\n\n");
    printf("请输入源文件的文件名(  length<30  )\n");
    scanf("%s",filenamein);
    char ch;
    FILE* fpin=fopen(filenamein,"r");
   printf("\n请输入要保存词法分析后结果的文件名( length<30  )\n");
   scanf("%s",filenameout);
   FILE* fpout=fopen(filenameout,"w");
    init();
    analyse(fpin,fpout);
    fclose(fpout);
	fclose(fpin);
	cout<<endl<<"词法分析的结果已写入到文件"<<filenameout<<endl;
	int f;
	cout<<endl<<"要查看词法分析后的结果请输入 1,否则按任意其他键"<<endl;
	cin>>f;
	if(f==1)
	{
	FILE* fpin1=fopen(filenameout,"r");
	cout<<"经过词法分析后为:"<<endl;
    ch = getc( fpin1);
    while( ch != EOF ) 
	{
     printf( "%c", ch );
     ch = getc( fpin1);
   }
	fclose(fpin1);
	}
} 

⌨️ 快捷键说明

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