fix a lexer bug

This commit is contained in:
blueloveTH 2023-06-05 18:30:21 +08:00
parent b0203d5639
commit 1898c8a434
2 changed files with 35 additions and 22 deletions

View File

@ -231,25 +231,6 @@ struct Lexer {
} }
if(kTokenKwMap.count(name)){ if(kTokenKwMap.count(name)){
if(name == "not"){
if(strncmp(curr_char, " in", 3) == 0){
curr_char += 3;
add_token(TK("not in"));
return 0;
}
}else if(name == "is"){
if(strncmp(curr_char, " not", 4) == 0){
curr_char += 4;
add_token(TK("is not"));
return 0;
}
}else if(name == "yield"){
if(strncmp(curr_char, " from", 5) == 0){
curr_char += 5;
add_token(TK("yield from"));
return 0;
}
}
add_token(kTokenKwMap.at(name)); add_token(kTokenKwMap.at(name));
} else { } else {
add_token(TK("@id")); add_token(TK("@id"));
@ -276,13 +257,34 @@ struct Lexer {
case TK("{"): case TK("["): case TK("("): brackets_level++; break; case TK("{"): case TK("["): case TK("("): brackets_level++; break;
case TK(")"): case TK("]"): case TK("}"): brackets_level--; break; case TK(")"): case TK("]"): case TK("}"): brackets_level--; break;
} }
nexts.push_back( Token{ auto token = Token{
type, type,
token_start, token_start,
(int)(curr_char - token_start), (int)(curr_char - token_start),
current_line - ((type == TK("@eol")) ? 1 : 0), current_line - ((type == TK("@eol")) ? 1 : 0),
value value
}); };
// handle "not in", "is not", "yield from"
if(!nexts.empty()){
switch(nexts.back().type){
case TK("not"):
if(type == TK("in")) {
nexts.back().type = TK("not in");
return;
}
case TK("is"):
if(type == TK("not")){
nexts.back().type = TK("is not");
return;
}
case TK("yield"):
if(type == TK("from")){
nexts.back().type = TK("yield from");
return;
}
default: nexts.push_back(token); return;
}
}
} }
void add_token_2(char c, TokenIndex one, TokenIndex two) { void add_token_2(char c, TokenIndex one, TokenIndex two) {

View File

@ -19,3 +19,14 @@ assert a.append == a.append
assert a.append is not a.append assert a.append is not a.append
assert a.append is not b.append assert a.append is not b.append
assert a.append != b.append assert a.append != b.append
inq = 0
if not inq:
assert True
else:
assert False
if inq is not 1:
assert True
if inq is not 0:
assert False