C语言简单词法分析器

/*
词法分析器(C语言)
输入源程序、输出单词符号
1、预处理程序
2、扫描器(单词识别程序)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define KEYWORD_NUM 32

int pos;	// pos搜索指针
char ch;	// ch最新读入的字符
char buf[1000000];	// buf缓冲区
char strToken[256];	// strToken
char* key_word[] = {"auto", "break", "case", "char", "const", "continue", "default", "do", "double", "else", 
	"enum", "extern", "float", "for", "goto", "if", "int", "long", "register", "return", "short", "signed", 
	"sizeof", "static", "struct", "switch", "typedef", "union", "unsigned", "void", "volatile", "while"};

/*
预处理主要工作:
1、删除注释
2、删除续行符,以及后续换行符(0AH)。
3、换行符、TAB和空格具有界符作用,预处理时通常予以保留。为了简化判断,可在预处理时,将换行符和TAB统一替换为空格。
4、大多数语言(除C语言)不区分大小写,可在预处理时,将大写字母变换成小写字母,或相反,以方便后续处理。
5、对于受书写格式限制的语言(例Fortran和Cobol),还应识别标号区,正确给出语句标号。识别续行标志,把相继行捻接在一起,给出语句结束符。
*/
void pre_process(char* filename) {	//扫描缓冲区buf[ ]和扫描缓冲区指针i

	FILE *fp;
	if ((fp = fopen(filename, "r")) == NULL) {
		printf("file %s read error!\n", filename);
		exit(0);
	}

	char old_c = '\0', cur_c;
	int in_comment = 0;	// in_comment是否在注释内,1为在单行注释中,2为在多行注释中,或者拆分in_scomment、inmcomment
	int in_string = 0;	// in_string是否在字符串常量内
	int i = 0;
	while ((cur_c = fgetc(fp)) != EOF) {	// 文件尚未处理完
		//printf("cur_c = %c\n", cur_c);
		if (in_string) {	// 当前字符在字符串常量中
			if (old_c != '\\' && cur_c == '"') {	// 判断"前是否是转义字符
				in_string = 0;
			}
			buf[i] = cur_c;	//送入扫描缓冲区
			i++;
		} else {
			if (!in_comment) { //当前字符未处于注释中
				if (old_c == '/' && cur_c == '/') {	// 单行注释
					i = i - 1;
					in_comment = 1;
				} else if (old_c == '/' &&
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值