Did some ToString stuff

This commit is contained in:
Sasha Koshka 2022-09-12 15:27:29 -04:00
parent 3e9ff7dcd6
commit dbd0eb570d
6 changed files with 188 additions and 184 deletions

View File

@ -28,6 +28,7 @@ data ro jObject:thing.Thing.thing.thing
-- that 2139 -- that 2139
-- this 324 -- this 324
data ro kNestedObject:Obj data ro kNestedObject:Obj
ro newMember:Int 9023
-- that -- that
-- bird2 123.8439 -- bird2 123.8439
-- bird3 9328.21348239 -- bird3 9328.21348239

View File

@ -3,6 +3,15 @@ package parser
import "git.tebibyte.media/arf/arf/lexer" import "git.tebibyte.media/arf/arf/lexer"
import "git.tebibyte.media/arf/arf/infoerr" import "git.tebibyte.media/arf/arf/infoerr"
// TODO:
// (parser *ParsingOperation) parseDefaultValues
// (parser *ParsingOperation) parseDefaultMemberValues (return tree of new members and a tree of member values)
// (parser *ParsingOperation) parseDefaultArrayValues
// (parser *ParsingOperation) parseDefaultMemberValue
// (parser *ParsingOperation) parseMemberDeclaration
// parseInitializationValues starts on the line after a data section, or a set // parseInitializationValues starts on the line after a data section, or a set
// phrase. It checks for an indent greater than the indent of the aforementioned // phrase. It checks for an indent greater than the indent of the aforementioned
// data section or set phrase (passed through baseIndent), and if there is, // data section or set phrase (passed through baseIndent), and if there is,

View File

@ -1,125 +1,125 @@
package parser package parser
//
import "git.tebibyte.media/arf/arf/types" // import "git.tebibyte.media/arf/arf/types"
import "git.tebibyte.media/arf/arf/lexer" // import "git.tebibyte.media/arf/arf/lexer"
import "git.tebibyte.media/arf/arf/infoerr" // import "git.tebibyte.media/arf/arf/infoerr"
//
// parseObjtSection parses an object type definition. This allows for structured // // parseObjtSection parses an object type definition. This allows for structured
// types to be defined, and for member variables to be added and overridden. // // types to be defined, and for member variables to be added and overridden.
func (parser *ParsingOperation) parseObjtSection () ( // func (parser *ParsingOperation) parseObjtSection () (
section ObjtSection, // section ObjtSection,
err error, // err error,
) { // ) {
err = parser.expect(lexer.TokenKindName) // err = parser.expect(lexer.TokenKindName)
if err != nil { return } // if err != nil { return }
//
section.location = parser.token.Location() // section.location = parser.token.Location()
//
// get permission // // get permission
err = parser.nextToken(lexer.TokenKindPermission) // err = parser.nextToken(lexer.TokenKindPermission)
if err != nil { return } // if err != nil { return }
section.permission = parser.token.Value().(types.Permission) // section.permission = parser.token.Value().(types.Permission)
//
// get name // // get name
err = parser.nextToken(lexer.TokenKindName) // err = parser.nextToken(lexer.TokenKindName)
if err != nil { return } // if err != nil { return }
section.name = parser.token.Value().(string) // section.name = parser.token.Value().(string)
//
// parse inherited type // // parse inherited type
err = parser.nextToken(lexer.TokenKindColon) // err = parser.nextToken(lexer.TokenKindColon)
if err != nil { return } // if err != nil { return }
err = parser.nextToken() // err = parser.nextToken()
if err != nil { return } // if err != nil { return }
section.inherits, err = parser.parseIdentifier() // section.inherits, err = parser.parseIdentifier()
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 }
//
// parse members // // parse members
err = parser.parseObjtMembers(&section) // err = parser.parseObjtMembers(&section)
if err != nil { return } // if err != nil { return }
//
if len(section.members) == 0 { // if len(section.members) == 0 {
infoerr.NewError ( // infoerr.NewError (
section.location, // section.location,
"defining an object with no members", // "defining an object with no members",
infoerr.ErrorKindWarn).Print() // infoerr.ErrorKindWarn).Print()
} // }
return // return
} // }
//
// parseObjtMembers parses a list of members for an object section. Indentation // // parseObjtMembers parses a list of members for an object section. Indentation
// level is assumed. // // level is assumed.
func (parser *ParsingOperation) parseObjtMembers ( // func (parser *ParsingOperation) parseObjtMembers (
into *ObjtSection, // into *ObjtSection,
) ( // ) (
err error, // err error,
) { // ) {
for { // for {
// if we've left the block, stop parsing // // if we've left the block, stop parsing
if !parser.token.Is(lexer.TokenKindIndent) { return } // if !parser.token.Is(lexer.TokenKindIndent) { return }
if parser.token.Value().(int) != 1 { return } // if parser.token.Value().(int) != 1 { return }
//
// add member to object section // // add member to object section
var member ObjtMember // var member ObjtMember
member, err = parser.parseObjtMember() // member, err = parser.parseObjtMember()
into.members = append(into.members, member) // into.members = append(into.members, member)
if err != nil { return } // if err != nil { return }
} // }
} // }
//
// parseObjtMember parses a single member of an object section. Indentation // // parseObjtMember parses a single member of an object section. Indentation
// level is assumed. // // level is assumed.
func (parser *ParsingOperation) parseObjtMember () ( // func (parser *ParsingOperation) parseObjtMember () (
member ObjtMember, // member ObjtMember,
err error, // err error,
) { // ) {
// get permission // // get permission
err = parser.nextToken(lexer.TokenKindPermission) // err = parser.nextToken(lexer.TokenKindPermission)
if err != nil { return } // if err != nil { return }
member.permission = parser.token.Value().(types.Permission) // member.permission = parser.token.Value().(types.Permission)
//
// get name // // get name
err = parser.nextToken(lexer.TokenKindName) // err = parser.nextToken(lexer.TokenKindName)
if err != nil { return } // if err != nil { return }
member.name = parser.token.Value().(string) // member.name = parser.token.Value().(string)
//
// get type // // get type
err = parser.nextToken(lexer.TokenKindColon) // err = parser.nextToken(lexer.TokenKindColon)
if err != nil { return } // if err != nil { return }
err = parser.nextToken() // err = parser.nextToken()
if err != nil { return } // if err != nil { return }
member.what, err = parser.parseType() // member.what, err = parser.parseType()
if err != nil { return } // if err != nil { return }
//
// if there is a bit width, get it // // if there is a bit width, get it
if parser.token.Is(lexer.TokenKindBinaryAnd) { // if parser.token.Is(lexer.TokenKindBinaryAnd) {
err = parser.nextToken(lexer.TokenKindUInt) // err = parser.nextToken(lexer.TokenKindUInt)
if err != nil { return } // if err != nil { return }
member.bitWidth = parser.token.Value().(uint64) // member.bitWidth = parser.token.Value().(uint64)
err = parser.nextToken() // err = parser.nextToken()
if err != nil { return } // if err != nil { return }
} // }
//
// parse default value // // parse default value
if parser.token.Is(lexer.TokenKindNewline) { // if parser.token.Is(lexer.TokenKindNewline) {
err = parser.nextToken() // err = parser.nextToken()
if err != nil { return } // if err != nil { return }
//
member.value, // member.value,
err = parser.parseInitializationValues(1) // err = parser.parseInitializationValues(1)
if err != nil { return } // if err != nil { return }
} else { // } else {
member.value, err = parser.parseArgument() // member.value, err = parser.parseArgument()
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 }
} // }
//
return // return
} // }

