📄 lex.l
字号:
%{#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();%}alpha [A-Za-z]digit [0-9]alphanum [A-Za-z0-9]delim [\t-\t\s-\s]rline [\r-\r]nline [\n-\n]%%{rline} {lineno++;}{nline} {WriteToken(NEWLINE);}{delim}{delim}* {;}{alpha}{alphanum}* {WriteToken(IDENTIFIER);ProcessId();}{digit}{digit}* {WriteToken(NUMBER);ProcessNum();}"int" {WriteToken(INT);}"if" {WriteToken(IF);}"else" {WriteToken(ELSE);}"return" {WriteToken(RETURN);}"float" {WriteToken(FLOAT);}"struct" {WriteToken(STRUCT);}"(" {WriteToken(LPAR);}")" {WriteToken(RPAR);}"{" {WriteToken(LBRACE);}"}" {WriteToken(RBRACE);}"[" {WriteToken(LBRACK);}"]" {WriteToken(RBRACK);}"==" {WriteToken(EQUAL);}"=" {WriteToken(ASSIGN);}";" {WriteToken(SEMICOLON);}"," {WriteToken(COMMA);}"." {WriteToken(DOT);}"+" {WriteToken(PLUS);}"-" {WriteToken(MINUS);}"*" {WriteToken(TIMES);}"/" {WriteToken(DIVIDE);}%%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 + -