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

📄 token00451.c

📁 词法分析器 用c或c++描述toyl语言词法分析器
💻 C
字号:
#include<stdio.h>
#include<string.h>
#define MAX 20

typedef struct /*定义一个二元组结构体*/
{
	int syn; /*token的编码*/
    char value[MAX]; /*tokend值*/
}WS;

char ch;
FILE *fp;

void getbc() /*检查ch是否为空白符,是的话,继续取下一个字符,直到不为空!即消除空白符*/
{
	while((ch==' ')||(ch=='\t')||(ch=='\n'))	
		ch=fgetc(fp);
}

int letter() /*判断ch是否为字母*/
{
    if((ch>='A')&&(ch<='Z')||(ch>='a')&&(ch<='z')) return 1;
	else return 0;
}

int digit() /*判断ch是否为数字*/
{
	if((ch>='0')&&(ch<='9')) return 1;
	else return 0;
}

int reserve(char *token)  /*查关键字表,判断token中的字符串是否为关键字*/
{
	int key=0,i;
	char WORDS_KEY[7][20]={"begin","var","real","integer","write","read","end"};
	for(i=0;i<=6;i++)
      if(strcmp(token,WORDS_KEY[i])==0) {key=i+1; break;} 
	return key;
}

print(WS *wd) /*打印输出函数*/
{
	printf("<%d,%s>",wd->syn,wd->value);
}

WS scaner() /*扫描程序函数*/
{
	char token[20];
	WS wd;
	int c;
	int i=0;
    ch=fgetc(fp);
	getbc(fp);
	if(letter()) /*是否为字母或字符,是的话继续取字符,直到取的词不是字母或数字。并调用reserve(char *token)判断是否为关键字。*/
	{
		while(letter()||digit())
		{
			token[i]=ch;
			ch=fgetc(fp);
			i++;
		}
		token[i]='\0';
		fseek(fp,-1L,1); /*退一个字符*/
		c=reserve(&*token);
		if(c!=0) {wd.syn=c;strcpy(wd.value,token); return wd;}
		   else  {wd.syn=0;strcpy(wd.value,token); return wd;}
	}
	else if(digit()) /*是否为数字,是的话继续取字符,直到取的词不是数字*/
	{
		while(digit())
		{
            token[i]=ch;
			ch=fgetc(fp);
			i++;
		}
		if(ch=='.')
		{
			token[i]=ch;
			ch=fgetc(fp);
			i++;
		    while(digit())
			{
               token[i]=ch;
			   ch=fgetc(fp);
			   i++;
			}
		    fseek(fp,-1L,1);
            token[i]='\0';
		    wd.syn=9;strcpy(wd.value,token); return wd;
		}
		else 
		{
		   fseek(fp,-1L,1);
           token[i]='\0';
		   wd.syn=8;strcpy(wd.value,token); return wd;
		}
	}
	else
	{
		switch(ch) /*判断可识别字符*/
		{
		  case '+': ch=fgetc(fp);
			        if(ch=='+') {wd.syn=20;wd.value[0]='+'; wd.value[1]='\0';  return wd; break;}/*判断是不是‘++’*/
					fseek(fp,-1L,1);
					wd.syn= 10;wd.value[0]='+'; wd.value[1]='\0';  return wd; break;
	      case ':': ch=fgetc(fp);
			        if(ch=='='){ wd.syn=15;wd.value[0]='f'; wd.value[1]='\0';  return wd; break;}
                    fseek(fp,-1L,1);
				    wd.syn=11;wd.value[0]=':'; wd.value[1]='\0';  return wd; break;
     	  case ';': wd.syn=12;wd.value[0]=';'; wd.value[1]='\0';  return wd; break;
		  case '(': wd.syn=13;wd.value[0]='('; wd.value[1]='\0';  return wd; break;
		  case ')': wd.syn=14;wd.value[0]=')'; wd.value[1]='\0';  return wd; break;
		  default : wd.syn=-1;wd.value[0]='-'; wd.value[1]='\0';  return wd; break;
		}
	}
}


main()
{
   WS wd;
   ch=0;
   if((fp=fopen("file.txt","r+"))==NULL) printf("文件打开失败"); 
   while(ch!=EOF)
   {
	   wd=scaner(fp);
	   print(&wd);
	   printf("\n");
   }
   fclose(fp);
}

/*
 0 表示:变量
 1 表示关键字:begin
 2 表示关键字:var
 3 表示关键字:real
 4 表示关键字:integer
 5 表示关键字:write
 6 表示关键字:read
 7 表示关键字:end
 8 表示:常数
 9 表示:实数
10 表示:‘+’
11 表示:‘:’
12 表示:‘;’
13 表示:‘(’
14 表示:‘)’
15 表示:‘:=’,注:‘:=’用f表示
-1 表示:不识别符号

*/

⌨️ 快捷键说明

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