diff --git a/parser/parser_test.go b/parser/parser_test.go index fb87077..571d288 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -115,22 +115,16 @@ func TestType (test *testing.T) { :arf --- type ro Basic:Int - type ro BasicInit:Int 6 - type ro IntArray:{Int ..} - type ro IntArrayInit:{Int 3} 3298 923 92 - type ro Complex:Obj ro that:Basic ro this:Basic - type ro ComplexInit:Obj ro that:BasicInit ro this:Basic 23 - type ro ComplexWithComplexInit ro basic:Basic 87 ro complex0:Complex diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 8c40986..894d720 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -261,7 +261,11 @@ func (section *TypeSection) ToString (indent int) (output string) { section.inherits.ToString()) if section.defaultValue.value == nil { - // TODO: print out members + if len(section.members) > 0 { + // TODO: print out members + } else { + output += "\n" + } } else { output += " " + section.defaultValue.ToString(0, false) output += "\n" diff --git a/parser/type.go b/parser/type.go index 0ba64a2..7f1b3f5 100644 --- a/parser/type.go +++ b/parser/type.go @@ -1,8 +1,50 @@ package parser +import "git.tebibyte.media/sashakoshka/arf/types" +import "git.tebibyte.media/sashakoshka/arf/lexer" +// import "git.tebibyte.media/sashakoshka/arf/infoerr" + func (parser *ParsingOperation) parseTypeSection () ( section *TypeSection, err error, ) { + err = parser.expect(lexer.TokenKindName) + if err != nil { return } + + section = &TypeSection { location: parser.token.Location() } + + // get permission + err = parser.nextToken(lexer.TokenKindPermission) + if err != nil { return } + section.permission = parser.token.Value().(types.Permission) + + // get name + err = parser.nextToken(lexer.TokenKindName) + if err != nil { return } + section.name = parser.token.Value().(string) + + // get inherited type + err = parser.nextToken(lexer.TokenKindColon) + if err != nil { return } + err = parser.nextToken() + if err != nil { return } + section.inherits, err = parser.parseType() + if err != nil { return } + + if parser.token.Is(lexer.TokenKindNewline) { + err = parser.nextToken() + if err != nil { return } + + // section.value, err = parser.parseInitializationValues(0) + // if err != nil { return } + } else { + section.defaultValue, err = parser.parseArgument() + if err != nil { return } + + err = parser.expect(lexer.TokenKindNewline) + if err != nil { return } + err = parser.nextToken() + if err != nil { return } + } return }