mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
fix a lexer bug
This commit is contained in:
parent
b0203d5639
commit
1898c8a434
44
src/lexer.h
44
src/lexer.h
@ -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) {
|
||||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user