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

📄 test.c

📁 名称:C语言词法分析器 功能:1)从C语言源代码文件中提取所有词素 2)检测程序的词法错误
💻 C
字号:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
FILE *fp;
char c;
int state = 1, start = 1;
int lexical_value;	 /* install_id() 和 install_num()返回的指针 */
char* token_beginning = 0; /* 词素中首符号的索引 */
char* forward;         /* 向前指针 */
char* lexeme_beginning;/* 词素开始指针 */
char buffer[2048];		/* 缓冲区 */

/* 返回超前扫描字符 */
char nextchar()
{
	if(forward == null)    /* 刚开始扫描 */
	{
		forward = buffer;
	}
	else
	{
		forward++;
	}
	if(*forward == EOF)
	{
		if( forward == &(buffer[1024]) )
		{
			fread(&(buffer[1024]),1,1023,fp);
			buffer[2047] = EOF;
			forward++;
			return *forward;
		}
		else if( forward == &(buffer[2047]) )
		{
			fread(buffer,1,1023,fp);
			buffer[1023] = EOF;
			forward = buffer;
			return *forward;
		}
		else
		{
			return EOF;
			start = 1000;   /* 标示文件已经处理完了 */
		}
	}
}

/* 回退amount个位置 */
void retract(int amount)
{
	forward -= amount;
}

/* 插入符号表,这里只是简单输出 */
void install_id()
{
	char* p = lexeme_beginning;
	if(forward < lexeme_beginning)
	{
		printf("forward run too further than lexeme_beginning(in install_id())!");
		getch();
		exit(1);
	}
	printf("< 关键字或标示符 ,");
	for(; p <= forward; p++)
	{
		if(*p != EOF)
		{
			putchar(*p);
		}
	}
	putchar('>');
	putchar('\x0');
	putchar('\n');
}

/* 用来存放num表项的值,这里只是简单输出 */
void install_num()
{
	char* p = lexeme_beginning;
	if(forward < lexeme_beginning)
	{
		printf("forward run too further than lexeme_beginning(in install_id())!");
		getch();
		exit(1);
	}
	printf("< 数 ,");
	for(; p <= forward; p++)
	{
		if(*p != EOF)
		{
			putchar(*p);
		}
	}
	putchar('>');
	putchar('\n\n');}

/* 试图修复程序错误 */
void recover()
{
	printf("compile error!");
	getch();
	exit(1);
}

/* 当前模式匹配失败,**开始下一轮匹配 */
int fail()
{
	forward = lexeme_beginning;
	switch(start)
	{
		case 1: start = 4; break;
		case 4: start = 7; break;
		case 7: start = 15; break;
		case 15: start = 20; break;
		case 20: start = 42; break;
		case 42: start = 70; break;
		case 70: start = 90; break;
		case 90: start = 110; break;
		case 110: start = 120; break;
		case 120: recover(); break;
		case 1000:
			printf("The file has been lexed!\nThank you for use my program!\n");
			getch();
			exit(1);
		default:
			printf("exit at fail()'s default item!");
			getch();
			exit(1);
	}
	return start;
	//printf("The file is wrong!");
	//getch();
	//exit(1);
}

/* Get the token of the c file */
void nexttoken()
{
    while(1)
    {
        switch(state)
    	{
            case 1:
                c = nextchar();
				if(isalpha(c) || (c == '_'))
					state = 2;
				else state = fail();
				break;
			case 2:
                c = nextchar();
				

    	}

    }
}


void fillwholebuffer()
{
	fread(buffer,1,1023,fp);
	buffer[1023] = EOF;
	fread(&(buffer[1024]),1,1023,fp);
	buffer[2047] = EOF;
}

main()
{       
	int completed = 0;
    if((fp = fopen("C:\\file.c","r")) == null)
    {
        printf("\nError on open the file!");
        getch();
        exit(1);
    }
	fillwholebuffer();
	forward = null;
	lexeme_beginning = buffer;
    while(!completed)
    {
        nexttoken();
    }
    getch();
}

⌨️ 快捷键说明

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