decompiler support binary precedence

This commit is contained in:
xensik 2021-05-11 22:20:05 +02:00
parent 86a7576bac
commit e7f5add67b
8 changed files with 222 additions and 0 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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