View File

@ -257,7 +257,7 @@ func (argument Argument) ToString (indent int, breakLine bool) (output string) {
func (section DataSection) ToString (indent int) (output string) { func (section DataSection) ToString (indent int) (output string) {
output += doIndent ( output += doIndent (
indent, indent,
"data ", "type ",
section.permission.ToString(), " ", section.permission.ToString(), " ",
section.name, ":", section.name, ":",
section.what.ToString()) section.what.ToString())
@ -265,22 +265,43 @@ func (section DataSection) ToString (indent int) (output string) {
isComplexInitialization := isComplexInitialization :=
section.value.kind == ArgumentKindObjectInitializationValues || section.value.kind == ArgumentKindObjectInitializationValues ||
section.value.kind == ArgumentKindArrayInitializationValues section.value.kind == ArgumentKindArrayInitializationValues
if !isComplexInitialization && section.value.value != nil {
output += " " + section.value.ToString(0, false)
}
output += "\n"
for _, member := range section.what.members {
output += member.ToString(indent + 1)
}
if isComplexInitialization {
output += section.value.ToString(indent + 1, true)
}
if section.external { if section.external {
output += "\n" output += "\n"
output += doIndent(indent + 1, "external\n") output += doIndent(indent + 1, "external\n")
} else if section.value.value == nil {
output += "\n"
} else if isComplexInitialization {
output += "\n"
output += section.value.ToString(indent + 1, true)
} else {
output += " " + section.value.ToString(0, false)
output += "\n"
} }
return return
} }
func (member TypeMember) ToString (indent int) (output string) {
output += doIndent(indent)
output += member.permission.ToString() + " "
output += member.name + ":"
output += member.what.ToString()
if member.bitWidth > 0 {
output += fmt.Sprint(" & ", member.bitWidth)
}
output += "\n"
return
}
func (section TypeSection) ToString (indent int) (output string) { func (section TypeSection) ToString (indent int) (output string) {
output += doIndent ( output += doIndent (
indent, indent,
@ -292,61 +313,23 @@ func (section TypeSection) ToString (indent int) (output string) {
isComplexInitialization := isComplexInitialization :=
section.value.kind == ArgumentKindObjectInitializationValues || section.value.kind == ArgumentKindObjectInitializationValues ||
section.value.kind == ArgumentKindArrayInitializationValues section.value.kind == ArgumentKindArrayInitializationValues
if section.value.value == nil { if !isComplexInitialization && section.value.value != nil {
output += "\n"
} else if isComplexInitialization {
output += "\n"
output += section.value.ToString(indent + 1, true)
} else {
output += " " + section.value.ToString(0, false) output += " " + section.value.ToString(0, false)
output += "\n"
} }
return output += "\n"
}
func (member ObjtMember) ToString (indent int) (output string) { for _, member := range section.what.members {
output += doIndent(indent)
output += member.permission.ToString() + " "
output += member.name + ":"
output += member.what.ToString()
if member.bitWidth > 0 {
output += fmt.Sprint(" & ", member.bitWidth)
}
isComplexInitialization :=
member.value.kind == ArgumentKindObjectInitializationValues ||
member.value.kind == ArgumentKindArrayInitializationValues
if member.value.value == nil {
output += "\n"
} else if isComplexInitialization {
output += "\n"
output += member.value.ToString(indent + 1, true)
} else {
output += " " + member.value.ToString(0, false)
output += "\n"
}
return
}
func (section ObjtSection) ToString (indent int) (output string) {
output += doIndent (
indent,
"objt ",
section.permission.ToString(), " ",
section.name, ":",
section.inherits.ToString(), "\n")
for _, member := range section.members {
output += member.ToString(indent + 1) output += member.ToString(indent + 1)
} }
if isComplexInitialization {
output += section.value.ToString(indent + 1, true)
}
return return
} }
func (section EnumSection) ToString (indent int) (output string) { func (section EnumSection) ToString (indent int) (output string) {
output += doIndent ( output += doIndent (
indent, indent,
@ -410,6 +393,7 @@ func (phrase Phrase) ToString (indent int, ownLine bool) (output string) {
} }
var initializationValues Argument var initializationValues Argument
var declaration Argument
output += "[" + phrase.command.ToString(0, false) output += "[" + phrase.command.ToString(0, false)
for _, argument := range phrase.arguments { for _, argument := range phrase.arguments {
@ -418,6 +402,8 @@ func (phrase Phrase) ToString (indent int, ownLine bool) (output string) {
argument.kind == ArgumentKindArrayInitializationValues argument.kind == ArgumentKindArrayInitializationValues
if isInitializationValue { if isInitializationValue {
initializationValues = argument initializationValues = argument
} else if argument.kind == ArgumentKindDeclaration {
declaration = argument
} else { } else {
output += " " + argument.ToString(0, false) output += " " + argument.ToString(0, false)
} }
@ -433,6 +419,13 @@ func (phrase Phrase) ToString (indent int, ownLine bool) (output string) {
if ownLine { if ownLine {
output += "\n" output += "\n"
// TODO: make = phrases special, have them carry a declaration
// and argument and nothing else. somehow.
for _, member := range declaration.value.(Declaration).what.members {
output += member.ToString(indent + 1)
}
if initializationValues.kind != ArgumentKindNil { if initializationValues.kind != ArgumentKindNil {
output += initializationValues.ToString(indent + 1, true) output += initializationValues.ToString(indent + 1, true)
} }

View File

@ -47,11 +47,11 @@ type Identifier struct {
type TypeKind int type TypeKind int
const ( const (
// TypeKindBasic either means it's a primitive, or it inherits from // TypeKindBasic means its a normal type and inherits from something.
// something. // Basic types can define new members on their parent types.
TypeKindBasic TypeKind = iota TypeKindBasic TypeKind = iota
// TypeKindPointer means it's a pointer // TypeKindPointer means it's a pointer.
TypeKindPointer TypeKindPointer
// TypeKindVariableArray means it's an array of variable length. // TypeKindVariableArray means it's an array of variable length.

View File

@ -19,7 +19,6 @@ type ro dInitInherit:aBasic
-- that 9384 -- that 9384
-- this 389 -- this 389
type ro eInitAndDefine:aBasic type ro eInitAndDefine:aBasic
-- this 389
ro these:aBasic ro these:aBasic
ro born:Int 4 ro born:Int 4
ro in:Int ro in:Int
@ -27,6 +26,8 @@ type ro eInitAndDefine:aBasic
9348 9348
92384 92384
92834 92834
-- this 389
-- these
-- this 98 -- this 98
-- that 9384 -- that 9384