From aee90757e3287e2303ff54d2205710d50d0ca45f Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Wed, 17 Aug 2022 13:26:18 -0400 Subject: [PATCH] Object initialization value parsing is now done recursively --- parser/body.go | 2 +- parser/data.go | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/parser/body.go b/parser/body.go index 4f6fae6..459d184 100644 --- a/parser/body.go +++ b/parser/body.go @@ -14,12 +14,12 @@ func (parser *ParsingOperation) parseBody () (err error) { case "data": var section *DataSection section, err = parser.parseDataSection() - if err != nil { return } if parser.tree.dataSections == nil { parser.tree.dataSections = make(map[string] *DataSection) } parser.tree.dataSections[section.name] = section + if err != nil { return } case "type": case "face": case "enum": diff --git a/parser/data.go b/parser/data.go index ed1b1c0..cf32548 100644 --- a/parser/data.go +++ b/parser/data.go @@ -67,7 +67,8 @@ func (parser *ParsingOperation) parseInitializationValues ( if err != nil { return } if parser.token.Is(lexer.TokenKindDot) { - + + // object initialization parser.previousToken() var initializationValues ObjectInitializationValues initializationValues, err = parser.parseObjectInitializationValues() @@ -76,12 +77,12 @@ func (parser *ParsingOperation) parseInitializationValues ( } else { + // array initialization parser.previousToken() var initializationValues ArrayInitializationValues initializationValues, err = parser.parseArrayInitializationValues() initializationArgument.kind = ArgumentKindArrayInitializationValues initializationArgument.value = &initializationValues - } return @@ -93,14 +94,15 @@ func (parser *ParsingOperation) parseObjectInitializationValues () ( initializationValues ObjectInitializationValues, err error, ) { + println("BEGIN") + defer println("END") + initializationValues.attributes = make(map[string] Argument) baseIndent := 0 begin := true for { - println(parser.token.Describe()) - // if there is no indent we can just stop parsing if !parser.token.Is(lexer.TokenKindIndent) { break} indent := parser.token.Value().(int) @@ -114,6 +116,8 @@ func (parser *ParsingOperation) parseObjectInitializationValues () ( // do not parse any further if the indent has changed if indent != baseIndent { break } + println("HIT") + // move on to the beginning of the line, which must contain // a member initialization value err = parser.nextToken(lexer.TokenKindDot) @@ -139,25 +143,26 @@ func (parser *ParsingOperation) parseObjectInitializationValues () ( var value Argument if parser.token.Is(lexer.TokenKindNewline) { - // TODO: recurse + // recurse err = parser.nextToken(lexer.TokenKindIndent) 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 { // parse as normal argument value, err = parser.parseArgument() + initializationValues.attributes[name] = value if err != nil { return } + err = parser.expect(lexer.TokenKindNewline) if err != nil { return } err = parser.nextToken() if err != nil { return } } - - // store in object - initializationValues.attributes[name] = value } return