Restructured type definitions to use a node tree
This commit is contained in:
		
							parent
							
								
									717474a59e
								
							
						
					
					
						commit
						69aaae8f14
					
				| @ -27,7 +27,7 @@ func (parser *ParsingOperation) parseBody () (err error) { | ||||
| 				parser.tree.typeSections = | ||||
| 					make(map[string] *TypeSection) | ||||
| 			} | ||||
| 			parser.tree.typeSections[section.name] = section | ||||
| 			parser.tree.typeSections[section.root.name] = section | ||||
| 			if err != nil { return } | ||||
| 		case "face": | ||||
| 		case "enum": | ||||
|  | ||||
| @ -253,22 +253,30 @@ func (section *DataSection) ToString (indent int) (output string) { | ||||
| } | ||||
| 
 | ||||
| func (section *TypeSection) ToString (indent int) (output string) { | ||||
| 	output += doIndent ( | ||||
| 		indent, | ||||
| 		"type ", | ||||
| 		section.permission.ToString(), " ", | ||||
| 		section.name, ":", | ||||
| 		section.inherits.ToString()) | ||||
| 	output += section.root.ToString(indent, true) | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| 	if section.defaultValue.value == nil { | ||||
| 		if len(section.members) > 0 { | ||||
| func (node TypeNode) ToString (indent int, isRoot bool) (output string) { | ||||
| 	doIndent(indent) | ||||
| 	if isRoot { | ||||
| 		output += "type " | ||||
| 	} | ||||
| 	 | ||||
| 	output += node.permission.ToString() + " " | ||||
| 	output += node.name + ":" | ||||
| 	output += node.what.ToString() | ||||
| 	 | ||||
| 	if node.defaultValue.value == nil { | ||||
| 		if len(node.children) > 0 { | ||||
| 			// TODO: print out members | ||||
| 		} else { | ||||
| 			output += "\n" | ||||
| 		} | ||||
| 	} else { | ||||
| 		output += " " + section.defaultValue.ToString(0, false) | ||||
| 		output += " " + node.defaultValue.ToString(0, false) | ||||
| 		output += "\n"	 | ||||
| 	} | ||||
| 
 | ||||
| 	return | ||||
| } | ||||
|  | ||||
| @ -161,24 +161,19 @@ type DataSection struct { | ||||
| 	value      Argument | ||||
| } | ||||
| 
 | ||||
| // TypeMember represents member data  | ||||
| type TypeMember struct { | ||||
| // TypeNode represents a part of a type.   | ||||
| type TypeNode struct { | ||||
| 	location file.Location | ||||
| 	name     string | ||||
| 	 | ||||
| 	what         Type | ||||
| 	permission   types.Permission | ||||
| 	defaultValue Argument | ||||
| 	children     map[string] TypeNode | ||||
| } | ||||
| 
 | ||||
| // TypeSection represents a type definition. | ||||
| type TypeSection struct { | ||||
| 	location file.Location | ||||
| 	name     string | ||||
| 	 | ||||
| 	inherits     Type | ||||
| 	permission   types.Permission | ||||
| 	defaultValue Argument | ||||
| 	// this should be 1 dimensional for now. | ||||
| 	members	     map[string] TypeMember | ||||
| 	root     TypeNode | ||||
| } | ||||
|  | ||||
| @ -4,6 +4,7 @@ import "git.tebibyte.media/sashakoshka/arf/types" | ||||
| import "git.tebibyte.media/sashakoshka/arf/lexer" | ||||
| // import "git.tebibyte.media/sashakoshka/arf/infoerr" | ||||
| 
 | ||||
| // parseTypeSection parses a type definition. | ||||
| func (parser *ParsingOperation) parseTypeSection () ( | ||||
| 	section *TypeSection, | ||||
| 	err     error, | ||||
| @ -16,19 +17,19 @@ func (parser *ParsingOperation) parseTypeSection () ( | ||||
| 	// get permission | ||||
| 	err = parser.nextToken(lexer.TokenKindPermission) | ||||
| 	if err != nil { return } | ||||
| 	section.permission = parser.token.Value().(types.Permission) | ||||
| 	section.root.permission = parser.token.Value().(types.Permission) | ||||
| 
 | ||||
| 	// get name | ||||
| 	err = parser.nextToken(lexer.TokenKindName) | ||||
| 	if err != nil { return } | ||||
| 	section.name = parser.token.Value().(string) | ||||
| 	section.root.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() | ||||
| 	section.root.what, err = parser.parseType() | ||||
| 	if err != nil { return } | ||||
| 
 | ||||
| 	if parser.token.Is(lexer.TokenKindNewline) { | ||||
| @ -38,7 +39,7 @@ func (parser *ParsingOperation) parseTypeSection () ( | ||||
| 		// section.value, err = parser.parseInitializationValues(0) | ||||
| 		// if err != nil { return } | ||||
| 	} else { | ||||
| 		section.defaultValue, err = parser.parseArgument() | ||||
| 		section.root.defaultValue, err = parser.parseArgument() | ||||
| 		if err != nil { return } | ||||
| 
 | ||||
| 		err = parser.expect(lexer.TokenKindNewline) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user