📄 main.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 + -