📄 lex.cpp
字号:
#include "stdafx.h"
#include "lex.h"
ifstream fin;
ofstream fout;
string curstr;
dfa_state_map dfa;
state_action_map action;
int lineno = 1;
int state = 1;
void WriteToken(int token);
void ProcessNum();
void ProcessId();
void ReportParseError();
//DFA terminal state process function
void ProcessEndState(int state){
switch(state){
case 2: {;}break;
case 3: {WriteToken(NEWLINE);}break;
case 4: {lineno++;}break;
case 5: {WriteToken(LPAR);}break;
case 6: {WriteToken(RPAR);}break;
case 7: {WriteToken(TIMES);}break;
case 8: {WriteToken(PLUS);}break;
case 9: {WriteToken(COMMA);}break;
case 10: {WriteToken(MINUS);}break;
case 11: {WriteToken(DOT);}break;
case 12: {WriteToken(DIVIDE);}break;
case 13: {WriteToken(NUMBER);ProcessNum();}break;
case 14: {WriteToken(SEMICOLON);}break;
case 15: {WriteToken(ASSIGN);}break;
case 16: {WriteToken(IDENTIFIER);ProcessId();}break;
case 17: {WriteToken(LBRACK);}break;
case 18: {WriteToken(RBRACK);}break;
case 19: {WriteToken(IDENTIFIER);ProcessId();}break;
case 20: {WriteToken(IDENTIFIER);ProcessId();}break;
case 21: {WriteToken(IDENTIFIER);ProcessId();}break;
case 22: {WriteToken(IDENTIFIER);ProcessId();}break;
case 23: {WriteToken(IDENTIFIER);ProcessId();}break;
case 24: {WriteToken(LBRACE);}break;
case 25: {WriteToken(RBRACE);}break;
case 26: {;}break;
case 27: {WriteToken(NUMBER);ProcessNum();}break;
case 28: {WriteToken(EQUAL);}break;
case 29: {WriteToken(IDENTIFIER);ProcessId();}break;
case 30: {WriteToken(IDENTIFIER);ProcessId();}break;
case 31: {WriteToken(IDENTIFIER);ProcessId();}break;
case 32: {WriteToken(IF);}break;
case 33: {WriteToken(IDENTIFIER);ProcessId();}break;
case 34: {WriteToken(IDENTIFIER);ProcessId();}break;
case 35: {WriteToken(IDENTIFIER);ProcessId();}break;
case 36: {WriteToken(IDENTIFIER);ProcessId();}break;
case 37: {WriteToken(IDENTIFIER);ProcessId();}break;
case 38: {WriteToken(INT);}break;
case 39: {WriteToken(IDENTIFIER);ProcessId();}break;
case 40: {WriteToken(IDENTIFIER);ProcessId();}break;
case 41: {WriteToken(ELSE);}break;
case 42: {WriteToken(IDENTIFIER);ProcessId();}break;
case 43: {WriteToken(IDENTIFIER);ProcessId();}break;
case 44: {WriteToken(IDENTIFIER);ProcessId();}break;
case 45: {WriteToken(FLOAT);}break;
case 46: {WriteToken(IDENTIFIER);ProcessId();}break;
case 47: {WriteToken(IDENTIFIER);ProcessId();}break;
case 48: {WriteToken(RETURN);}break;
case 49: {WriteToken(STRUCT);}break;
default:{ReportParseError();}break;
}
}
void WriteToken(int token){
fout<<unsigned char(token);
}
void ProcessNum(){
fout<<unsigned char(0x20)<<curstr<<unsigned char(0x20);
}
void ProcessId(){
fout<<unsigned char(0x20)<<curstr<<unsigned char(0x20);
}
void ReportParseError(){
cerr<<"\nParse Error!\n";
cerr<<"Line "<<lineno<<": "<<curstr<<"_<--";
cerr<<"\n\n";
fout<<"\nParse Error!\n";
fout<<"Line "<<lineno<<": "<<curstr<<"_<--";
fout<<"\n\n";
fin.close();
fout.close();
exit(0);
}
void InitDFA(){
ifstream dfain;
dfain.open("dfa.bin", ios::binary);
if (!dfain){
cerr<<"\nError: DFA code file not found.\n";
exit(0);
}
cout<<"\nloading DFA...\n";
unsigned long start = GetTickCount();
while(int(dfain.get())!=0x00){
dfain.unget();
int from = int(dfain.get());
char transition = char(dfain.get());
int to = int(dfain.get());
dfa[from][transition] = to;
}
int state_count = int(dfain.get());
for (int i = 0; i < state_count; i++){
if (int(dfain.get())==0x00){
action[i+1] = "";
dfain.get();
}
else{
getline(dfain, action[i+1]);
}
}
cout<<"Loading complete, "<<GetTickCount()-start<<" ms.\n";
dfain.close();
}
int _tmain(int argc, _TCHAR* argv[])
{
InitDFA();
switch(argc){
case 1:
{
fin.open("test.txt", ios::binary);
fout.open("tokenlist.bin", ios::binary);
}
break;
case 2:
{
;
}
break;
case 3:
{
fin.open(argv[1], ios::binary);
fout.open(argv[2], ios::out);
}
break;
default:
cerr<<"\Error: illegal parameters.\n";
break;
}
if (!fin){
cerr<<"\nError: can't open source file.\n";
exit(0);
}
if (!fout){
cerr<<"\nError: can't open output file.\n";
exit(0);
}
char c;
cout<<"\n------------------------------------------\n";
cout<<lineno<<' ';
while(!fin.eof()){
c = fin.get();
if (dfa[state][c]!=0){
state = dfa[state][c];
curstr += c;
}
else{
ProcessEndState(state);
if (dfa[1][c]==0){
if (fin.eof()) break;
ReportParseError();
}
else{
state = dfa[1][c];
curstr.clear();
curstr += c;
}
}
cout<<c;
if (c==0x0a){
cout<<lineno<<' ';
}
}
cout<<"\n------------------------------------------\n";
cout<<"\nParse complete.\n";
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -