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

📄 词法分析器.cpp

📁 比较简单的一个词法分析器
💻 CPP
字号:
#include<iostream.h>
#include<fstream.h>
#include<string.h>
        int y=0,z=0,j=0;
	    int i=0,m=1000,n=2000; 
	    char character,s;
		int c;
		char token[30];

void show(char *a,int d)
{
	token[j]='\0';
cout<<"("<<a<<","<<d<<")"<<endl;

	ofstream fout("result.txt",ios::ate);
    fout<<"("<<a<<","<<d<<")"<<endl;
	fout.close();

token[0]='\0';j=0;

}

void show(char *a,char *b)
{
token[j]='\0';
cout<<"("<<a<<","<<b<<")"<<endl;

	ofstream fout("result.txt",ios::ate);
	fout<<"("<<a<<","<<b<<")"<<endl;
	fout.close();

token[0]='\0';j=0;

}

int reserve()//按token中的字符串查找保留字表,若是保留字,返回它的编码,否则返回0
{

	if (!(strcmp(token,"double")))
		return 1;
	else if (!(strcmp(token,"int")))
		return 2;
	else if (!(strcmp(token,"struct")))
		return 3;
	else if (!(strcmp(token,"break")))
		return 4;
	else if (!(strcmp(token,"else")))
		return 5;
	else if (!(strcmp(token,"long")))
		return 6;
	else if (!(strcmp(token,"switch")))
		return 7;
	else if (!(strcmp(token,"case")))
		return 8;
	else if (!(strcmp(token,"enum")))
		return 9;
	else if (!(strcmp(token,"register")))
		return 10;
	else if (!(strcmp(token,"typedef")))
		return 11;
	else if (!(strcmp(token,"char")))
		return 12;
	else if (!(strcmp(token,"extern")))
		return 13;
	else if (!(strcmp(token,"return")))
		return 14;
	else if (!(strcmp(token,"union")))
		return 15;
    else if (!(strcmp(token,"const")))
		return 16;
	else if (!(strcmp(token,"float")))
		return 17;
	else if (!(strcmp(token,"short")))
		return 18;
	else if (!(strcmp(token,"unsigned")))
		return 19;
	else if (!(strcmp(token,"continue")))
		return 20;
	else if (!(strcmp(token,"for")))
		return 21;
	else if (!(strcmp(token,"signed")))
		return 22;
	else if (!(strcmp(token,"void")))
		return 23;
	else if (!(strcmp(token,"default")))
		return 24;
	else if (!(strcmp(token,"goto")))
		return 25;
	else if (!(strcmp(token,"sizeof")))
		return 26;
        else if (!(strcmp(token,"volatile")))
		return 27;
	else if (!(strcmp(token,"do")))
		return 28;
	else if (!(strcmp(token,"if")))
		return 29;
	else if (!(strcmp(token,"static")))
		return 30;
	else if (!(strcmp(token,"while")))
		return 31;
    else if (!(strcmp(token,"main")))
		return 32; 
    else return 0;

}

void getchar()//将下一个输入字符读入character的过程,将向前指针移向下一个字符
{
	i=i+1;
}



void getbe()//若character中的字符为空白,则调用getchar,直到character为非空白为止。开始指针移到向前指针位置
{ 
	while(character==' ') getchar();
}


void concatenation(char s)//将token中的字符串与character中的字符连接,作为token中的新的字符串
{

	token[j]=s;
	j++;
	token[j]='\0';

}
	

int letter(char s)
{
switch(s)
{
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
case'g':
case'h':
case'i':
case'j':
case'k':
case'l':
case'm':
case'n':
case'o':
case'p':
case'q':
case'r':
case's':
case't':
case'u':
case'v':
case'w':
case'x':
case'y':
case'z':
	return 1;
default:return 0;
}
}

int digit(char s)
{
	switch(s){
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
	return 1;
default:return 0;
}
}


void main()
	{

       
		ifstream in("test.txt");
    	char str[80];
		in.read(str,100);
		cout<<"the original words are:  "<<str;
	
	
	while(str[i]!='\0'){

	    character=str[i];

		while(character==' ') {i=i+1;character=str[i];}
        
		s=str[i];


switch(s)
{
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
case'g':
case'h':
case'i':
case'j':
case'k':
case'l':
case'm':
case'n':
case'o':
case'p':
case'q':
case'r':
case's':
case't':
case'u':
case'v':
case'w':
case'x':
case'y':
case'z':
	while(letter(s)||digit(s))
	{
	concatenation(s);
	i++;
	s=str[i];
	
	}
	
   
	c=reserve();
	if(c==0) //不是保留字
	{
	
		show(token,m);m++; //m为标识符的地址参数
		break;
		

	}
    else //是保留字
	{
		show(token,reserve());
         
			  break;
	}

 break;

case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
	while(digit(s))
	{
		concatenation(s);
		i++;
		s=str[i];
	}


	show(token,n);n++; //n为常数的地址参数
    break;


case '+':getchar();show("+"," ");break;
case '-':getchar();show("-"," ");break;
case '*':
	getchar();character=str[i];
	if(character=='*') {show("**"," ");i++;}
    else show("*"," ");
	break;
case'<':
	getchar();character=str[i];
	if(character=='=')
	{
		 show("<="," ");i++;
	}
	else if(character=='>')
	{
		 show("<>"," ");i++;
	}
	else  show("<"," ");
		break;
case'=':
    getchar();character=str[i];
    if(character=='=')
	{
		 show("=="," ");i++;
	}
	else show("="," ");
	break;
case '>':
	getchar();character=str[i];
	if(character=='=') {show(">="," ");i++;}
	else show(">"," ");
	break;
case ':':
	getchar();character=str[i];
	if(character=='=') {show(":="," ");i++;}
	else show(":"," ");
	break;
case ';':
    show(";"," ");i++;break;
case '{':
    show("{"," ");i++;break;
case '}':
    show("}"," ");i++;break;
case '(':
    show("("," ");i++;break;
case ')':
    show(")"," ");i++;break;
case '/':
    show("/"," ");i++;break;
default:i++;break;
	}//end switch
	}//end while 

	}//end main

⌨️ 快捷键说明

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