1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

AssignStmt

This commit is contained in:
Alexander Medvednikov
2019-12-28 19:16:04 +01:00
parent b5fe40624c
commit 5a6428f1ff
6 changed files with 61 additions and 23 deletions

View File

@@ -133,9 +133,15 @@ fn (p mut Parser) check_name() string {
}
pub fn (p mut Parser) stmt() ast.Stmt {
// println('stmt at ' + p.tok.str())
// `x := ...`
if p.tok.kind == .name && p.peek_tok.kind == .decl_assign {
return p.var_decl()
if p.tok.kind == .name {
if p.peek_tok.kind == .decl_assign {
return p.var_decl()
}
else if p.peek_tok.is_assign() {
return p.assign_stmt()
}
}
match p.tok.kind {
.key_module {
@@ -162,18 +168,27 @@ pub fn (p mut Parser) stmt() ast.Stmt {
}
}
pub fn (p mut Parser) assign_stmt() ast.AssignStmt {
left_expr,left_type := p.expr(0)
op := p.tok.kind
println('assignn_stmt() ' + op.str())
p.next()
right_expr,right_type := p.expr(0)
return ast.AssignStmt{
left: left_expr
right: right_expr
op: op
}
}
// Implementation of Pratt Precedence
pub fn (p mut Parser) expr(rbp int) (ast.Expr,types.Type) {
println('expr at ' + p.tok.str())
// println('expr at ' + p.tok.str())
// null denotation (prefix)
mut node := ast.Expr{}
mut typ := types.void_type
match p.tok.kind {
.name {
// `x := ...`
// if p.peek_tok.kind == .decl_assign {
// return p.var_decl()
// }
// name expr
node = ast.Ident{
name: p.tok.lit
@@ -215,6 +230,16 @@ pub fn (p mut Parser) expr(rbp int) (ast.Expr,types.Type) {
if prev_tok.is_right_assoc() {
mut expr := ast.Expr{}
expr,t2 = p.expr(prev_tok.precedence() - 1)
/*
if prev_tok.is_assign() {
return ast.AssignStmt {
left: node
op: prev_tok.kind
right: expr
}, types.void_type
}
*/
node = ast.BinaryExpr{
left: node
// left_type: t1