impl negate expression properly

This commit is contained in:
xensik
2022-06-15 17:06:58 +02:00
parent 9910527d60
commit 242ee33f07
54 changed files with 12575 additions and 11490 deletions

View File

@ -192,6 +192,7 @@ xsk::gsc::s4::parser::symbol_type S4lex(xsk::gsc::s4::lexer& lexer);
%type <ast::expr> expr_binary
%type <ast::expr> expr_primitive
%type <ast::expr_complement::ptr> expr_complement
%type <ast::expr_negate::ptr> expr_negate
%type <ast::expr_not::ptr> expr_not
%type <ast::expr_call::ptr> expr_call
%type <ast::expr_method::ptr> expr_method
@ -218,7 +219,6 @@ xsk::gsc::s4::parser::symbol_type S4lex(xsk::gsc::s4::lexer& lexer);
%type <ast::expr_level::ptr> expr_level
%type <ast::expr_animation::ptr> expr_animation
%type <ast::expr_animtree::ptr> expr_animtree
%type <ast::expr> expr_identifier_neg
%type <ast::expr_identifier::ptr> expr_identifier_nosize
%type <ast::expr_identifier::ptr> expr_identifier
%type <ast::expr_path::ptr> expr_path
@ -616,6 +616,7 @@ expr_binary
expr_primitive
: expr_complement { $$.as_node = std::move($1); }
| expr_negate { $$.as_node = std::move($1); }
| expr_not { $$.as_node = std::move($1); }
| expr_call { $$.as_node = std::move($1); }
| expr_method { $$.as_node = std::move($1); }
@ -636,7 +637,6 @@ expr_primitive
| expr_level { $$.as_node = std::move($1); }
| expr_animation { $$.as_node = std::move($1); }
| expr_animtree { $$.as_node = std::move($1); }
| expr_identifier_neg { $$ = std::move($1); }
| expr_identifier { $$.as_node = std::move($1); }
| expr_istring { $$.as_node = std::move($1); }
| expr_string { $$.as_node = std::move($1); }
@ -652,6 +652,17 @@ expr_complement
{ $$ = std::make_unique<ast::expr_complement>(@$, std::move($2)); }
;
expr_negate
: SUB expr_identifier %prec NEG
{ $$ = std::make_unique<ast::expr_negate>(@$, ast::expr(std::move($2))); }
| SUB expr_paren %prec NEG
{ $$ = std::make_unique<ast::expr_negate>(@$, ast::expr(std::move($2))); }
| SUB expr_array %prec NEG
{ $$ = std::make_unique<ast::expr_negate>(@$, ast::expr(std::move($2))); }
| SUB expr_field %prec NEG
{ $$ = std::make_unique<ast::expr_negate>(@$, ast::expr(std::move($2))); }
;
expr_not
: NOT expr
{ $$ = std::make_unique<ast::expr_not>(@$, std::move($2)); }
@ -814,11 +825,6 @@ expr_animtree
{ $$ = std::make_unique<ast::expr_animtree>(@$); };
;
expr_identifier_neg
: SUB IDENTIFIER
{ $$.as_node = std::make_unique<ast::expr_sub>(@$, ast::expr(std::make_unique<ast::expr_integer>(@$, "0")), ast::expr(std::make_unique<ast::expr_identifier>(@$, $2))); }
;
expr_identifier_nosize
: IDENTIFIER
{ $$ = std::make_unique<ast::expr_identifier>(@$, $1); };