v2: ParExpr; mut var decl

pull/3871/head
Alexander Medvednikov 2020-02-28 14:41:19 +01:00
parent 7f5a15372f
commit 6a198df3af
3 changed files with 27 additions and 10 deletions

View File

@ -11,7 +11,7 @@ import (
pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | CharLiteral | pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | CharLiteral |
FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr | FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr |
AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr | MatchExpr | AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr | MatchExpr |
CastExpr | EnumVal | Assoc | SizeOf | None | MapInit | OrExpr CastExpr | EnumVal | Assoc | SizeOf | None | MapInit | OrExpr | ParExpr
pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt | pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt |
ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr | BranchStmt | ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr | BranchStmt |
@ -433,6 +433,12 @@ pub:
stmts []Stmt stmts []Stmt
} }
// `(3+4)`
pub struct ParExpr {
pub:
expr Expr
}
pub struct AssignExpr { pub struct AssignExpr {
pub: pub:
op token.Kind op token.Kind

View File

@ -101,6 +101,9 @@ fn (f mut Fmt) stmt(node ast.Stmt) {
match node { match node {
ast.AssignStmt { ast.AssignStmt {
for i, left in it.left { for i, left in it.left {
if left.var_info().is_mut {
f.write('mut ')
}
f.expr(left) f.expr(left)
if i < it.left.len - 1 { if i < it.left.len - 1 {
f.write(', ') f.write(', ')
@ -426,6 +429,11 @@ fn (f mut Fmt) expr(node ast.Expr) {
f.write(it.var_name + ' := ') f.write(it.var_name + ' := ')
f.expr(it.expr) f.expr(it.expr)
} }
ast.ParExpr{
f.write('(')
f.expr(it.expr)
f.write(')')
}
ast.PostfixExpr { ast.PostfixExpr {
f.expr(it.expr) f.expr(it.expr)
f.write(it.op.str()) f.write(it.op.str())

View File

@ -57,7 +57,7 @@ pub fn parse_stmt(text string, table &table.Table, scope &ast.Scope) ast.Stmt {
pref: &pref.Preferences{} pref: &pref.Preferences{}
scope: scope scope: scope
// scope: &ast.Scope{start_pos: 0, parent: 0} // scope: &ast.Scope{start_pos: 0, parent: 0}
} }
p.init_parse_fns() p.init_parse_fns()
p.read_first_token() p.read_first_token()
@ -329,7 +329,7 @@ pub fn (p mut Parser) stmt() ast.Stmt {
return ast.ExprStmt{ return ast.ExprStmt{
expr: expr expr: expr
// typ: typ // typ: typ
} }
} }
} }
@ -621,7 +621,7 @@ pub fn (p mut Parser) name_expr() ast.Expr {
p.expr_mod = '' p.expr_mod = ''
return ast.EnumVal{ return ast.EnumVal{
enum_name: enum_name // lp.prepend_mod(enum_name) enum_name: enum_name // lp.prepend_mod(enum_name)
val: val val: val
pos: p.tok.position() pos: p.tok.position()
} }
@ -684,6 +684,9 @@ pub fn (p mut Parser) expr(precedence int) (ast.Expr,table.Type) {
p.check(.lpar) p.check(.lpar)
node,typ = p.expr(0) node,typ = p.expr(0)
p.check(.rpar) p.check(.rpar)
node = ast.ParExpr{
expr: node
}
} }
.key_if { .key_if {
node = p.if_expr() node = p.if_expr()
@ -1165,11 +1168,11 @@ fn (p mut Parser) if_expr() ast.Expr {
stmts: stmts stmts: stmts
else_stmts: else_stmts else_stmts: else_stmts
// typ: typ // typ: typ
pos: pos pos: pos
has_else: has_else has_else: has_else
// left: left // left: left
} }
return node return node
} }
@ -1585,12 +1588,12 @@ fn (p mut Parser) var_decl_and_assign_stmt() ast.Stmt {
return ast.VarDecl{ return ast.VarDecl{
name: ident.name name: ident.name
// name2: name2 // name2: name2
expr: expr // p.expr(token.lowest_prec) expr: expr // p.expr(token.lowest_prec)
is_mut: info0.is_mut is_mut: info0.is_mut
// typ: typ // typ: typ
pos: p.tok.position() pos: p.tok.position()
} }
// return p.var_decl(ident[0], exprs[0]) // return p.var_decl(ident[0], exprs[0])
@ -1728,7 +1731,7 @@ fn (p mut Parser) match_expr() ast.Expr {
blocks: blocks blocks: blocks
match_exprs: match_exprs match_exprs: match_exprs
// typ: typ // typ: typ
cond: cond cond: cond
} }
return node return node