summaryrefslogtreecommitdiff
path: root/parser/decl.go
diff options
context:
space:
mode:
Diffstat (limited to 'parser/decl.go')
-rw-r--r--parser/decl.go42
1 files changed, 41 insertions, 1 deletions
diff --git a/parser/decl.go b/parser/decl.go
index fa07c17..6c10363 100644
--- a/parser/decl.go
+++ b/parser/decl.go
@@ -9,8 +9,48 @@ import (
"github.com/gnolang/parscan/scanner"
)
+func (p *Parser) ParseType(in Tokens) (out Tokens, err error) {
+ if len(in) < 2 {
+ return out, missingTypeError
+ }
+ if in[1].Id != lang.ParenBlock {
+ return p.parseTypeLine(in[1:])
+ }
+ if in, err = p.Scan(in[1].Block(), false); err != nil {
+ return out, err
+ }
+ for _, lt := range in.Split(lang.Semicolon) {
+ ot, err := p.parseTypeLine(lt)
+ if err != nil {
+ return out, err
+ }
+ out = append(out, ot...)
+ }
+ return out, err
+}
+
+func (p *Parser) parseTypeLine(in Tokens) (out Tokens, err error) {
+ if len(in) < 2 {
+ return out, missingTypeError
+ }
+ if in[0].Id != lang.Ident {
+ return out, errors.New("not an ident")
+ }
+ isAlias := in[1].Id == lang.Assign
+ toks := in[1:]
+ if isAlias {
+ toks = toks[1:]
+ }
+ typ, err := p.ParseTypeExpr(toks)
+ if err != nil {
+ return out, err
+ }
+ p.addSym(unsetAddr, in[0].Str, nil, symType, typ, p.funcScope != "")
+ return out, err
+}
+
func (p *Parser) ParseVar(in Tokens) (out Tokens, err error) {
- if len(in) < 1 {
+ if len(in) < 2 {
return out, errors.New("missing expression")
}
if in[1].Id != lang.ParenBlock {