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

📄 main.cpp

📁 词法分析器c++实现
💻 CPP
字号:
#include"Token.h"
#include"SymbolTable.h"
#include<iostream>
using namespace std;

const int KEYWORD=300;
const int OPERATOR=301;
const int DELIM=302;
const int NUMBER=303;
const int IDENTIFIER=304;
const int COMMENT=305;
const int NEWLINE=306;
void openFile(ifstream&,ofstream&,ofstream&);
int LexAnalyzer(ifstream&,ofstream&);
Token token;
SymbolTable table;
int main()
{
    ifstream inData;
	ofstream outData,outTable;
	openFile(inData,outData,outTable);

	
	while(inData)
	{
	   LexAnalyzer(inData,outData);
	}
	table.outPutTable(outTable);
	return 0;
}

/****************************************************************************************************/
void openFile(ifstream&inFile,ofstream&outFile,ofstream&Table)
{
	string inName,outName,tableName;
	cout<<"Please enter filename of the input :  "<<endl;
	cin>>inName;
	if(!cin)
	{
		cout<<"Cannot open input file!"<<endl;
	}

    else	inFile.open(inName.c_str());
	cout<<"Please enter filename of the output :  "<<endl;
	cin>>outName;
	if(!cin)
	{
		cout<<"Cannot open output file!"<<endl;
	}

    else	outFile.open(outName.c_str());
	cout<<"Please enter filename of the table :  "<<endl;
	cin>>tableName;
	if(!cin)
	{
		cout<<"Cannot open input file!"<<endl;
	}

    else	Table.open(tableName.c_str());
}

/********************************************************************************************/
int LexAnalyzer(ifstream& inFile,ofstream& outFile)
{
    char c1;
	string temp="";
	inFile.get(c1);

	if(c1=='\n')
	{
		token.line++; 
		return NEWLINE;
	}
	else if(c1=='/'&&inFile.peek()=='/')
	{
		inFile.ignore(2000,'\n');
		token.line++;
		return COMMENT;
	}
	else if((c1=='(')||(c1==')')||(c1==';')||(c1=='{')||(c1=='}'))
	{
		token.addBuffer(c1);
		token.convertBuffer(temp);
	    token.setToken("delim",temp);
	    token.outPutToken(outFile);
	    token.setDefault();
	    temp="";
	    return DELIM;
	}
	else if(c1=='a'||c1=='b'||c1=='c'||c1=='d'||c1=='e'||c1=='f'||c1=='g'||
	   c1=='h'||c1=='i'||c1=='j'||c1=='k'||c1=='l'||c1=='m'||c1=='n'||
	   c1=='o'||c1=='p'||c1=='q'||c1=='r'||c1=='s'||c1=='t'||c1=='u'||
	   c1=='v'||c1=='w'||c1=='x'||c1=='y'||c1=='z'||
	   c1=='A'||c1=='B'||c1=='C'||c1=='D'||c1=='E'||c1=='F'||c1=='G'||
	   c1=='H'||c1=='I'||c1=='J'||c1=='K'||c1=='L'||c1=='M'||c1=='N'||
	   c1=='O'||c1=='P'||c1=='Q'||c1=='R'||c1=='S'||c1=='T'||c1=='U'||
	   c1=='V'||c1=='W'||c1=='X'||c1=='Y'||c1=='Z'||
	   c1=='_')
	   {token.addBuffer(c1);
	   char c2;
	   inFile.get(c2);
	   while(inFile&&(c2=='a'||c2=='b'||c2=='c'||c2=='d'||c2=='e'||c2=='f'||c2=='g'||
	   c2=='h'||c2=='i'||c2=='j'||c2=='k'||c2=='l'||c2=='m'||c2=='n'||
	   c2=='o'||c2=='p'||c2=='q'||c2=='r'||c2=='s'||c2=='t'||c2=='u'||
	   c2=='v'||c2=='w'||c2=='x'||c2=='y'||c2=='z'||
	   c2=='A'||c2=='B'||c2=='C'||c2=='D'||c2=='E'||c2=='F'||c2=='G'||
	   c2=='H'||c2=='I'||c2=='J'||c2=='K'||c2=='L'||c2=='M'||c2=='N'||
	   c2=='O'||c2=='P'||c2=='Q'||c2=='R'||c2=='S'||c2=='T'||c2=='U'||
	   c2=='V'||c2=='W'||c2=='X'||c2=='Y'||c2=='Z'||
	   c2=='_'||c2=='1'||c2=='2'||c2=='3'||c2=='4'||c2=='5'||
		c2=='6'||c2=='7'||c2=='8'||c2=='9'||c2=='0'))
	   {token.addBuffer(c2);
	   inFile.get(c2);
	   }
	   inFile.putback(c2);
	   token.convertBuffer(temp);
	   if(temp=="int"||temp=="real"||temp=="if"||temp=="then"||temp=="while"||temp=="else")
	   {
		token.setToken("Keyword",temp);
		token.outPutToken(outFile);
		token.setDefault();
		temp="";
		return KEYWORD;
	   }
    	else {if(!table.isPresent(temp))
		{
			Element entry;
			entry.token=temp;
			entry.line=token.line;
			table.insert(entry);
		}
		token.setToken("Identifier",temp);
    	token.outPutToken(outFile);
		token.setDefault();
		temp="";
	    return IDENTIFIER;
		}
	}
	else if(c1=='+'||c1=='-'||c1=='*'||c1=='/'||c1=='!'||c1=='>'||c1=='<'||c1=='=')
	{
		token.addBuffer(c1);
        char c2;
		inFile>>c2;
		if((c1=='='&&c2=='=')||(c1=='>'&&c2=='=')||(c1=='<'&&c2=='=')||(c1=='!'&&c2=='='))
		{
			token.addBuffer(c2);
		token.convertBuffer(temp);
        token.setToken("Operator",temp);
			token.outPutToken(outFile);
			token.setDefault();
			temp="";
			return OPERATOR;
		}
     	else{
			inFile.putback(c2);
            token.convertBuffer(temp);
		token.setToken("Operator",temp);
		token.outPutToken(outFile);
		token.setDefault();
		temp="";
		return OPERATOR;}
	}

	else if(c1=='1'||c1=='2'||c1=='3'||c1=='4'||c1=='5'||
		c1=='6'||c1=='7'||c1=='8'||c1=='9'||c1=='0')
	{
		inFile.putback(c1);
		double n;
		inFile>>n;
		float ex;
		if(inFile.peek()=='E')
		{
			inFile>>ex;
		}
		else ex=0;

		token.setToken("Number","");
		token.setNum(n,ex);
		token.outPutData(outFile,n,ex);
		token.setDefault();
		return NUMBER;
	}
	

}




	

⌨️ 快捷键说明

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