decompiler support binary precedence
This commit is contained in:
parent
86a7576bac
commit
e7f5add67b
@ -3038,12 +3038,40 @@ void decompiler::process_expr_binary(const gsc::context_ptr& ctx, const gsc::exp
|
|||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
||||||
|
@ -3038,12 +3038,40 @@ void decompiler::process_expr_binary(const gsc::context_ptr& ctx, const gsc::exp
|
|||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
||||||
|
@ -3032,12 +3032,40 @@ void decompiler::process_expr_binary(const gsc::context_ptr& ctx, const gsc::exp
|
|||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
||||||
|
@ -3032,12 +3032,40 @@ void decompiler::process_expr_binary(const gsc::context_ptr& ctx, const gsc::exp
|
|||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
||||||
|
@ -3032,12 +3032,40 @@ void decompiler::process_expr_binary(const gsc::context_ptr& ctx, const gsc::exp
|
|||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
||||||
|
@ -3038,12 +3038,40 @@ void decompiler::process_expr_binary(const gsc::context_ptr& ctx, const gsc::exp
|
|||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
||||||
|
@ -3047,12 +3047,40 @@ void decompiler::process_expr_binary(const gsc::context_ptr& ctx, const gsc::exp
|
|||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
void decompiler::process_expr_and(const gsc::context_ptr& ctx, const gsc::expr_and_ptr& expr)
|
||||||
{
|
{
|
||||||
process_expr(ctx, expr->lvalue);
|
process_expr(ctx, expr->lvalue);
|
||||||
process_expr(ctx, expr->rvalue);
|
process_expr(ctx, expr->rvalue);
|
||||||
|
|
||||||
|
auto prec = expr->lvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->lvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->lvalue)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prec = expr->rvalue.as_node->precedence();
|
||||||
|
|
||||||
|
if(prec && prec < expr->precedence())
|
||||||
|
{
|
||||||
|
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or_ptr& expr)
|
||||||
|
@ -538,6 +538,32 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto precedence() -> std::uint8_t
|
||||||
|
{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case gsc::node_t::expr_or: return 1;
|
||||||
|
case gsc::node_t::expr_and: return 2;
|
||||||
|
case gsc::node_t::expr_bitwise_or: return 3;
|
||||||
|
case gsc::node_t::expr_bitwise_exor: return 4;
|
||||||
|
case gsc::node_t::expr_bitwise_and: return 5;
|
||||||
|
case gsc::node_t::expr_equality: return 6;
|
||||||
|
case gsc::node_t::expr_inequality: return 6;
|
||||||
|
case gsc::node_t::expr_less: return 7;
|
||||||
|
case gsc::node_t::expr_greater: return 7;
|
||||||
|
case gsc::node_t::expr_less_equal: return 7;
|
||||||
|
case gsc::node_t::expr_greater_equal:return 7;
|
||||||
|
case gsc::node_t::expr_shift_left: return 8;
|
||||||
|
case gsc::node_t::expr_shift_right: return 8;
|
||||||
|
case gsc::node_t::expr_add: return 9;
|
||||||
|
case gsc::node_t::expr_sub: return 9;
|
||||||
|
case gsc::node_t::expr_mult: return 10;
|
||||||
|
case gsc::node_t::expr_div: return 10;
|
||||||
|
case gsc::node_t::expr_mod: return 10;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct node_true : public node
|
struct node_true : public node
|
||||||
|
Loading…
Reference in New Issue
Block a user