词法分析

本文介绍了一个简单的词法分析器的实现过程,该分析器能够处理基本的编程语言语法元素,如关键字、数字、运算符等,并展示了如何通过C语言进行编程实现。
#include<stdio.h>
#include<string.h>
char ch,token[8],prog[80];
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner();
main()
{
	p=0;
	printf("请输入一个字符串(输入#表示结束):");
	do{
		scanf("%c",&ch);
		prog[p++]=ch;
	}while(ch!=#);
	p=0;
	do{
		scaner();
		switch(syn)
		{
		case 11:printf("%-10d%5d\n",sum,syn);
			break;
		case -1:printf("输入的字符串有误!\n");
			getch();
			exit(0);
		default:printf("%-10s%5d\n",token,syn);
			break;
		}
	}while(syn!=0);
	getch();
}
void scaner()
{
	sum=0;
	for(m=0;m<8;m++)
		token[m++]=NULL;
	ch=prog[p++];
	m=0;
    while((ch==' ')||(ch=='\n'))
		ch=prog[p++];
	if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
	{
		while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
		{
			token[m++]=ch;
			ch=prog[p++];
		}
		p--;
		syn=10;
		for(n=0;n<6;n++)
			if(strcmp(token,rwtab[n])==0)
			{
				syn=n+1;
				break;
			}
	}
	else if((ch>='0')&&(ch<='9'))
	{
		while((ch>='0')&&(ch<='9'))
		{
			sum=sum*10+ch-'0';
			ch=prog[p++];
		}
		p--;
		syn=11;
	}
	else switch(ch)
	{
		case '<':token[m++]=ch;
			ch=prog[p++];
			if(ch=='=')
			{
				syn=22;
				token[m++]=ch;
			}
			else
			{
				syn=20;
				p--;
			}
			break;
		case '>':token[m++]=ch;
			ch=prog[p++];
			if(ch=='=')
			{
				syn=24;
				token[m++]=ch;
			}
			else
			{
				syn=23;
				p--;
			}
			break;
		case '+': token[m++]=ch;
			ch=prog[p++];
			if(ch=='+')
			{
				syn=17;
				token[m++]=ch;
			}
			else
			{
				syn=13;
				p--;
			}
			break;
		case '-':token[m++]=ch;
			ch=prog[p++];
			if(ch=='-')
			{
				syn=29;
				token[m++]=ch;
			}
			else
			{
				syn=14;
				p--;
			}
			break;
		case '!':ch=prog[p++];
			ch=prog[p++];
			if(ch=='=')
			{
				syn=21;
				token[m++]=ch;
			}
			else
			{
				syn=31;
				p--;
			}
			break;
		case '=':token[m++]=ch;
			ch=prog[p++];
			if(ch=='=')
			{
				syn=25;
				token[m++]=ch;
			}
			else
			{
				syn=18;
				p--;
			}
			break;
		case '*':syn=15;
		    token[m++]=ch;
		    break;
		case '/':syn=16;
		    token[m++]=ch;
		    break;
		case '(':syn=27;
		    token[m++]=ch; 
		    break;
		case ')':syn=28; 
		    token[m++]=ch;
		    break;
		case '{':syn=5;
		    token[m++]=ch; 
		    break;
		case '}':syn=6;
		    token[m++]=ch;
		    break;
		case ';':syn=26;
		    token[m++]=ch;
		    break;
		case '\"':syn=30;
		    token[m++]=ch;
		    break;
		case '#':syn=0;
		    token[m++]=ch;
		    break;
		case ':':syn=17;
		    token[m++]=ch;
		    break;
		default: syn=-1;
		    break;

	}
	token[m++]='\0';
}

  

转载于:https://www.cnblogs.com/229zyx/p/5936575.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值