Skip to content

Commit

Permalink
Success running a fibonacci function!
Browse files Browse the repository at this point in the history
  • Loading branch information
d0iasm committed Aug 27, 2019
1 parent d5fc850 commit 88baba9
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 7 deletions.
5 changes: 5 additions & 0 deletions codegen.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,11 @@ func codegen(prog Program) {
fmt.Printf(" mov rbp, rsp\n")
fmt.Printf(" sub rsp, %d\n", f.stackSize)

// Push parameters to the stack.
for i, p := range f.params {
fmt.Printf(" mov [rbp-%d], %s\n", p.offset, argreg[i])
}

// Emit code.
for _, s := range f.stmts {
gen(s)
Expand Down
43 changes: 36 additions & 7 deletions parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"fmt"
)

var locals []Var
var tmpLocals []Var
var varOffset int = 8

type Expr interface {
Expand All @@ -21,8 +21,9 @@ type Program struct {

type Function struct {
name string
stmts []Stmt
params []Var
locals []Var
stmts []Stmt
stackSize int
}

Expand Down Expand Up @@ -90,7 +91,7 @@ func (For) isStmt() {}
func (Empty) isStmt() {}

func findVar(tok Token) *Var {
for _, v := range locals {
for _, v := range tmpLocals {
if v.name == tok.str {
return &v
}
Expand Down Expand Up @@ -138,25 +139,29 @@ func program() Program {
func function() Function {
// Initialize for one function.
name := ""
params := make([]Var, 0)

varOffset = 8
locals = make([]Var, 0)
tmpLocals = make([]Var, 0)

if consume("func") {
tok := consumeIdent()
if tok == nil {
panic("Expect an identifier after 'func' keyword.")
}
name = tok.str
// No sigunatures for now.
//fmt.Println("================")
//fmt.Println(tokens)
assert("(")
params = funcParams()
assert(")")
}

stmts := make([]Stmt, 0)
for len(tokens) > 0 && !next("func") {
stmts = append(stmts, stmt())
}
return Function{name, stmts, locals, len(locals) * 8}
return Function{name, params, tmpLocals, stmts, len(tmpLocals) * 8}
}

func stmt() Stmt {
Expand Down Expand Up @@ -353,7 +358,7 @@ func primary() Expr {
if varp == nil {
varp = &Var{tok.str, varOffset}
varOffset += 8
locals = append(locals, *varp)
tmpLocals = append(tmpLocals, *varp)
}
return *varp
}
Expand All @@ -378,6 +383,30 @@ func funcArgs() []Expr {
return args
}

func funcParams() []Var {
params := make([]Var, 0)
if next(")") {
return params
}

for {
tok := consumeIdent()
if tok == nil {
panic("Expect an identifier inside function parameters.")
}

v := Var{tok.str, varOffset}
varOffset += 8
tmpLocals = append(tmpLocals, v)
params = append(params, v)

if !consume(",") {
break
}
}
return params
}

func printNodes(funcs []Function) {
for i, f := range funcs {
fmt.Println("[Function]:", i, f.name)
Expand Down
3 changes: 3 additions & 0 deletions test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -117,5 +117,8 @@ assert 2 'func main() { return sub(5, 3); }'
assert 21 'func main() { return add6(1,2,3,4,5,6); }'

assert 32 'func main() { return ret32(); } func ret32() { return 32; }'
assert 7 'func main() { return add2(3,4); } func add2(x,y) { return x+y; }'
assert 1 'func main() { return sub2(4,3); } func sub2(x,y) { return x-y; }'
assert 55 'func main() { return fib(9); } func fib(x) { if x<=1 { return 1; } return fib(x-1) + fib(x-2); }'

echo OK

0 comments on commit 88baba9

Please sign in to comment.