summaryrefslogtreecommitdiff
path: root/parser/decl.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2023-11-13 09:34:56 +0100
committerMarc Vertes <mvertes@free.fr>2023-11-13 09:34:56 +0100
commit2eab5877e1c634db872b595dd2414f4031ae4eb5 (patch)
tree66cf2f71f0e449ee629d684b4f9fe30d7bf1d61f /parser/decl.go
parent1977ce7c976cbbd5bd0de1d479a0abe269e62f3d (diff)
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.
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 {