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

📄 12.cpp

📁 这是一个编译原理里关于词法分析器的小程序。编程工具是:Visual C++ 6.0
💻 CPP
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include <stdlib.h>
char table[30],currentchar,buffer1[100];
int position=0,i=0;
////////////
void ls1(),ls2(),ls5(),ls6() ,ls7();
void emptytable(), Noblank();
void readchar(char p);
int tokenletter(char s[]);
void  maketoken();
void  linktoken();
void main()
{FILE *fp;
char ch;
if ( (fp = fopen ("aa.txt","wt+"))==NULL) 
{printf("file open error. \n");
 exit(0);}//文件打开失败
printf("write file\n");
ch=getchar();
while(ch!='@')
{ fputc(ch,fp);
  ch=getchar();
}
rewind(fp);
while ( (ch=fgetc(fp) ) != EOF ) //** /*从文件中读取字符 */
{  while(ch!=10 && ch!=EOF)//fput如果字母不是回车
{    buffer1[position]=ch;
     position++;
	 ch=fgetc(fp);
}  
   linktoken(); maketoken(); 
	printf("\n");
}
fclose (fp); /* 关闭文件 */
}
//////////////////// 
 void  maketoken()//形成Token字
 {	//readchar(buffer1[position]);
   Noblank();
    if (isalpha(currentchar))//字母和数字
		ls1();
	else
	  if(isdigit(currentchar))//数字
		  ls2();
	  else
		 switch(currentchar)
	  {  case '+':printf(" $plus");break;
		 case ';':printf(" $semicolon"); break;		 
		 case ',':printf(" $comma");break;
		 case '(': printf(" $Lparen");break;
		 case ')':printf(" $Rparen");break;
		 case '-':printf(" $Minus");break;
		 case '*':printf(" $Multiply");break;
		 case '/':printf(" $Dquote");break;
		 case '_':printf(" $Underscore");break;
		 case '[':printf(" $Lzparen");break;
		 case ']':printf(" $Rzparen");break; 
		 case '=':printf(" $equal");break;
		 case ':':ls5();break;
	   	 case '<':ls6();break;
		 case '>':ls7();break;
		 case '@': case '!':case '$':printf("illegal character");break;
	  }    
}
//////////////
void ls1()  //当前为字符
{ Lg:
	table[i]=currentchar;
     i++;
readchar(buffer1[position]);
 if(isalnum(currentchar))
  goto Lg;
  else
  {position--;
   table[i]='\0';
  }
 if(tokenletter(table)==1)
 printf(" $%s",table);
 else
	 printf(" $id %s",table);
 emptytable();
}
/////////////s
void ls2()//当前为数字,验证后,如果为整数,输出$interger,否则输出$real
{ int flag=0;
  Lg1:  
table[i]=currentchar;i++;
 readchar(buffer1[position]);
 if(isdigit(currentchar))
	 goto Lg1;
 else
	 if(currentchar=='.')
	 {flag=1;goto Lg1;}
	 else
	 position-=1;
if (flag==1)
printf(" $real %s",table);
else 
 printf(" $interger,%s",table);
emptytable();
} 

///////////
void ls5()//冒号
{  table[i]=currentchar;
   readchar(buffer1[position]);//putchar('T');
   if(currentchar=='=')
     printf(" $assi");
   else
   {position-=1; printf(" $colon");}//putchar(currentchar);
  emptytable();
}
///////////////////
void ls6()//小于
{table[i]=currentchar;
readchar(buffer1[position]);
if(currentchar=='=')
 printf(" $le");
else
{ position-=1;printf(" $lt");}
emptytable();
}
///////
void ls7()//大于等于
{table[i]=currentchar;
readchar(buffer1[position]);
if(currentchar=='=')
 printf("\n$lg");
else
{position-=1;printf(" $lge");}
emptytable();
}
//////////////
int tokenletter(char s[])//验证是不是关键字
{char keyname[][20]={"begin","end","procedure","if","then","with","do","var","int","real"};
 int y2=strlen(s),y1;
 // L3:
 for(int a=0;a<=10;a++)
 {
  y1=strlen(keyname[a]);
   if(y1!=y2)
    continue;
   for(int b=0;b<=y1;b++)
	 {if(s[b]!=keyname[a][b])
       break;} 
	  if((b-1)==y1)
	  return 1;}
  return 0;  
}
///////////////////////////
 void readchar(char p)
 { currentchar=p;
  position+=1;
 }
 /////////////////////
void Noblank()//去掉空格符
{  if(currentchar==' ')
	 { readchar(buffer1[position]);
       Noblank();
	}
 }
 void emptytable()
 { for(int ii=0;ii<20;ii++)
   table[ii]=0;
   i=0;
 }
 /////////////////
void linktoken()
{int mm;
	mm=position;
	position=0;
	readchar(buffer1[position]);
	Noblank(); 
   while(position<mm)
	 {	   maketoken();	
       readchar(buffer1[position]);}
 for(int ii=0;ii<30;ii++)
   buffer1[ii]=0;
   position=0;
}

⌨️ 快捷键说明

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