From 386c39126d53fb87707f4146afb31b872323a3a2 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 6 Apr 2024 13:40:03 -0400 Subject: [PATCH] Parse constant declarations --- parser/fspl/parser_test.go | 2 +- parser/fspl/toplevel.go | 52 +++++++++++++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/parser/fspl/parser_test.go b/parser/fspl/parser_test.go index 429ae81..157c097 100644 --- a/parser/fspl/parser_test.go +++ b/parser/fspl/parser_test.go @@ -13,7 +13,7 @@ testString (test, - StructArray: 31:24:340920:(. x:Int y:Int) - String: *:U8 + FileDescriptor: I32 -| stdin 0 +| stdin 0 | stdout 1 | stderr 2`, // input diff --git a/parser/fspl/toplevel.go b/parser/fspl/toplevel.go index 1585d30..c31875b 100644 --- a/parser/fspl/toplevel.go +++ b/parser/fspl/toplevel.go @@ -126,7 +126,14 @@ func (this *treeParser) parseFunctionCore (pos errors.Position, access entity.Ac return function, nil } -func (this *treeParser) parseMethodCore (pos errors.Position, access entity.Access, typeName string) (*entity.Method, error) { +func (this *treeParser) parseMethodCore ( + pos errors.Position, + access entity.Access, + typeName string, +) ( + *entity.Method, + error, +) { function, err := this.parseFunctionCore(pos, access) if err != nil { return nil, err } return &entity.Method { @@ -139,14 +146,51 @@ func (this *treeParser) parseMethodCore (pos errors.Position, access entity.Acce }, nil } -func (this *treeParser) parseTypedefCore (pos errors.Position, access entity.Access, typeName string) (*entity.Typedef, error) { +func (this *treeParser) parseTypedefCore ( + pos errors.Position, + access entity.Access, + typeName string, +) ( + *entity.Typedef, + error, +) { pos = pos.Union(this.Pos()) ty, err := this.parseType() if err != nil { return nil, err } - return &entity.Typedef { + + typedef := &entity.Typedef { Pos: pos, Acc: access, Name: typeName, Type: ty, - }, nil + } + + for this.Is(lexer.Symbol) && this.ValueIs("|") { + constant, err := this.parseConstantDeclaration() + if err != nil { return nil, err } + typedef.Constants = append(typedef.Constants, constant) + } + + return typedef, nil +} + +func (this *treeParser) parseConstantDeclaration () (*entity.ConstantDeclaration, error) { + err := this.ExpectValue(lexer.Symbol, "|") + if err != nil { return nil, err } + declaration := &entity.ConstantDeclaration { + Pos: this.Pos(), + } + + err = this.ExpectNext(lexer.Ident) + if err != nil { return nil, err } + declaration.Name = this.Value() + this.Next() + + if this.Is(startTokensExpression...) { + value, err := this.parseExpression() + if err != nil { return nil, err } + declaration.Value = value + } + + return declaration, nil }