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

📄 词法分析1.cpp

📁 这是一个词法分析器的校程序
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
void scaner();        //扫描字符串函数
int output(void);    //定义output()函数
int IsLetter(char );
int IsDigit(char );
char prog[80],token[8];  //prog存放输入的字符串,token存放构成单词的字符串
char ch;
int syn,p,n,m,sum;  //syn存放单词符号的种别码,sum存放整型单词
char *rwtab[10]={"int","if","then","while","do","for","else","break","case","switch"};   //关键字表

void main()
{
	p=0;
	int i=0;
	cout<<"Please input your string and end with #:"<<endl;
	 cin.get(prog,80);  //要求用户输入字符串
    output();
	cout<<"             End!"<<endl<<"           Thanks!"<<endl;
}


int output()
{
	do
	{
           
		scaner();   //调用扫描子函数
		switch(syn)
		{
		case 11:
			cout<<"("<<"11,"<<sum<<")"<<endl;   
			break;                  
		case -1:
			cout<<"error"; break; 
        case 10:
		          cout<<"("<<syn<<",";
			for(n=0;token[n]!='\0';n++)
				cout<<token[n];
			cout<<")"<<endl;
			break;
		case 1:
              cout<<"(1"<<","<<"int"<<")"<<endl; break; 
        case 2:
              cout<<"(2"<<","<<"if"<<")"<<endl; break; 
			  case 3:
              cout<<"(3"<<","<<"then"<<")"<<endl; break; 
			  case 4:
              cout<<"(4"<<","<<"while"<<")"<<endl; break; 
			  case 5:
              cout<<"(5"<<","<<"do"<<")"<<endl; break;
			  case 6:
              cout<<"(6"<<","<<"for"<<")"<<endl; break; 
		default:cout<<"("<<syn<<",";
			for(n=0;token[n]!='\0';n++)
				cout<<token[n];
			cout<<")"<<endl;
			break;
			
		}
	}while(syn!=0);
	return 0;
}

void scaner()
{
	for(n=0;n<8;n++)
		token[n]=NULL;
	ch=prog[p++];                          //读入ch
	while(ch==' ') ch=prog[p++];    //空格跳过

	if(IsLetter(ch))     
	{
          int m=0; 
	while(IsDigit(ch)||IsLetter(ch))
	{
		token[m++]=ch;
		ch=prog[p++];
        
	}
	token[m++]='\0';
	
				
	p--;
	
	syn=10;
    for(n=0;n<6;n++)
	{
		if(strcmp(token,rwtab[n])==0)    //二元数组判断关键字的种别码
		{
			if(n==0) syn=1;
			else if(n==1) syn=2;
			else if(n==2) syn=3;
			else if(n==3) syn=4;
			else if(n==4) syn=5;
			else if(n==5) syn=6;
            else if(n==6) syn=7;
			else if(n==7) syn=8;
			else if(n==8) syn=9;
			else if(n==9) syn=12;
			
		}
	
	}

	}
	else 
		if(IsDigit(ch))       
		{
			sum=0;
			while(IsDigit(ch))
			{
				sum=sum*10+ch-'0';   //依次读入数字串,如1234
				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 '>':   m=0;              //对形如<=、>=的运算符进行判断及种别码的对应
				token[m++]=ch;
		ch=prog[p++];
		if(ch=='=')
		{
			syn=24;
             token[m++]=ch;
		}
		
		else 
		{
			syn=23;p--;
		}
		break;
			case '!':
				    m=0;
				token[m++]=ch;
		ch=prog[p++];
		
		 if(ch=='=')
		{
			syn=18;
			token[m++]=ch;
		}
		
		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=17;token[0]=ch;break;
				case ',':
				syn=19;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=29;token[0]=ch;break;
				case '}':
				syn=30;token[0]=ch;break;
				case '#':
				syn=0;token[0]=ch;break;
                default:
					syn=-1;break;

		}
}
int IsLetter(char ch)       //字母表
{
	if(ch=='A'||ch=='B'||ch=='C'||ch=='D'||ch=='E'||ch=='F'||ch=='G'||ch=='H'||
		ch=='I'||ch=='J'||ch=='K'||ch=='L'||ch=='M'||ch=='N'||ch=='O'||ch=='P'||
		ch=='Q'||ch=='R'||ch=='S'||ch=='T'||ch=='U'||ch=='V'||ch=='W'||ch=='X'||
		ch=='Y'||ch=='Z'||ch=='a'||ch=='b'||ch=='c'||ch=='d'||ch=='e'||ch=='f'||
		ch=='g'||ch=='h'||ch=='i'||ch=='j'||ch=='k'||ch=='l'||ch=='m'||ch=='n'||ch=='o'||
		ch=='p'||ch=='q'||ch=='r'||ch=='s'||ch=='t'||ch=='u'||ch=='v'||ch=='w'||
		ch=='x'||ch=='y'||ch=='z')
	return 1;
	else return 0;
}
int IsDigit(char ch)     //数字表
{
if(ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5'||ch=='6'||ch=='7'||ch=='8'||ch=='9'||ch=='0')
    return 1;
  else return 0;


}

⌨️ 快捷键说明

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