cpp4.cpp

来自「这是一个C语言编写的实现的是对输入语句进行建单的词法分析的法分析器的源程序」· C++ 代码 · 共 206 行

CPP
206
字号
#include<stdio.h>
#include<string.h>
#include<iostream.h>
char prog[80],token[8];
char ch;
void scaner();
void lrparser();
void yucu();
void statement();
void expression();
void term();
void factor();
int syn,p,m,n,sum;int kk=0;
char *rwtab[6]={"begin","if","then","while","do","end"};
void main()
{
	p=0;
	printf("\n please input string:\n");
	do{
		ch=getchar();
	    prog[p]=ch;
	    p++;
	}while(ch!='#');
	p=0;
	
		scaner();
		lrparser();
	
}
void scaner()
{ 
	m=0;
	for(n=0;n<8;n++)token[n]=NULL;
	ch=prog[p++];
	while(ch==' ')
	    ch=prog[p++];
	if(ch>='a'&&ch<='z')
	{
		while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9')
		{	token[m++]=ch;
		    ch=prog[p++];
		}
	token[m++]='\0';p--;syn=10;
	for(n=0;n<6;n++)
		if(strcmp(token,rwtab[n])==0)
		{
			switch(n)
			{
			case 0 :syn=1;	break;
			case 1 :syn=2;	break;
			case 2 :syn=3;	break;
			case 3 :syn=4;	break;
			case 4 :syn=5;	break;
			case 5 :syn=6;	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'<' :m=0;token[m++]=ch;
			ch=prog[p++];
			if(ch=='>')
			{
				syn=21;
				token[m++]=ch;
			}
			else 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=18;
				token[m++]=ch;
			}
			else
			{
				syn=17;
				p--;
			}
			break;
		case'+' :syn=13;token[0]=ch;break;
		case'-' :syn=14;token[0]=ch;break;
		case'*' :syn=15;token[0]=ch;break;
		case'/' :syn=16;token[0]=ch;break;
	    case'=' :syn=25;token[0]=ch;break;
		case';' :syn=26;token[0]=ch;break;
		case'(' :syn=27;token[0]=ch;break;
		case')' :syn=28;token[0]=ch;break;
		case'#' :syn=0;token[0]=ch;break;
		default:syn=-1;
	}
}
void lrparser()
{
	if(syn==1)
	{
		scaner();
		yucu();
		if(syn==6)
		{
			scaner();
			if((syn==0)&&(kk==0))
				printf("success");
		}
		else{if(kk!=1)cout<<"no end;error";kk=1;}
	}
	else{printf("no begin;error");kk=1;}
	return;
}
void yucu()
{
	statement();
	while(syn==26)
	{
		scaner();
		statement();
	}
	return;
}
void statement()
{
	if(syn==10)
	{
		scaner();
		if(syn==18)
		{
			scaner();
			expression();
		}
		else{printf("赋值号错误");kk=1;}
	
	}
	else{printf("输出语句错误");kk=1;}
	return;
}
void expression()
{
	term();
	while(syn==13||syn==14)
	{
		scaner();
		term();
	}
	return;
}
void term()
{
	factor();
	while(syn==15||syn==16)
	{
		scaner();
		factor();
	}
	return;
}
void factor()
{
	if(syn==10||syn==11)
		scaner();
	else if(syn=27)
	{
		scaner();
		expression();
		if(syn==28)
		   scaner();
		else{printf("')'错误");kk=1;}
	}
	else{printf("表达式错误");kk=1;}
	return;
}
               

⌨️ 快捷键说明

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