update lexer

This commit is contained in:
Li Haokun 2021-08-12 19:00:17 +08:00 committed by GitHub
parent 35fc848672
commit 5fe6681b0d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 18 deletions

View File

@ -101,7 +101,7 @@ private:
int line; int line;
int ptr; int ptr;
std::string line_code; std::string line_code;
std::vector<char> res; std::string res;
std::vector<token> token_list; std::vector<token> token_list;
int get_tok_type(std::string&); int get_tok_type(std::string&);
void die(const char*); void die(const char*);
@ -125,7 +125,6 @@ void nasal_lexer::openfile(std::string& filename)
{ {
++error; ++error;
std::cout<<"[lexer] cannot open file <"<<filename<<">.\n"; std::cout<<"[lexer] cannot open file <"<<filename<<">.\n";
fin.close();
return; return;
} }
while(!fin.eof()) while(!fin.eof())
@ -133,9 +132,8 @@ void nasal_lexer::openfile(std::string& filename)
char c=fin.get(); char c=fin.get();
if(fin.eof()) if(fin.eof())
break; break;
res.push_back(c); res+=c;
} }
fin.close();
return; return;
} }
@ -177,7 +175,7 @@ std::string nasal_lexer::num_gen()
while(ptr<res_size && IS_HEX_NUMBER(res[ptr])) while(ptr<res_size && IS_HEX_NUMBER(res[ptr]))
token_str+=res[ptr++]; token_str+=res[ptr++];
line_code+=token_str; line_code+=token_str;
if(token_str=="0x") if(token_str.length()<3)// "0x"
die("incorrect number."); die("incorrect number.");
return token_str; return token_str;
} }
@ -189,7 +187,7 @@ std::string nasal_lexer::num_gen()
while(ptr<res_size && IS_OCT_NUMEBR(res[ptr])) while(ptr<res_size && IS_OCT_NUMEBR(res[ptr]))
token_str+=res[ptr++]; token_str+=res[ptr++];
line_code+=token_str; line_code+=token_str;
if(token_str=="0o") if(token_str.length()<3)// "0o"
die("incorrect number."); die("incorrect number.");
return token_str; return token_str;
} }
@ -299,21 +297,14 @@ void nasal_lexer::scanner()
if(IS_IDENTIFIER(res[ptr])) if(IS_IDENTIFIER(res[ptr]))
{ {
token_str=id_gen(); token_str=id_gen();
token new_token(line,get_tok_type(token_str),token_str); token_list.push_back({line,get_tok_type(token_str),token_str});
if(!new_token.type) if(!token_list.back().type)
new_token.type=tok_id; token_list.back().type=tok_id;
token_list.push_back(new_token);
} }
else if(IS_DIGIT(res[ptr])) else if(IS_DIGIT(res[ptr]))
{ token_list.push_back({line,tok_num,num_gen()});
token_str=num_gen();
token_list.push_back({line,tok_num,token_str});
}
else if(IS_STRING(res[ptr])) else if(IS_STRING(res[ptr]))
{ token_list.push_back({line,tok_str,str_gen()});
token_str=str_gen();
token_list.push_back({line,tok_str,token_str});
}
else if(IS_SINGLE_OPERATOR(res[ptr])) else if(IS_SINGLE_OPERATOR(res[ptr]))
{ {
token_str=res[ptr]; token_str=res[ptr];