diff --git a/parser/accessors.go b/parser/accessors.go index 42b378b..776a387 100644 --- a/parser/accessors.go +++ b/parser/accessors.go @@ -197,6 +197,12 @@ func (section FaceSection) Behaviors () (iterator types.Iterator[FaceBehavior]) return } +// External returns whether or not the data section is external. +func (section DataSection) External () (external bool) { + external = section.external + return +} + // Kind returns what kind of phrase it is. func (phrase Phrase) Kind () (kind PhraseKind) { kind = phrase.kind diff --git a/parser/data.go b/parser/data.go index fa19ff0..0643697 100644 --- a/parser/data.go +++ b/parser/data.go @@ -32,6 +32,25 @@ func (parser *ParsingOperation) parseDataSection () ( err = parser.nextToken() if err != nil { return } + // check if external + if !parser.token.Is(lexer.TokenKindIndent) { return } + if parser.token.Value().(int) != 1 { return } + + err = parser.nextToken() + if err != nil { return } + if parser.token.Is(lexer.TokenKindName) && + parser.token.Value().(string) == "external" { + + section.external = true + err = parser.nextToken(lexer.TokenKindNewline) + if err != nil { return } + err = parser.nextToken() + if err != nil { return } + return + } + + // otherwise, parse initialization values + parser.previousToken() section.value, err = parser.parseInitializationValues(0) if err != nil { return } } else { diff --git a/parser/data_test.go b/parser/data_test.go index 08c77d9..aa01b6b 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -35,7 +35,9 @@ data ro kNestedObject:Obj .bird0 324 .bird1 "hello world" data ro lMutIntegerArray16:Int:16:mut -data ro mIntegerArrayInitialized:Int:16:mut +data ro mExternalData:Int:8 + external +data ro nIntegerArrayInitialized:Int:16:mut 3948 293 293049 diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 220cd7b..28c09ff 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -266,7 +266,10 @@ func (section DataSection) ToString (indent int) (output string) { section.value.kind == ArgumentKindObjectInitializationValues || section.value.kind == ArgumentKindArrayInitializationValues - if section.value.value == nil { + if section.external { + output += "\n" + output += doIndent(indent + 1, "external\n") + } else if section.value.value == nil { output += "\n" } else if isComplexInitialization { output += "\n" diff --git a/parser/tree.go b/parser/tree.go index 3b5f77c..aace30b 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -169,6 +169,8 @@ type DataSection struct { typeable permissionable valuable + + external bool } // TypeSection represents a blind type definition. diff --git a/tests/parser/data/main.arf b/tests/parser/data/main.arf index b850361..55833af 100644 --- a/tests/parser/data/main.arf +++ b/tests/parser/data/main.arf @@ -38,6 +38,9 @@ data ro kNestedObject:Obj data ro lMutIntegerArray16:Int:16:mut -data ro mIntegerArrayInitialized:Int:16:mut +data ro mExternalData:Int:8 + external + +data ro nIntegerArrayInitialized:Int:16:mut 3948 293 293049 948 912 340 0 2304 0 4785 92