bug fixed

This commit is contained in:
Valk Richard Li 2019-12-24 19:10:42 +08:00 committed by GitHub
parent 8111f02712
commit 3325416b10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 113 deletions

View File

@ -30,19 +30,19 @@ int main()
else if(command=="cls")
{
system("cls");
// win system("cls");
// linux system("clear");
// macOS system("clear");
// windows system("cls");
// linux system("clear");
// macOS system("clear");
}
else if(command=="del")
{
res.delete_all_source();
std::cout<<">> [Delete] complete."<<std::endl;
std::cout<<">>[Delete] complete."<<std::endl;
}
else if(command=="lib")
{
res.load_lib_file();
std::cout<<">> [Lib] loaded."<<std::endl;
std::cout<<">>[Lib] loaded."<<std::endl;
}
else if(command=="rs")
{

View File

@ -203,16 +203,15 @@ class nasal_lexer
std::list<char>::iterator ptr=res.begin();
while(ptr!=res.end())
{
while(*ptr==' ' || *ptr=='\n' || *ptr=='\t' || *ptr=='\r' || *ptr<0 || *ptr>127)
while(ptr!=res.end() && (*ptr==' ' || *ptr=='\n' || *ptr=='\t' || *ptr=='\r' || *ptr<0 || *ptr>127))
{
if(*ptr=='\n')
++line;
++ptr;
if(ptr==res.end())
break;
}
if(ptr==res.end())
break;
if(*ptr=='_' || ('a'<=*ptr && *ptr<='z') || ('A'<=*ptr && *ptr<='Z'))
{
// get identifier or reserve word
@ -304,17 +303,7 @@ class nasal_lexer
while(*ptr!=str_begin && *ptr!='\n')
{
token_str+=*ptr;
if(*ptr=='\\')
{
++ptr;
if(ptr!=res.end())
{
token_str+=*ptr;
++ptr;
}
}
else
++ptr;
++ptr;
if(ptr==res.end())
break;
}
@ -323,8 +312,7 @@ class nasal_lexer
{
++error;
std::cout<<">>[Lexer-error] line "<<line<<": this string must have a \' "<<str_begin<<" \' as its end."<<std::endl;
if(ptr==res.end())
break;
--ptr;
}
else
{
@ -398,43 +386,28 @@ class nasal_lexer
else if(i->type==__token_reserve_word)
{
detail.line=i->line;
detail.str=i->str;
if(i->str=="for")
detail.type=__for;
else if(i->str=="foreach")
detail.type=__foreach;
else if(i->str=="forindex")
detail.type=__forindex;
else if(i->str=="while")
detail.type=__while;
else if(i->str=="var")
detail.type=__var;
else if(i->str=="func")
detail.type=__func;
else if(i->str=="break")
detail.type=__break;
else if(i->str=="continue")
detail.type=__continue;
else if(i->str=="return")
detail.type=__return;
else if(i->str=="if")
detail.type=__if;
else if(i->str=="else")
detail.type=__else;
else if(i->str=="elsif")
detail.type=__elsif;
else if(i->str=="nil")
detail.type=__nil;
else if(i->str=="and")
detail.type=__and_operator;
else if(i->str=="or")
detail.type=__or_operator;
detail.str ="";
if(i->str=="for") detail.type=__for;
else if(i->str=="foreach") detail.type=__foreach;
else if(i->str=="forindex") detail.type=__forindex;
else if(i->str=="while") detail.type=__while;
else if(i->str=="var") detail.type=__var;
else if(i->str=="func") detail.type=__func;
else if(i->str=="break") detail.type=__break;
else if(i->str=="continue") detail.type=__continue;
else if(i->str=="return") detail.type=__return;
else if(i->str=="if") detail.type=__if;
else if(i->str=="else") detail.type=__else;
else if(i->str=="elsif") detail.type=__elsif;
else if(i->str=="nil") detail.type=__nil;
else if(i->str=="and") detail.type=__and_operator;
else if(i->str=="or") detail.type=__or_operator;
detail_token.push_back(detail);
}
else if(i->type==__token_identifier)
{
detail.line=i->line;
detail.str=i->str;
detail.str =i->str;
if(i->str.length()<=3)
detail.type=__id;
else
@ -442,7 +415,12 @@ class nasal_lexer
std::string tempstr=i->str;
int strback=tempstr.length()-1;
if(tempstr.length()>3 &&tempstr[strback]=='.' && tempstr[strback-1]=='.' && tempstr[strback-2]=='.')
{
detail.str="";
for(int j=0;j<tempstr.length()-3;++j)
detail.str+=tempstr[j];
detail.type=__dynamic_id;
}
else
detail.type=__id;
}
@ -451,74 +429,46 @@ class nasal_lexer
else if(i->type==__token_operator)
{
detail.line=i->line;
detail.str=i->str;
if(i->str=="+")
detail.type=__add_operator;
else if(i->str=="-")
detail.type=__sub_operator;
else if(i->str=="*")
detail.type=__mul_operator;
else if(i->str=="/")
detail.type=__div_operator;
else if(i->str=="~")
detail.type=__link_operator;
else if(i->str=="+=")
detail.type=__add_equal;
else if(i->str=="-=")
detail.type=__sub_equal;
else if(i->str=="*=")
detail.type=__mul_equal;
else if(i->str=="/=")
detail.type=__div_equal;
else if(i->str=="~=")
detail.type=__link_equal;
else if(i->str=="=")
detail.type=__equal;
else if(i->str=="==")
detail.type=__cmp_equal;
else if(i->str=="!=")
detail.type=__cmp_not_equal;
else if(i->str=="<")
detail.type=__cmp_less;
else if(i->str=="<=")
detail.type=__cmp_less_or_equal;
else if(i->str==">")
detail.type=__cmp_more;
else if(i->str==">=")
detail.type=__cmp_more_or_equal;
else if(i->str==";")
detail.type=__semi;
else if(i->str==".")
detail.type=__dot;
else if(i->str==":")
detail.type=__colon;
else if(i->str==",")
detail.type=__comma;
else if(i->str=="?")
detail.type=__ques_mark;
else if(i->str=="!")
detail.type=__nor_operator;
else if(i->str=="[")
detail.type=__left_bracket;
else if(i->str=="]")
detail.type=__right_bracket;
else if(i->str=="(")
detail.type=__left_curve;
else if(i->str==")")
detail.type=__right_curve;
else if(i->str=="{")
detail.type=__left_brace;
else if(i->str=="}")
detail.type=__right_brace;
detail.str ="";
if(i->str=="+") detail.type=__add_operator;
else if(i->str=="-") detail.type=__sub_operator;
else if(i->str=="*") detail.type=__mul_operator;
else if(i->str=="/") detail.type=__div_operator;
else if(i->str=="~") detail.type=__link_operator;
else if(i->str=="+=") detail.type=__add_equal;
else if(i->str=="-=") detail.type=__sub_equal;
else if(i->str=="*=") detail.type=__mul_equal;
else if(i->str=="/=") detail.type=__div_equal;
else if(i->str=="~=") detail.type=__link_equal;
else if(i->str=="=") detail.type=__equal;
else if(i->str=="==") detail.type=__cmp_equal;
else if(i->str=="!=") detail.type=__cmp_not_equal;
else if(i->str=="<") detail.type=__cmp_less;
else if(i->str=="<=") detail.type=__cmp_less_or_equal;
else if(i->str==">") detail.type=__cmp_more;
else if(i->str==">=") detail.type=__cmp_more_or_equal;
else if(i->str==";") detail.type=__semi;
else if(i->str==".") detail.type=__dot;
else if(i->str==":") detail.type=__colon;
else if(i->str==",") detail.type=__comma;
else if(i->str=="?") detail.type=__ques_mark;
else if(i->str=="!") detail.type=__nor_operator;
else if(i->str=="[") detail.type=__left_bracket;
else if(i->str=="]") detail.type=__right_bracket;
else if(i->str=="(") detail.type=__left_curve;
else if(i->str==")") detail.type=__right_curve;
else if(i->str=="{") detail.type=__left_brace;
else if(i->str=="}") detail.type=__right_brace;
else
{
++error;
std::cout<<">>[Lexer-error] line "<<detail.line<<": unknown operator \'"<<i->str<<"\'."<<std::endl;
detail.type=__unknown_operator;
}
detail_token.push_back(detail);
}
}
std::cout<<">>[Lexer] complete generating. "<<error<<" error(s)."<<std::endl;
std::cout<<">>[Detail-Lexer] complete generating. "<<error<<" error(s)."<<std::endl;
return;
}
int get_error()