Parser can now sort of parse object member initialization values
This commit is contained in:
		
							parent
							
								
									bd456b72e9
								
							
						
					
					
						commit
						bd42c95de0
					
				| @ -65,8 +65,20 @@ func (parser *ParsingOperation) parseInitializationValues ( | ||||
| 	err = parser.nextToken() | ||||
| 	if err != nil { return } | ||||
| 
 | ||||
| 	// TODO: make data sections have only one value argument and create a | ||||
| 	// similar data structure to ObjectAttributes for arrays | ||||
| 	if parser.token.Is(lexer.TokenKindDot) { | ||||
| 		// TODO: parse as object initialization | ||||
| 		var attributes ObjectAttributes | ||||
| 		attributes, err = parser.parseObjectInitializationValues ( | ||||
| 			baseIndent + 1) | ||||
| 
 | ||||
| 		values = []Argument { | ||||
| 			Argument { | ||||
| 				location: attributes.location, | ||||
| 				value:    &attributes, | ||||
| 				kind:     ArgumentKindObjectAttributes, | ||||
| 			}, | ||||
| 		} | ||||
| 	} else { | ||||
| 		values, err = parser.parseArrayInitializationValues ( | ||||
| 			baseIndent + 1) | ||||
| @ -75,6 +87,56 @@ func (parser *ParsingOperation) parseInitializationValues ( | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // parseObjectInitializationValues parses a list of object initialization | ||||
| // values until the indentation level is not equal to indent. | ||||
| func (parser *ParsingOperation) parseObjectInitializationValues ( | ||||
| 	indent int, | ||||
| ) ( | ||||
| 	values ObjectAttributes, | ||||
| 	err    error, | ||||
| ) { | ||||
| 	values.attributes = make(map[string] Argument) | ||||
| 	values.location   = parser.token.Location() | ||||
| 
 | ||||
| 	for { | ||||
| 		// get attribute name and value | ||||
| 		err = parser.nextToken(lexer.TokenKindName) | ||||
| 		if err != nil { return } | ||||
| 		name := parser.token.Value().(string) | ||||
| 		 | ||||
| 		_, exists := values.attributes[name] | ||||
| 		if exists { | ||||
| 			err = parser.token.NewError ( | ||||
| 				"duplicate member \"" + name + "\" in object " + | ||||
| 				"member initialization", | ||||
| 				file.ErrorKindError) | ||||
| 			return | ||||
| 		} | ||||
| 		 | ||||
| 		err = parser.nextToken() | ||||
| 		if err != nil { return } | ||||
| 		var value Argument | ||||
| 		value, err = parser.parseArgument() | ||||
| 
 | ||||
| 		// store in object | ||||
| 		values.attributes[name] = value | ||||
| 		 | ||||
| 		// go onto the next line | ||||
| 		err = parser.expect(lexer.TokenKindNewline) | ||||
| 		if err != nil { return } | ||||
| 		err = parser.nextToken() | ||||
| 		if err != nil { return } | ||||
| 		if !parser.token.Is(lexer.TokenKindIndent) { break } | ||||
| 		// TODO: if indent is greater, recurse instead | ||||
| 		if parser.token.Value().(int) != indent { break } | ||||
| 
 | ||||
| 		// the next line must start with a dot | ||||
| 		err = parser.nextToken(lexer.TokenKindDot) | ||||
| 		if err != nil { return } | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // parseArrayInitializationValues parses a list of array initialization values | ||||
| // until the indentation lexel is not equal to indent. | ||||
| func (parser *ParsingOperation) parseArrayInitializationValues ( | ||||
| @ -85,7 +147,6 @@ func (parser *ParsingOperation) parseArrayInitializationValues ( | ||||
| ) { | ||||
| 	for { | ||||
| 		if parser.token.Is(lexer.TokenKindNewline) { | ||||
| 			println("line break") | ||||
| 			err = parser.nextToken() | ||||
| 			if err != nil { return } | ||||
| 			 | ||||
| @ -94,9 +155,7 @@ func (parser *ParsingOperation) parseArrayInitializationValues ( | ||||
| 			err = parser.nextToken() | ||||
| 			if err != nil { return } | ||||
| 		} | ||||
| 		if err != nil { return } | ||||
| 		println(parser.token.Describe()) | ||||
| 
 | ||||
| 		 | ||||
| 		var argument Argument | ||||
| 		argument, err = parser.parseArgument() | ||||
| 		if err != nil { return } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user