Object initialization value parsing is now done recursively

This commit is contained in:
Sasha Koshka 2022-08-17 13:26:18 -04:00
parent 31bb36a4f7
commit aee90757e3
2 changed files with 16 additions and 11 deletions

View File

@ -14,12 +14,12 @@ func (parser *ParsingOperation) parseBody () (err error) {
case "data": case "data":
var section *DataSection var section *DataSection
section, err = parser.parseDataSection() section, err = parser.parseDataSection()
if err != nil { return }
if parser.tree.dataSections == nil { if parser.tree.dataSections == nil {
parser.tree.dataSections = parser.tree.dataSections =
make(map[string] *DataSection) make(map[string] *DataSection)
} }
parser.tree.dataSections[section.name] = section parser.tree.dataSections[section.name] = section
if err != nil { return }
case "type": case "type":
case "face": case "face":
case "enum": case "enum":

View File

@ -67,7 +67,8 @@ func (parser *ParsingOperation) parseInitializationValues (
if err != nil { return } if err != nil { return }
if parser.token.Is(lexer.TokenKindDot) { if parser.token.Is(lexer.TokenKindDot) {
// object initialization
parser.previousToken() parser.previousToken()
var initializationValues ObjectInitializationValues var initializationValues ObjectInitializationValues
initializationValues, err = parser.parseObjectInitializationValues() initializationValues, err = parser.parseObjectInitializationValues()
@ -76,12 +77,12 @@ func (parser *ParsingOperation) parseInitializationValues (
} else { } else {
// array initialization
parser.previousToken() parser.previousToken()
var initializationValues ArrayInitializationValues var initializationValues ArrayInitializationValues
initializationValues, err = parser.parseArrayInitializationValues() initializationValues, err = parser.parseArrayInitializationValues()
initializationArgument.kind = ArgumentKindArrayInitializationValues initializationArgument.kind = ArgumentKindArrayInitializationValues
initializationArgument.value = &initializationValues initializationArgument.value = &initializationValues
} }
return return
@ -93,14 +94,15 @@ func (parser *ParsingOperation) parseObjectInitializationValues () (
initializationValues ObjectInitializationValues, initializationValues ObjectInitializationValues,
err error, err error,
) { ) {
println("BEGIN")
defer println("END")
initializationValues.attributes = make(map[string] Argument) initializationValues.attributes = make(map[string] Argument)
baseIndent := 0 baseIndent := 0
begin := true begin := true
for { for {
println(parser.token.Describe())
// if there is no indent we can just stop parsing // if there is no indent we can just stop parsing
if !parser.token.Is(lexer.TokenKindIndent) { break} if !parser.token.Is(lexer.TokenKindIndent) { break}
indent := parser.token.Value().(int) indent := parser.token.Value().(int)
@ -114,6 +116,8 @@ func (parser *ParsingOperation) parseObjectInitializationValues () (
// do not parse any further if the indent has changed // do not parse any further if the indent has changed
if indent != baseIndent { break } if indent != baseIndent { break }
println("HIT")
// move on to the beginning of the line, which must contain // move on to the beginning of the line, which must contain
// a member initialization value // a member initialization value
err = parser.nextToken(lexer.TokenKindDot) err = parser.nextToken(lexer.TokenKindDot)
@ -139,25 +143,26 @@ func (parser *ParsingOperation) parseObjectInitializationValues () (
var value Argument var value Argument
if parser.token.Is(lexer.TokenKindNewline) { if parser.token.Is(lexer.TokenKindNewline) {
// TODO: recurse // recurse
err = parser.nextToken(lexer.TokenKindIndent) err = parser.nextToken(lexer.TokenKindIndent)
if err != nil { return } if err != nil { return }
// value, err = parser.parseInitializationValues()
// if err != nil { return } value, err = parser.parseInitializationValues(baseIndent)
initializationValues.attributes[name] = value
if err != nil { return }
} else { } else {
// parse as normal argument // parse as normal argument
value, err = parser.parseArgument() value, err = parser.parseArgument()
initializationValues.attributes[name] = value
if err != nil { return } if err != nil { return }
err = parser.expect(lexer.TokenKindNewline) err = parser.expect(lexer.TokenKindNewline)
if err != nil { return } if err != nil { return }
err = parser.nextToken() err = parser.nextToken()
if err != nil { return } if err != nil { return }
} }
// store in object
initializationValues.attributes[name] = value
} }
return return