mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Fix `& ^ |
priority
This commit is contained in:
parent
52ad17406e
commit
fdbf7defa5
1 changed files with 27 additions and 6 deletions
|
@ -797,7 +797,7 @@ Expr* parse_expr75(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
Expr* parse_expr30(Lexer& lex, CodeBlob& code, bool nv) {
|
Expr* parse_expr30(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
Expr* res = parse_expr75(lex, code, nv);
|
Expr* res = parse_expr75(lex, code, nv);
|
||||||
while (lex.tp() == '*' || lex.tp() == '/' || lex.tp() == '%' || lex.tp() == _DivMod || lex.tp() == _DivC ||
|
while (lex.tp() == '*' || lex.tp() == '/' || lex.tp() == '%' || lex.tp() == _DivMod || lex.tp() == _DivC ||
|
||||||
lex.tp() == _DivR || lex.tp() == _ModC || lex.tp() == _ModR || lex.tp() == '&') {
|
lex.tp() == _DivR || lex.tp() == _ModC || lex.tp() == _ModR) {
|
||||||
res->chk_rvalue(lex.cur());
|
res->chk_rvalue(lex.cur());
|
||||||
int t = lex.tp();
|
int t = lex.tp();
|
||||||
sym_idx_t name = symbols.lookup_add(std::string{"_"} + lex.cur().str + "_");
|
sym_idx_t name = symbols.lookup_add(std::string{"_"} + lex.cur().str + "_");
|
||||||
|
@ -815,7 +815,7 @@ Expr* parse_expr30(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse [-] E { (+ | - | `|` | ^) E }
|
// parse [-] E { ( + | - ) E }
|
||||||
Expr* parse_expr20(Lexer& lex, CodeBlob& code, bool nv) {
|
Expr* parse_expr20(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
Expr* res;
|
Expr* res;
|
||||||
int t = lex.tp();
|
int t = lex.tp();
|
||||||
|
@ -834,7 +834,7 @@ Expr* parse_expr20(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
} else {
|
} else {
|
||||||
res = parse_expr30(lex, code, nv);
|
res = parse_expr30(lex, code, nv);
|
||||||
}
|
}
|
||||||
while (lex.tp() == '-' || lex.tp() == '+' || lex.tp() == '|' || lex.tp() == '^') {
|
while (lex.tp() == '-' || lex.tp() == '+') {
|
||||||
res->chk_rvalue(lex.cur());
|
res->chk_rvalue(lex.cur());
|
||||||
t = lex.tp();
|
t = lex.tp();
|
||||||
sym_idx_t name = symbols.lookup_add(std::string{"_"} + lex.cur().str + "_");
|
sym_idx_t name = symbols.lookup_add(std::string{"_"} + lex.cur().str + "_");
|
||||||
|
@ -852,7 +852,7 @@ Expr* parse_expr20(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse E { ( << | >> | ~>> | ^>> ) E }
|
// parse E { ( << | >> | >>~ | >>^ ) E }
|
||||||
Expr* parse_expr17(Lexer& lex, CodeBlob& code, bool nv) {
|
Expr* parse_expr17(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
Expr* res = parse_expr20(lex, code, nv);
|
Expr* res = parse_expr20(lex, code, nv);
|
||||||
while (lex.tp() == _Lshift || lex.tp() == _Rshift || lex.tp() == _RshiftC || lex.tp() == _RshiftR) {
|
while (lex.tp() == _Lshift || lex.tp() == _Rshift || lex.tp() == _RshiftC || lex.tp() == _RshiftR) {
|
||||||
|
@ -895,9 +895,30 @@ Expr* parse_expr15(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parse E [ ( & | ^ | '|' ) E ]
|
||||||
|
Expr* parse_expr14(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
|
Expr* res = parse_expr15(lex, code, nv);
|
||||||
|
if (lex.tp() == '&' || lex.tp() == '^' || lex.tp() == '|') {
|
||||||
|
res->chk_rvalue(lex.cur());
|
||||||
|
int t = lex.tp();
|
||||||
|
sym_idx_t name = symbols.lookup_add(std::string{"_"} + lex.cur().str + "_");
|
||||||
|
check_global_func(lex.cur(), name);
|
||||||
|
SrcLocation loc{lex.cur().loc};
|
||||||
|
lex.next();
|
||||||
|
auto x = parse_expr15(lex, code, false);
|
||||||
|
x->chk_rvalue(lex.cur());
|
||||||
|
res = new Expr{Expr::_Apply, name, {res, x}};
|
||||||
|
res->here = loc;
|
||||||
|
res->set_val(t);
|
||||||
|
res->flags = Expr::_IsRvalue;
|
||||||
|
res->deduce_type(lex.cur());
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
// parse E [ ? E : E ]
|
// parse E [ ? E : E ]
|
||||||
Expr* parse_expr13(Lexer& lex, CodeBlob& code, bool nv) {
|
Expr* parse_expr13(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
Expr* res = parse_expr15(lex, code, nv);
|
Expr* res = parse_expr14(lex, code, nv);
|
||||||
if (lex.tp() == '?') {
|
if (lex.tp() == '?') {
|
||||||
res->chk_rvalue(lex.cur());
|
res->chk_rvalue(lex.cur());
|
||||||
SrcLocation loc{lex.cur().loc};
|
SrcLocation loc{lex.cur().loc};
|
||||||
|
@ -905,7 +926,7 @@ Expr* parse_expr13(Lexer& lex, CodeBlob& code, bool nv) {
|
||||||
auto x = parse_expr(lex, code, false);
|
auto x = parse_expr(lex, code, false);
|
||||||
x->chk_rvalue(lex.cur());
|
x->chk_rvalue(lex.cur());
|
||||||
lex.expect(':');
|
lex.expect(':');
|
||||||
auto y = parse_expr13(lex, code, false);
|
auto y = parse_expr14(lex, code, false);
|
||||||
y->chk_rvalue(lex.cur());
|
y->chk_rvalue(lex.cur());
|
||||||
res = new Expr{Expr::_CondExpr, {res, x, y}};
|
res = new Expr{Expr::_CondExpr, {res, x, y}};
|
||||||
res->here = loc;
|
res->here = loc;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue