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

📄 pl_0.cpp

📁 一个简单的词法分析程序. 可以将文件分析.
💻 CPP
字号:
#include<stdio.h>
#include "string.h"

#define stacksize 500
#define norw 13
#define txmax 100
#define nmax 14
#define al 10

FILE * fin;
enum symbol{
	nul,ident, number,plus,minus,times,slash,oddsym,eql,neq,
		lss,leq,gtr,geq,lparen,
		rparen,comma,semicolon,period,becomes,
		beginsym,endsym,ifsym,thensym,whilesym,
		writesym,readsym,dosym,callsym,constsym,
		varsym,procsym,
};
#define symnum 32

char ch;
enum symbol sym;
char id[al+1];
int num;
int cc,ll;
int cx;
char line[81];
char a[al+1];
char word[norw][al];
enum symbol wsym[norw];
enum symbol ssym[256];

#define getsymdo   if(-1==getsym()) return -1
#define getchdo    if(-1==getch()) return -1
void init()
{
	int i;
	for(i=0;i<=255;i++)
	{
		ssym[i]=nul;
	}
	ssym['+']=plus;
	ssym['-']=minus;
	ssym['*']=times;
	ssym['/']=slash;
	ssym['(']=lparen;
	ssym[')']=rparen;
	ssym['=']=eql;
	ssym[',']=comma;
    ssym['.']=period;
    ssym['#']=neq;
    ssym[';']=semicolon;
	
	strcpy(&(word[0][0]),"begin");
    strcpy(&(word[1][0]),"call");
    strcpy(&(word[2][0]),"const");
    strcpy(&(word[3][0]),"do");
    strcpy(&(word[4][0]),"end");
	strcpy(&(word[5][0]),"if");
	strcpy(&(word[6][0]),"ood");
	strcpy(&(word[7][0]),"procedure");
	strcpy(&(word[8][0]),"read");
	strcpy(&(word[9][0]),"then");
	strcpy(&(word[10][0]),"var");
	strcpy(&(word[11][0]),"while");
	strcpy(&(word[12][0]),"write");

	wsym[0]=beginsym;
    wsym[1]=callsym;
    wsym[2]=constsym;
    wsym[3]=dosym;
    wsym[4]=endsym;
    wsym[5]=ifsym;
    wsym[6]=oddsym;
    wsym[7]=procsym;
    wsym[8]=readsym;
    wsym[9]=thensym;
    wsym[10]=varsym;
    wsym[11]=whilesym;
    wsym[12]=writesym;

}


int getch()
{
	if(cc==ll)
	{
		printf("\n");
		if(feof(fin))
		{
			printf("program incomplete");
			return -1;
		}                                                                          
		ll=0;                                                                                                                                                                                                                                                                                                                                                                                                                                    
		cc=0;
		ch=' ';
		while(ch!=10)
		{
			if(EOF==fscanf(fin,"%c",&ch))
			{
				line[ll]=0;
				break;
			}
			printf("%c",ch);
			line[ll]=ch;
			ll++;
		}
		printf("\n");
	}
	ch=line[cc];
	cc++;
	return 0;
}

int getsym()
{
int i,j,k;
while(ch==' '||ch==10||ch==9)  /*忽略空格、换行和TAB*/
	{
       getchdo;
	}
if(ch>='a'&&ch<='z')          /*名字或保留字以a、z开头*/
  {
      k=0;
	  do
	  {
	    if(k<al)
		{
		   a[k]=ch;
		   k++;
		}		 
	    getchdo;
      }while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');
a[k]=0;
strcpy(id,a);
i=0;
j=norw-1;
   
do{                             /*搜索保留字*/
     k=(i+j)/2;
     if(strcmp(id,word[k])<=0)
		{
        j=k-1;
		}
     if(strcmp(id,word[k])>=0)
		{
        i=k+1;
		}
}while(i<=j);
     
if(i-1>j)
{ 
   sym=wsym[k];
   printf("\n关键字		%s	种别	%d",word[k],sym);//输出单词
}
else                                    
{
   sym=ident;
   printf("\n标志符		%s	种别	%d",a,sym);//输出标示符
} 
}
     else 
	 {
	   if(ch>='0'&&ch<='9')          /*检测数字*/
	   {
        k=0;
        num=0;
        sym=number;

     do{
		num=10*num+ch-'0';

	    k++;
		getchdo;

	} while (ch>='0'&& ch<='9');
	printf("\n数字		%d	种别	%d",num,sym);//输出数字
	k--;
	
   }
   else
   {
	   if(ch==':')
	   {
		   getchdo;
		   if(ch=='=')
		   {
			   sym=becomes;
			   printf("\n赋值号		:=	种别	%d",sym);
			   getchdo;
		   }
		   else
		   {
			   sym=nul;
		   }
		   
	   }
   else
   {
	   if(ch=='<')
	   {
		   getchdo;
		   if(ch=='=')
		   {
			   sym=leq;
			   printf("\n小于等于	<=	种别	%d",sym);
			   getchdo;
		   }
		   else
		   {
			   sym=lss;
		   }
	   }
	   else
	   {
		   if(ch=='>')
		   {
			   getchdo;
			   if(ch=='=')
			   {
				   sym=geq;
				   printf("\n大于等于	>=	种别	%d",sym);
			   printf("\n");
				   getchdo;
			   }
			   else
			   {
				   sym=gtr;
			   }
              
		   }
		   
		   else
			{
			 sym=ssym[ch];
			 if(ssym[ch]!=nul)
				printf("\n单字符		%c	种别	%d",ch,ssym[ch]);
			else 
				printf("\n非法字符	%c	种别	%d",ch,ssym[ch]);;
			       if(sym!=period)
				   {
					   getchdo;
				   }
		   }
		  }
		}
	   }
	}
	return 0;
   }

int main()
{
	char fname[10];
    printf("输入 要分析的p1/0 文件名字?");
	scanf("%s",fname);
	printf("\n______________________________________\n");
	fin=fopen(fname,"r");
	if(fin)
	{
		init();
		cc=cx=ll=0;
		ch=' ';
		while(-1!=getsym())
		{

		}
		printf("\n______________________________________\n");
		
	}
	else
	{
		printf("Can't open file!\n");
	}
	return 0;
}






⌨️ 快捷键说明

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