decompiler unary precedence

This commit is contained in:
xensik 2021-05-13 11:57:06 +02:00
parent ec1513100e
commit 4080dcdc30
8 changed files with 98 additions and 0 deletions

View File

@ -3102,11 +3102,21 @@ void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or
void decompiler::process_expr_complement(const gsc::context_ptr& ctx, const gsc::expr_complement_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_not(const gsc::context_ptr& ctx, const gsc::expr_not_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_call(const gsc::context_ptr& ctx, const gsc::expr_call_ptr& expr)

View File

@ -3102,11 +3102,21 @@ void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or
void decompiler::process_expr_complement(const gsc::context_ptr& ctx, const gsc::expr_complement_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_not(const gsc::context_ptr& ctx, const gsc::expr_not_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_call(const gsc::context_ptr& ctx, const gsc::expr_call_ptr& expr)

View File

@ -3096,11 +3096,21 @@ void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or
void decompiler::process_expr_complement(const gsc::context_ptr& ctx, const gsc::expr_complement_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_not(const gsc::context_ptr& ctx, const gsc::expr_not_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_call(const gsc::context_ptr& ctx, const gsc::expr_call_ptr& expr)

View File

@ -3096,11 +3096,21 @@ void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or
void decompiler::process_expr_complement(const gsc::context_ptr& ctx, const gsc::expr_complement_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_not(const gsc::context_ptr& ctx, const gsc::expr_not_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_call(const gsc::context_ptr& ctx, const gsc::expr_call_ptr& expr)

View File

@ -3096,11 +3096,21 @@ void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or
void decompiler::process_expr_complement(const gsc::context_ptr& ctx, const gsc::expr_complement_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_not(const gsc::context_ptr& ctx, const gsc::expr_not_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_call(const gsc::context_ptr& ctx, const gsc::expr_call_ptr& expr)

View File

@ -3102,11 +3102,21 @@ void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or
void decompiler::process_expr_complement(const gsc::context_ptr& ctx, const gsc::expr_complement_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_not(const gsc::context_ptr& ctx, const gsc::expr_not_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_call(const gsc::context_ptr& ctx, const gsc::expr_call_ptr& expr)

View File

@ -3111,11 +3111,21 @@ void decompiler::process_expr_or(const gsc::context_ptr& ctx, const gsc::expr_or
void decompiler::process_expr_complement(const gsc::context_ptr& ctx, const gsc::expr_complement_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_not(const gsc::context_ptr& ctx, const gsc::expr_not_ptr& expr)
{
process_expr(ctx, expr->rvalue);
if(expr->rvalue.as_node->is_binary())
{
expr->rvalue = expr_ptr(std::make_unique<gsc::node_expr_paren>(std::move(expr->rvalue)));
}
}
void decompiler::process_expr_call(const gsc::context_ptr& ctx, const gsc::expr_call_ptr& expr)

View File

@ -539,6 +539,34 @@ public:
}
}
auto is_binary() -> bool
{
switch(type)
{
case gsc::node_t::expr_or:
case gsc::node_t::expr_and:
case gsc::node_t::expr_bitwise_or:
case gsc::node_t::expr_bitwise_exor:
case gsc::node_t::expr_bitwise_and:
case gsc::node_t::expr_equality:
case gsc::node_t::expr_inequality:
case gsc::node_t::expr_less:
case gsc::node_t::expr_greater:
case gsc::node_t::expr_less_equal:
case gsc::node_t::expr_greater_equal:
case gsc::node_t::expr_shift_left:
case gsc::node_t::expr_shift_right:
case gsc::node_t::expr_add:
case gsc::node_t::expr_sub:
case gsc::node_t::expr_mult:
case gsc::node_t::expr_div:
case gsc::node_t::expr_mod:
return true;
default:
return false;
}
}
auto precedence() -> std::uint8_t
{
switch(type)