From 2eab5877e1c634db872b595dd2414f4031ae4eb5 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Mon, 13 Nov 2023 09:34:56 +0100 Subject: parser: initial support for type declarations. The parsing logic for type declarations is there. Note that no tokens are produced, only symbols. The different type kinds will be added next. --- parser/decl.go | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'parser/decl.go') 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 { -- cgit v1.2.3