diff options
Diffstat (limited to 'parser/parse.go')
| -rw-r--r-- | parser/parse.go | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/parser/parse.go b/parser/parse.go index 131e9c0..547957b 100644 --- a/parser/parse.go +++ b/parser/parse.go @@ -7,8 +7,8 @@ import ( "strconv" "strings" - "github.com/gnolang/parscan/lang" - "github.com/gnolang/parscan/scanner" + "github.com/mvertes/parscan/lang" + "github.com/mvertes/parscan/scanner" ) type Parser struct { @@ -246,6 +246,15 @@ func (p *Parser) ParseFunc(in Tokens) (out Tokens, err error) { out = append(out, scanner.Token{Id: lang.Grow, Beg: l}) } out = append(out, toks...) + if out[len(out)-1].Id != lang.Return { + // Ensure that a return statment is always added at end of function. + // TODO: detect missing or wrong returns. + x, err := p.ParseReturn(nil) + if err != nil { + return out, err + } + out = append(out, x...) + } out = append(out, scanner.Token{Id: lang.Label, Str: fname + "_end"}) return out, err } @@ -411,17 +420,19 @@ func (p *Parser) ParseLabel(in Tokens) (out Tokens, err error) { } func (p *Parser) ParseReturn(in Tokens) (out Tokens, err error) { - if len(in) > 1 { + if l := len(in); l > 1 { if out, err = p.ParseExpr(in[1:]); err != nil { return out, err } + } else if l == 0 { + in = Tokens{{Id: lang.Return}} // Implicit return in functions with no return parameters. } // TODO: the function symbol should be already present in the parser context. // otherwise no way to handle anonymous func. s := p.function - in[0].Beg = s.Type.NumOut() - in[0].End = s.Type.NumIn() + in[0].Beg = s.Type.Rtype.NumOut() + in[0].End = s.Type.Rtype.NumIn() out = append(out, in[0]) return out, err } |
