summaryrefslogtreecommitdiff
path: root/parser/parse.go
diff options
context:
space:
mode:
Diffstat (limited to 'parser/parse.go')
-rw-r--r--parser/parse.go21
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
}