Restructured type definitions to use a node tree

This commit is contained in:
Sasha Koshka 2022-08-18 23:38:32 -04:00
parent 717474a59e
commit 69aaae8f14
4 changed files with 27 additions and 23 deletions

View File

@ -27,7 +27,7 @@ func (parser *ParsingOperation) parseBody () (err error) {
parser.tree.typeSections = parser.tree.typeSections =
make(map[string] *TypeSection) make(map[string] *TypeSection)
} }
parser.tree.typeSections[section.name] = section parser.tree.typeSections[section.root.name] = section
if err != nil { return } if err != nil { return }
case "face": case "face":
case "enum": case "enum":

View File

@ -253,22 +253,30 @@ func (section *DataSection) ToString (indent int) (output string) {
} }
func (section *TypeSection) ToString (indent int) (output string) { func (section *TypeSection) ToString (indent int) (output string) {
output += doIndent ( output += section.root.ToString(indent, true)
indent, return
"type ", }
section.permission.ToString(), " ",
section.name, ":", func (node TypeNode) ToString (indent int, isRoot bool) (output string) {
section.inherits.ToString()) doIndent(indent)
if isRoot {
output += "type "
}
if section.defaultValue.value == nil { output += node.permission.ToString() + " "
if len(section.members) > 0 { output += node.name + ":"
output += node.what.ToString()
if node.defaultValue.value == nil {
if len(node.children) > 0 {
// TODO: print out members // TODO: print out members
} else { } else {
output += "\n" output += "\n"
} }
} else { } else {
output += " " + section.defaultValue.ToString(0, false) output += " " + node.defaultValue.ToString(0, false)
output += "\n" output += "\n"
} }
return return
} }

View File

@ -161,24 +161,19 @@ type DataSection struct {
value Argument value Argument
} }
// TypeMember represents member data // TypeNode represents a part of a type.
type TypeMember struct { type TypeNode struct {
location file.Location location file.Location
name string name string
what Type what Type
permission types.Permission permission types.Permission
defaultValue Argument defaultValue Argument
children map[string] TypeNode
} }
// TypeSection represents a type definition. // TypeSection represents a type definition.
type TypeSection struct { type TypeSection struct {
location file.Location location file.Location
name string root TypeNode
inherits Type
permission types.Permission
defaultValue Argument
// this should be 1 dimensional for now.
members map[string] TypeMember
} }

View File

@ -4,6 +4,7 @@ import "git.tebibyte.media/sashakoshka/arf/types"
import "git.tebibyte.media/sashakoshka/arf/lexer" import "git.tebibyte.media/sashakoshka/arf/lexer"
// import "git.tebibyte.media/sashakoshka/arf/infoerr" // import "git.tebibyte.media/sashakoshka/arf/infoerr"
// parseTypeSection parses a type definition.
func (parser *ParsingOperation) parseTypeSection () ( func (parser *ParsingOperation) parseTypeSection () (
section *TypeSection, section *TypeSection,
err error, err error,
@ -16,19 +17,19 @@ func (parser *ParsingOperation) parseTypeSection () (
// get permission // get permission
err = parser.nextToken(lexer.TokenKindPermission) err = parser.nextToken(lexer.TokenKindPermission)
if err != nil { return } if err != nil { return }
section.permission = parser.token.Value().(types.Permission) section.root.permission = parser.token.Value().(types.Permission)
// get name // get name
err = parser.nextToken(lexer.TokenKindName) err = parser.nextToken(lexer.TokenKindName)
if err != nil { return } if err != nil { return }
section.name = parser.token.Value().(string) section.root.name = parser.token.Value().(string)
// get inherited type // get inherited type
err = parser.nextToken(lexer.TokenKindColon) err = parser.nextToken(lexer.TokenKindColon)
if err != nil { return } if err != nil { return }
err = parser.nextToken() err = parser.nextToken()
if err != nil { return } if err != nil { return }
section.inherits, err = parser.parseType() section.root.what, err = parser.parseType()
if err != nil { return } if err != nil { return }
if parser.token.Is(lexer.TokenKindNewline) { if parser.token.Is(lexer.TokenKindNewline) {
@ -38,7 +39,7 @@ func (parser *ParsingOperation) parseTypeSection () (
// section.value, err = parser.parseInitializationValues(0) // section.value, err = parser.parseInitializationValues(0)
// if err != nil { return } // if err != nil { return }
} else { } else {
section.defaultValue, err = parser.parseArgument() section.root.defaultValue, err = parser.parseArgument()
if err != nil { return } if err != nil { return }
err = parser.expect(lexer.TokenKindNewline) err = parser.expect(lexer.TokenKindNewline)