Reworked data section so it stores single initialization argument
This commit is contained in:
parent
bd42c95de0
commit
0dd9368393
@ -36,9 +36,8 @@ func (parser *ParsingOperation) parseDataSection () (
|
||||
section.value, err = parser.parseInitializationValues(0)
|
||||
if err != nil { return }
|
||||
} else {
|
||||
var argument Argument
|
||||
argument, err = parser.parseArgument()
|
||||
section.value = append(section.value, argument)
|
||||
section.value, err = parser.parseArgument()
|
||||
if err != nil { return }
|
||||
|
||||
err = parser.expect(lexer.TokenKindNewline)
|
||||
if err != nil { return }
|
||||
@ -55,8 +54,8 @@ func (parser *ParsingOperation) parseDataSection () (
|
||||
func (parser *ParsingOperation) parseInitializationValues (
|
||||
baseIndent int,
|
||||
) (
|
||||
values []Argument,
|
||||
err error,
|
||||
value Argument,
|
||||
err error,
|
||||
) {
|
||||
// check if line is indented one more than baseIndent
|
||||
if !parser.token.Is(lexer.TokenKindIndent) { return }
|
||||
@ -65,23 +64,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) {
|
||||
var attributes ObjectAttributes
|
||||
attributes, err = parser.parseObjectInitializationValues (
|
||||
baseIndent + 1)
|
||||
value.location = parser.token.Location()
|
||||
|
||||
values = []Argument {
|
||||
Argument {
|
||||
location: attributes.location,
|
||||
value: &attributes,
|
||||
kind: ArgumentKindObjectAttributes,
|
||||
},
|
||||
}
|
||||
} else {
|
||||
values, err = parser.parseArrayInitializationValues (
|
||||
if parser.token.Is(lexer.TokenKindDot) {
|
||||
var values ObjectInitializationValues
|
||||
values, err = parser.parseObjectInitializationValues (
|
||||
baseIndent + 1)
|
||||
value.kind = ArgumentKindObjectInitializationValues
|
||||
value.value = &values
|
||||
} else {
|
||||
var values ArrayInitializationValues
|
||||
value.value, err = parser.parseArrayInitializationValues (
|
||||
baseIndent + 1)
|
||||
value.kind = ArgumentKindArrayInitializationValues
|
||||
value.value = &values
|
||||
}
|
||||
|
||||
return
|
||||
@ -92,7 +88,7 @@ func (parser *ParsingOperation) parseInitializationValues (
|
||||
func (parser *ParsingOperation) parseObjectInitializationValues (
|
||||
indent int,
|
||||
) (
|
||||
values ObjectAttributes,
|
||||
values ObjectInitializationValues,
|
||||
err error,
|
||||
) {
|
||||
values.attributes = make(map[string] Argument)
|
||||
@ -142,9 +138,11 @@ func (parser *ParsingOperation) parseObjectInitializationValues (
|
||||
func (parser *ParsingOperation) parseArrayInitializationValues (
|
||||
indent int,
|
||||
) (
|
||||
values []Argument,
|
||||
values ArrayInitializationValues,
|
||||
err error,
|
||||
) {
|
||||
values.location = parser.token.Location()
|
||||
|
||||
for {
|
||||
if parser.token.Is(lexer.TokenKindNewline) {
|
||||
err = parser.nextToken()
|
||||
@ -159,7 +157,7 @@ func (parser *ParsingOperation) parseArrayInitializationValues (
|
||||
var argument Argument
|
||||
argument, err = parser.parseArgument()
|
||||
if err != nil { return }
|
||||
values = append(values, argument)
|
||||
values.values = append(values.values, argument)
|
||||
}
|
||||
|
||||
return
|
||||
|
@ -78,14 +78,14 @@ func (declaration *Declaration) ToString () (output string) {
|
||||
return
|
||||
}
|
||||
|
||||
func (attributes *ObjectAttributes) ToString (
|
||||
indent int,
|
||||
func (attributes *ObjectInitializationValues) ToString (
|
||||
indent int,
|
||||
) (
|
||||
output string,
|
||||
) {
|
||||
for name, value := range attributes.attributes {
|
||||
output += doIndent(indent, ".", name, " ")
|
||||
if value.kind == ArgumentKindObjectAttributes {
|
||||
if value.kind == ArgumentKindObjectInitializationValues {
|
||||
output += "\n"
|
||||
output += value.ToString(indent + 1, true)
|
||||
} else {
|
||||
@ -96,6 +96,18 @@ func (attributes *ObjectAttributes) ToString (
|
||||
return
|
||||
}
|
||||
|
||||
func (values *ArrayInitializationValues) ToString (
|
||||
indent int,
|
||||
) (
|
||||
output string,
|
||||
) {
|
||||
for _, value := range values.values {
|
||||
output += value.ToString(indent, true)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (phrase *Phrase) ToString (indent int, breakLine bool) (output string) {
|
||||
if breakLine {
|
||||
output += doIndent (
|
||||
@ -139,17 +151,19 @@ func (argument *Argument) ToString (indent int, breakLine bool) (output string)
|
||||
|
||||
switch argument.kind {
|
||||
case ArgumentKindPhrase:
|
||||
output += doIndent (
|
||||
indent,
|
||||
argument.value.(*Phrase).ToString (
|
||||
output += argument.value.(*Phrase).ToString (
|
||||
indent,
|
||||
breakLine))
|
||||
breakLine)
|
||||
|
||||
case ArgumentKindObjectAttributes:
|
||||
case ArgumentKindObjectInitializationValues:
|
||||
// this should only appear in contexts where breakLine is true
|
||||
output += doIndent (
|
||||
indent,
|
||||
argument.value.(*ObjectAttributes).ToString (indent))
|
||||
output += argument.value.(*ObjectInitializationValues).
|
||||
ToString (indent)
|
||||
|
||||
case ArgumentKindArrayInitializationValues:
|
||||
// this should only appear in contexts where breakLine is true
|
||||
output += argument.value.(*ArrayInitializationValues).
|
||||
ToString (indent)
|
||||
|
||||
case ArgumentKindIdentifier:
|
||||
output += doIndent (
|
||||
@ -193,16 +207,18 @@ func (section *DataSection) ToString (indent int) (output string) {
|
||||
section.name, ":",
|
||||
section.what.ToString())
|
||||
|
||||
if len(section.value) == 0 {
|
||||
isComplexInitialization :=
|
||||
section.value.kind == ArgumentKindObjectInitializationValues ||
|
||||
section.value.kind == ArgumentKindArrayInitializationValues
|
||||
|
||||
if section.value.value == nil {
|
||||
output += "\n"
|
||||
} else if len(section.value) == 1 {
|
||||
output += " " + section.value[0].ToString(0, false)
|
||||
} else if isComplexInitialization {
|
||||
output += "\n"
|
||||
output += section.value.ToString(indent + 1, true)
|
||||
} else {
|
||||
output += " " + section.value.ToString(0, false)
|
||||
output += "\n"
|
||||
for _, argument := range(section.value) {
|
||||
output += argument.ToString(indent + 1, true)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -60,13 +60,20 @@ type Declaration struct {
|
||||
what Type
|
||||
}
|
||||
|
||||
// ObjectAttributes represents a list of object member initialization
|
||||
// ObjectInitializationValues represents a list of object member initialization
|
||||
// attributes.
|
||||
type ObjectAttributes struct {
|
||||
type ObjectInitializationValues struct {
|
||||
location file.Location
|
||||
attributes map[string] Argument
|
||||
}
|
||||
|
||||
// ArrayInitializationValues represents a list of attributes initializing an
|
||||
// array.
|
||||
type ArrayInitializationValues struct {
|
||||
location file.Location
|
||||
values []Argument
|
||||
}
|
||||
|
||||
// Phrase represents a function call or operator. In ARF they are the same
|
||||
// syntactical concept.
|
||||
type Phrase struct {
|
||||
@ -94,7 +101,10 @@ const (
|
||||
|
||||
// .name value
|
||||
// but like, a lot of them
|
||||
ArgumentKindObjectAttributes
|
||||
ArgumentKindObjectInitializationValues
|
||||
|
||||
// value value...
|
||||
ArgumentKindArrayInitializationValues
|
||||
|
||||
// name.name
|
||||
// name.name.name
|
||||
@ -144,6 +154,6 @@ type DataSection struct {
|
||||
name string
|
||||
|
||||
what Type
|
||||
value []Argument
|
||||
value Argument
|
||||
permission types.Permission
|
||||
}
|
||||
|
Reference in New Issue
Block a user