首页 > 技术文章 > 0916 编程实验一 词法分析程序

qiuhuimin 2015-10-22 16:18 原文

# include<stdio.h>
# include<stdlib.h>
# include<string.h>

int panduan(char tmp[])
{
	char b[6][10] = {"begin", "if", "then", "while", "do", "end", };
	int k = 0;

	while(k < 6)					// 临时变量tmp 与 字符串b[k] 进行比较
	{
		if(strcmp(tmp, b[k]) == 0)
		{
			printf("<%s, %d>\n", tmp, k+1);
			return 0;
		}
		k++;
	}
	printf("<%s, 10>\n", tmp);

	return 0;
}

void cifafenxi(char a[])
{
	int i = 0, j = 0;
	char tmp[10];
	int flag = 0;

	while(a[i] != '\0')
	{
		if(a[i] >= 'a' && a[i] <= 'z')		// 判断标识符
		{
			tmp[j] = a[i];
			j++;
			while((a[i+1] >= 'a' && a[i+1] <= 'z') || (a[i+1] >= '0' && a[i+1] <= '9'))
			{
				i++;
				tmp[j] = a[i];
				j++;
			}
			tmp[j] = '\0';
			j = panduan(tmp);
		}

		if(a[i] >= '0' && a[i] <= '9')		// 判断数字
		{
			tmp[j] = a[i];				
			j++;
			while(a[i+1] >= '0' && a[i+1] <= '9')
			{
				i++;
				tmp[j] = a[i];
				j++;
			}
			tmp[j] = '\0';
			printf("<%s, 11>\n", tmp);
			j = 0;
		}

		switch(a[i])		// 判断符号
		{
		case '+':printf("<+, 13>\n");break;
		case '-':printf("<-, 14>\n");break;
		case '*':printf("<*, 15>\n");break;
		case '/':printf("</, 16>\n");break;
		case ':':
			{
				if(a[i+1] == '=')
					printf("<:=, 18>\n");
				else
					printf("<:, 17>\n");
			}break;
		case '<':
			{
				if(a[i+1] == '=')
					printf("<<=, 21>\n");
				else if(a[i+1] == '>')
					printf("<<>, 22>\n");
				else
					printf("<<, 20>\n");
			}break;
		case '>':
			{
				if(a[i+1] == '=')
					printf("<>=, 24>\n");
				else
					printf("<>, 23>\n");
			}break;
		case '=':printf("<=, 25>\n");break;
		case ';':printf("<;, 26>\n");break;
		case '(':printf("<(, 27>\n");break;
		case ')':printf("<), 28>\n");break;
		case '#':printf("<#, 0>\n");break;
		}
	
		i++;
	}
}

int main(void)
{
	char a[300];

	printf("input : ");
	gets(a);
	cifafenxi(a);

	return 0;
}


推荐阅读