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

📄 cifa.c

📁 词法分析器的功能是输入源程序
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
int getword(int i,char *buf,char*word);
int wordtype(char* word);
int main(void)
{
	FILE *fp;
	char buf[1000]; //缓冲区
	char path[100];
	int i=0,j=0;
	int type=2;
	char word[16];

	printf("Enter Source Path and Name:\n");
	scanf("%s",buf);
	while(buf[i]!='\0'){
		if(buf[i]=='\\'){path[j+i]='\\';j++;}
		path[i+j]=buf[i];
		i++;}
	path[i+j]='\0';

	fp=fopen(buf,"r");

	i=0;
	buf[i]=fgetc(fp);
	for(i=1;i<1000&&buf[i-1]!=EOF;i++){
		buf[i]=fgetc(fp);}
	buf[i]='\0';
	printf("%s\n",buf);

	for(i=0;buf[i]!=EOF;){ //缓冲区中是否有字符
		i=getword(i,buf,word); //取单词
		type=wordtype(word); //判断类型
		printf("(%d,\"%s\")\n",type,word); //输出
	}

	return 0;
}

int getword(int i,char *buf,char*word) //取单词
{
	int j=0;
	if(buf[i+j]>='a'&&buf[i+j]<='z')
	while(buf[i+j]>='a'&&buf[i+j]<='z'||buf[i+j]>='0'&&buf[i+j]<='9'){
		word[j]=buf[i+j];
		j++;
	}
	else if(buf[i+j]>='0'&&buf[i+j]<='9')
		while(buf[i+j]>='0'&&buf[i+j]<='9'){
		word[j]=buf[i+j];
		j++;
		if(buf[i+j]>='a'&&buf[i+j]<='z')printf("Error char %c after digit %c",buf[i+j],buf[i+j-1]);
		}
	else if(buf[i]=='+'||buf[i]=='-'||buf[i]=='*'||buf[i]=='/'||buf[i]=='='||buf[i]=='('||buf[i]==')'||buf[i]=='{'||buf[i]=='}'||buf[i]==','||buf[i]==';'||buf[i]=='['||buf[i]==']')
	{word[j]=buf[i+j];j++;}
	else if(buf[i+j]>='<'&&buf[i+j]<='>')
		while(buf[i+j]>='<'&&buf[i+j]<='>'){
		word[j]=buf[i+j];
		j++;
		}
	else if(buf[i]=='!'){
		if(buf[i]!='=')printf("error %c after ! is illegle",buf[i]);
		word[0]=buf[i];
		word[1]=buf[i+1];
		j=j+2;
	}
	else printf("Error illegle charactor %c",buf[i]),j++;
	word[j]='\0';
	while(buf[i+j]==' '||buf[i+j]=='\n')j++;
	return i+j;
}

int wordtype(char* word) //判断类型
{
	int i=0;
	if(word[0]>='a'&&word[0]<='z'){ //判断是否保留字,否则为标识符
		if(word[0]=='i'&&word[1]=='f'&&word[2]=='\0') return 1;
		if(word[0]=='i'&&word[1]=='n'&&word[2]=='t'&&word[3]=='\0') return 1;
		if(word[0]=='f'&&word[1]=='o'&&word[2]=='r'&&word[3]=='\0') return 1;
		if(word[0]=='w'&&word[1]=='h'&&word[2]=='i'&&word[3]=='l'&&word[4]=='e'&&word[5]=='\0') return 1;
		if(word[0]=='d'&&word[1]=='o'&&word[2]=='\0') return 1;
		if(word[0]=='r'&&word[1]=='e'&&word[2]=='t'&&word[3]=='u'&&word[4]=='r'&&word[5]=='n'&&word[6]=='\0') return 1;
		if(word[0]=='b'&&word[1]=='r'&&word[2]=='e'&&word[3]=='a'&&word[4]=='k'&&word[5]=='\0') return 1;
		if(word[0]=='c'&&word[1]=='o'&&word[2]=='n'&&word[3]=='t'&&word[4]=='i'&&word[5]=='n'&&word[6]=='u'&&word[7]=='e'&&word[8]=='\0') return 1;
		else return 2;
	}
	else if(word[0]>='0'&&word[0]<='9') return 3;//数字
	Else if(word[0]=='+'||word[0]=='-'||word[0]=='*'||word[0]=='/'||word[0]=='='||word[0]=='<'||word[0]=='>'||word[0]=='!') return 4;//运算符
	else if(word[0]==','||word[0]==';'||word[0]=='('||word[0]==')'||word[0]=='{'||word[0]=='}'||word[0]=='['||word[0]==']') return 5;//分隔符
	else return 0;
}

⌨️ 快捷键说明

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