slices
This commit is contained in:
parent
2c72168e18
commit
d294daa307
12 changed files with 104 additions and 41 deletions
45
src/parser.y
45
src/parser.y
|
|
@ -53,6 +53,8 @@
|
|||
%right BIT_AND_ASSIGN BIT_OR_ASSIGN BIT_XOR_ASSIGN LSHIFT_ASSIGN RSHIFT_ASSIGN
|
||||
|
||||
%type <std::unique_ptr<Expr>> expr
|
||||
%type <std::unique_ptr<Expr>> opt_expr
|
||||
%type <std::unique_ptr<Slice>> slice
|
||||
%type <std::unique_ptr<Stmt>> stmt
|
||||
%type <std::vector<std::unique_ptr<Expr>>> args
|
||||
%type <std::vector<std::unique_ptr<Stmt>>> stmt_list
|
||||
|
|
@ -70,12 +72,16 @@ stmt_list:
|
|||
;
|
||||
|
||||
stmt:
|
||||
expr NEWLINE { $$ = std::make_unique<ExprStmt>(std::move($1)); }
|
||||
| expr ASSIGN expr NEWLINE { $$ = std::make_unique<Assign>(std::move($1), std::move($3));}
|
||||
expr NEWLINE {
|
||||
$$ = std::make_unique<ExprStmt>(std::move($1));
|
||||
}
|
||||
| expr ASSIGN expr NEWLINE {
|
||||
$$ = std::make_unique<Assign>(std::move($1), std::move($3));
|
||||
}
|
||||
| KW_IF expr COLON NEWLINE INDENT stmt_list DEDENT {
|
||||
$$ = std::make_unique<If>(std::move($2), std::move($6), std::vector<std::unique_ptr<Stmt>>());
|
||||
}
|
||||
| KW_IF expr COLON NEWLINE INDENT stmt_list DEDENT KW_ELSE COLON NEWLINE INDENT stmt_list DEDENT{
|
||||
| KW_IF expr COLON NEWLINE INDENT stmt_list DEDENT KW_ELSE COLON NEWLINE INDENT stmt_list DEDENT {
|
||||
$$ = std::make_unique<If>(std::move($2), std::move($6), std::move($12));
|
||||
}
|
||||
| KW_FOR IDENTIFIER KW_IN expr COLON NEWLINE INDENT stmt_list DEDENT {
|
||||
|
|
@ -84,25 +90,40 @@ stmt:
|
|||
| KW_DEF IDENTIFIER L_PAREN params R_PAREN COLON NEWLINE INDENT stmt_list DEDENT {
|
||||
$$ = std::make_unique<FunctionDef>($2, std::move($4), std::move($9));
|
||||
}
|
||||
| KW_RETURN expr NEWLINE { $$ = std::make_unique<Return>(std::move($2));}
|
||||
| KW_RETURN expr NEWLINE {
|
||||
$$ = std::make_unique<Return>(std::move($2));
|
||||
}
|
||||
;
|
||||
|
||||
expr:
|
||||
NUMBER { $$ = std::make_unique<Number>($1); }
|
||||
| IDENTIFIER { $$ = std::make_unique<Identifier>($1); }
|
||||
| STRING { $$ = std::make_unique<String>($1); }
|
||||
| expr PLUS expr { $$ = std::make_unique<BinOp>(
|
||||
BinaryOperator(BinaryOperator::ADD),
|
||||
std::move($1), std::move($3)); }
|
||||
| expr MULTIPLY expr { $$ = std::make_unique<BinOp>(
|
||||
BinaryOperator(BinaryOperator::MUL),
|
||||
std::move($1), std::move($3)); }
|
||||
| L_PAREN expr R_PAREN {$$ = std::move($2); /* #todo: test for precedence*/}
|
||||
| expr PLUS expr { $$ = std::make_unique<BinOp>( BinaryOperator(BinaryOperator::ADD), std::move($1), std::move($3)); }
|
||||
| expr MULTIPLY expr { $$ = std::make_unique<BinOp>( BinaryOperator(BinaryOperator::MUL), std::move($1), std::move($3)); }
|
||||
| expr LT expr { $$ = std::make_unique<BinOp>( BinaryOperator(BinaryOperator::LT) , std::move($1), std::move($3)); }
|
||||
| expr KW_AND expr { $$ = std::make_unique<BinOp>( BinaryOperator(BinaryOperator::AND) , std::move($1), std::move($3)); }
|
||||
| expr KW_OR expr { $$ = std::make_unique<BinOp>( BinaryOperator(BinaryOperator::OR) , std::move($1), std::move($3)); }
|
||||
| expr L_BRACKET expr R_BRACKET { $$ = std::make_unique<Subscript>(std::move($1), std::move($3));}
|
||||
| expr L_BRACKET slice R_BRACKET{ $$ = std::make_unique<SliceSubscript>(std::move($1), std::move($3)); }
|
||||
| L_PAREN expr R_PAREN {$$ = std::move($2); }
|
||||
| expr L_PAREN args R_PAREN { $$ = std::make_unique<Call>(std::move($1), std::move($3));}
|
||||
| expr DOT IDENTIFIER { $$ = std::make_unique<Attribute>(std::move($1), $3);}
|
||||
| L_BRACKET args R_BRACKET { $$ = std::make_unique<List>(std::move($2));}
|
||||
| MINUS expr { $$ = std::make_unique<UnaryOpExpr>(UnaryOperator(UnaryOperator::NEG), std::move($2));}
|
||||
;
|
||||
|
||||
slice:
|
||||
opt_expr COLON opt_expr
|
||||
{ $$ = std::make_unique<Slice>(std::move($1), std::move($3), nullptr); }
|
||||
| opt_expr COLON opt_expr COLON opt_expr
|
||||
{ $$ = std::make_unique<Slice>(std::move($1), std::move($3), std::move($5)); }
|
||||
;
|
||||
|
||||
opt_expr:
|
||||
{ $$ = nullptr;}
|
||||
| expr { $$ = std::move($1);}
|
||||
|
||||
args:
|
||||
/* empty */ { $$ = std::vector<std::unique_ptr<Expr>>(); }
|
||||
| expr { $$ = std::vector<std::unique_ptr<Expr>>();
|
||||
|
|
@ -120,4 +141,4 @@ namespace yy {
|
|||
{
|
||||
std::cerr << "Error: " << msg << "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue