Simplify bison grammar to use precedence rules
This commit is contained in:
parent
1e6f601f00
commit
4867c970d8
1 changed files with 26 additions and 53 deletions
|
|
@ -131,6 +131,14 @@ template <typename T>
|
||||||
|
|
||||||
%token end 0
|
%token end 0
|
||||||
|
|
||||||
|
%left ampersand vertical_bar circumflex
|
||||||
|
%left equals not_equals less greater less_equals greater_equals
|
||||||
|
%nonassoc as
|
||||||
|
%precedence UMINUS
|
||||||
|
%left plus minus
|
||||||
|
%left asterisk slash percent
|
||||||
|
%precedence NOT
|
||||||
|
|
||||||
%type <indented_statement_list> indented_statement_list
|
%type <indented_statement_list> indented_statement_list
|
||||||
%type <std::size_t> indentation
|
%type <std::size_t> indentation
|
||||||
%type <ast::statement> statement
|
%type <ast::statement> statement
|
||||||
|
|
@ -142,13 +150,6 @@ template <typename T>
|
||||||
%type <type::type> type_expression
|
%type <type::type> type_expression
|
||||||
%type <type::primitive_type> primitive_type
|
%type <type::primitive_type> primitive_type
|
||||||
%type <ast::expression> expression
|
%type <ast::expression> expression
|
||||||
%type <ast::expression> bool_expression
|
|
||||||
%type <ast::expression> compare_expression
|
|
||||||
%type <ast::expression> as_expression
|
|
||||||
%type <ast::expression> negate_expression
|
|
||||||
%type <ast::expression> sum_expression
|
|
||||||
%type <ast::expression> mult_expression
|
|
||||||
%type <ast::expression> not_expression
|
|
||||||
%type <ast::expression> postfix_expression
|
%type <ast::expression> postfix_expression
|
||||||
%type <ast::expression> base_expression
|
%type <ast::expression> base_expression
|
||||||
%type <std::vector<ast::expression_ptr>> comma_separated_expression_list
|
%type <std::vector<ast::expression_ptr>> comma_separated_expression_list
|
||||||
|
|
@ -235,52 +236,24 @@ primitive_type
|
||||||
;
|
;
|
||||||
|
|
||||||
expression
|
expression
|
||||||
: bool_expression { $$ = $1; }
|
: expression ampersand expression { $$ = ast::binary_operation{ast::binary_operation_type::logical_and, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
;
|
| expression vertical_bar expression { $$ = ast::binary_operation{ast::binary_operation_type::logical_or, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
|
| expression circumflex expression { $$ = ast::binary_operation{ast::binary_operation_type::logical_xor, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
bool_expression
|
| expression equals expression { $$ = ast::binary_operation{ast::binary_operation_type::equals, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
: compare_expression { $$ = $1; }
|
| expression not_equals expression { $$ = ast::binary_operation{ast::binary_operation_type::not_equals, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
| bool_expression ampersand compare_expression { $$ = ast::binary_operation{ast::binary_operation_type::logical_and, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
| expression less expression { $$ = ast::binary_operation{ast::binary_operation_type::less, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
| bool_expression vertical_bar compare_expression { $$ = ast::binary_operation{ast::binary_operation_type::logical_or, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
| expression greater expression { $$ = ast::binary_operation{ast::binary_operation_type::greater, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
| bool_expression circumflex compare_expression { $$ = ast::binary_operation{ast::binary_operation_type::logical_xor, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
| expression less_equals expression { $$ = ast::binary_operation{ast::binary_operation_type::less_equals, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
;
|
| expression greater_equals expression { $$ = ast::binary_operation{ast::binary_operation_type::greater_equals, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
|
| expression as type_expression { $$ = ast::cast_operation{ std::make_unique<ast::expression>($1), std::make_unique<type::type>($3), @$ }; }
|
||||||
compare_expression
|
| minus expression %prec UMINUS { $$ = ast::unary_operation{ast::unary_operation_type::negation, std::make_unique<ast::expression>($2), @$ }; }
|
||||||
: as_expression { $$ = $1; }
|
| expression plus expression { $$ = ast::binary_operation{ast::binary_operation_type::addition, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
| compare_expression equals as_expression { $$ = ast::binary_operation{ast::binary_operation_type::equals, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
| expression minus expression { $$ = ast::binary_operation{ast::binary_operation_type::subtraction, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
| compare_expression not_equals as_expression { $$ = ast::binary_operation{ast::binary_operation_type::not_equals, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
| expression asterisk expression { $$ = ast::binary_operation{ast::binary_operation_type::multiplication, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
| compare_expression less as_expression { $$ = ast::binary_operation{ast::binary_operation_type::less, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
| expression slash expression { $$ = ast::binary_operation{ast::binary_operation_type::division, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
| compare_expression greater as_expression { $$ = ast::binary_operation{ast::binary_operation_type::greater, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
| expression percent expression { $$ = ast::binary_operation{ast::binary_operation_type::remainder, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
||||||
| compare_expression less_equals as_expression { $$ = ast::binary_operation{ast::binary_operation_type::less_equals, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
| exclamation expression %prec NOT { $$ = ast::unary_operation{ast::unary_operation_type::logical_not, std::make_unique<ast::expression>($2), @$ }; }
|
||||||
| compare_expression greater_equals as_expression { $$ = ast::binary_operation{ast::binary_operation_type::greater_equals, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
| postfix_expression { $$ = $1; }
|
||||||
;
|
|
||||||
|
|
||||||
as_expression
|
|
||||||
: negate_expression { $$ = $1; }
|
|
||||||
| negate_expression as type_expression { $$ = ast::cast_operation{ std::make_unique<ast::expression>($1), std::make_unique<type::type>($3), @$ }; }
|
|
||||||
;
|
|
||||||
|
|
||||||
negate_expression
|
|
||||||
: sum_expression { $$ = $1; }
|
|
||||||
| minus sum_expression { $$ = ast::unary_operation{ast::unary_operation_type::negation, std::make_unique<ast::expression>($2), @$ }; }
|
|
||||||
;
|
|
||||||
|
|
||||||
sum_expression
|
|
||||||
: mult_expression { $$ = $1; }
|
|
||||||
| sum_expression plus mult_expression { $$ = ast::binary_operation{ast::binary_operation_type::addition, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
|
||||||
| sum_expression minus mult_expression { $$ = ast::binary_operation{ast::binary_operation_type::subtraction, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
|
||||||
;
|
|
||||||
|
|
||||||
mult_expression
|
|
||||||
: not_expression { $$ = $1; }
|
|
||||||
| mult_expression asterisk not_expression { $$ = ast::binary_operation{ast::binary_operation_type::multiplication, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
|
||||||
| mult_expression slash not_expression { $$ = ast::binary_operation{ast::binary_operation_type::division, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
|
||||||
| mult_expression percent not_expression { $$ = ast::binary_operation{ast::binary_operation_type::remainder, std::make_unique<ast::expression>($1), std::make_unique<ast::expression>($3), @$ }; }
|
|
||||||
;
|
|
||||||
|
|
||||||
not_expression
|
|
||||||
: postfix_expression
|
|
||||||
| exclamation postfix_expression { $$ = ast::unary_operation{ast::unary_operation_type::logical_not, std::make_unique<ast::expression>($2), @$ }; }
|
|
||||||
;
|
;
|
||||||
|
|
||||||
postfix_expression
|
postfix_expression
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue