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

📄 1.txt

📁 编译原理 词法分析程序(定义保留字
💻 TXT
字号:
/////////////////////////////////////////////////////
//        《编译原理》实验一:词法分析程序         //
/////////////////////////////////////////////////////
//  定义保留字,标识符,常数,运算符,分隔符,其它  //
//        单词总别码分别为1,2,3,4,5,6         //
/////////////////////////////////////////////////////
#include <iostream>   
#include <fstream>   
#include <string>   
#include <string.h>   
#include <ctype.h>  
using namespace std; 

char *ReserveWords[8]={"if","int","for","while","do","return","break","continue"};
   
char GetChar(ifstream &S)   //将下一个输入字符读到ch中
{
	char b;   
    S.get(b); 
    return b;   
}  
  
char GetBC(ifstream &S)   //检查ch中的字符是否为空白
{   
    char b;   
    S.get(b); 
    while(b==' ')   
        S.get(b);   
    return b;   
}   
   
void Concat(char *str,char c)   //将ch中的字符连接到strToken之后
{   
    size_t n=strlen(str); //strlen返回str中字符的个数,其中str为一个以'\0'结尾的字符串 
    str[n++]=c;   
    str[n]='\0';   
}   
  
bool Reserve(const char *str)   //判断保留字
{   
    bool a = false;   
    for (int i=0;i<8;i++)
		{
		if(_stricmp(ReserveWords[i],str)==0)//比较保留字和输入的字符串,相等返回0
			{
			a=true;   
            break;   
		}   
	}   
    return a;   
}   
  
char Retract(ifstream &S)   //将搜索指示器回调一个位置
{   
    S.seekg(-1,ios::cur);  //把S的读指针从当前位置回调1个位置
    return '\0';   
}   


void Analyzer(ifstream &S,ofstream &D)
{ 
    //定义保留字,标识符,常数,运算符,分隔符,其它的单词总别码分别为1,2,3,4,5,6;
	//分析结果输出的基本格式为“(单词,单词总别,单词总别码)”
	char ch;   
    char strToken[128]=" ";   
    ch=GetBC(S);   
	
    if(isalpha(ch))  //判断是保留字还是标识符
		{
		while(isalpha(ch)||isdigit(ch)||ch=='_')
			{
            Concat(strToken,ch);   
            ch=GetChar(S);
			}
		ch=Retract(S);
		if(Reserve(strToken)) 
		 	D<<"("<<strToken<<",保留字,1)"<<"\n";   
        else
		    D<<"("<<strToken<<",标识符,2)"<<"\n";
		}   
    else if(isdigit(ch)) //判断是否是常数
		{
		while(isdigit(ch))
			{
			Concat(strToken,ch);   
            ch=GetChar(S);
			}
		Retract(S);   
        D<<"("<<strToken<<",常数,3)"<<"\n"; 
		} 
	switch(ch)  //判断是否是运算符,分隔符或其它
	{
	case('+'): 
		  D<<"("<<ch<<",加,4)"<<"\n";break;
	case('-'): 
		  D<<"("<<ch<<",减,4)"<<"\n";break;	  
	case('*'): 
		  D<<"("<<ch<<",乘,4)"<<"\n";break;
    case('/'): 
		  D<<"("<<ch<<",除,4)"<<"\n";break;
	case('='): 
		  D<<"("<<ch<<",等于,4)"<<"\n";break;
    case(','): 
		  D<<"("<<ch<<",逗号,5)"<<"\n";break;
    case(';'): 
		  D<<"("<<ch<<",分号,5)"<<"\n";break;
	case('{'): 
		  D<<"("<<ch<<",左大括号,5)"<<"\n";break;
	case('}'): 
		  D<<"("<<ch<<",右大括号,5)"<<"\n";break;
	case('('): 
		  D<<"("<<ch<<",左括号,5)"<<"\n";break;
	case(')'): 
		  D<<"("<<ch<<",右括号,5)"<<"\n";break;
	default: 
		  D<<"("<<ch<<",其它,6)"<<"\n";break;
	}
}   


int main(int argc,char *argv[]) //argc是记录参数的个数,argv记录调用该主函数时给出的参数内容
{
	string strS;  //strS为文件名
    if (argc==1)   
    {
        cout<<"请输入需要进行词法分析的文件:";   
        getline(cin,strS);   
    }     
    ifstream S(strS.c_str());   
    if(S.fail())   
    {   
        cout<<"打开" <<strS<<"文件失败!"<<endl;   
        return 1;   
    }   
    ofstream D("分析结果.txt");   
    while(!S.eof())   //返回S里的eof变量,变量在S读到文件的结束符时变为1
         Analyzer(S,D); 
	S.close(); 
    D.close();     
    return 0;   
}   

⌨️ 快捷键说明

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