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
-- this 324
data ro kNestedObject:Obj
ro newMember:Int 9023
-- that
-- bird2 123.8439
-- bird3 9328.21348239

View File

@ -3,6 +3,15 @@ package parser
import "git.tebibyte.media/arf/arf/lexer"
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
// 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,

View File

@ -1,125 +1,125 @@
package parser
import "git.tebibyte.media/arf/arf/types"
import "git.tebibyte.media/arf/arf/lexer"
import "git.tebibyte.media/arf/arf/infoerr"
// parseObjtSection parses an object type definition. This allows for structured
// types to be defined, and for member variables to be added and overridden.
func (parser *ParsingOperation) parseObjtSection () (
section ObjtSection,
err error,
) {
err = parser.expect(lexer.TokenKindName)
if err != nil { return }
section.location = parser.token.Location()
// get permission
err = parser.nextToken(lexer.TokenKindPermission)
if err != nil { return }
section.permission = parser.token.Value().(types.Permission)
// get name
err = parser.nextToken(lexer.TokenKindName)
if err != nil { return }
section.name = parser.token.Value().(string)
// parse inherited type
err = parser.nextToken(lexer.TokenKindColon)
if err != nil { return }
err = parser.nextToken()
if err != nil { return }
section.inherits, err = parser.parseIdentifier()
if err != nil { return }
err = parser.expect(lexer.TokenKindNewline)
if err != nil { return }
err = parser.nextToken()
if err != nil { return }
// parse members
err = parser.parseObjtMembers(&section)
if err != nil { return }
if len(section.members) == 0 {
infoerr.NewError (
section.location,
"defining an object with no members",
infoerr.ErrorKindWarn).Print()
}
return
}
// parseObjtMembers parses a list of members for an object section. Indentation
// level is assumed.
func (parser *ParsingOperation) parseObjtMembers (
into *ObjtSection,
) (
err error,
) {
for {
// if we've left the block, stop parsing
if !parser.token.Is(lexer.TokenKindIndent) { return }
if parser.token.Value().(int) != 1 { return }
// add member to object section
var member ObjtMember
member, err = parser.parseObjtMember()
into.members = append(into.members, member)
if err != nil { return }
}
}
// parseObjtMember parses a single member of an object section. Indentation
// level is assumed.
func (parser *ParsingOperation) parseObjtMember () (
member ObjtMember,
err error,
) {
// get permission
err = parser.nextToken(lexer.TokenKindPermission)
if err != nil { return }
member.permission = parser.token.Value().(types.Permission)
// get name
err = parser.nextToken(lexer.TokenKindName)
if err != nil { return }
member.name = parser.token.Value().(string)
// get type
err = parser.nextToken(lexer.TokenKindColon)
if err != nil { return }
err = parser.nextToken()
if err != nil { return }
member.what, err = parser.parseType()
if err != nil { return }
// if there is a bit width, get it
if parser.token.Is(lexer.TokenKindBinaryAnd) {
err = parser.nextToken(lexer.TokenKindUInt)
if err != nil { return }
member.bitWidth = parser.token.Value().(uint64)
err = parser.nextToken()
if err != nil { return }
}
// parse default value
if parser.token.Is(lexer.TokenKindNewline) {
err = parser.nextToken()
if err != nil { return }
member.value,
err = parser.parseInitializationValues(1)
if err != nil { return }
} else {
member.value, err = parser.parseArgument()
if err != nil { return }
err = parser.expect(lexer.TokenKindNewline)
if err != nil { return }
err = parser.nextToken()
if err != nil { return }
}
return
}
//
// import "git.tebibyte.media/arf/arf/types"
// import "git.tebibyte.media/arf/arf/lexer"
// import "git.tebibyte.media/arf/arf/infoerr"
//
// // parseObjtSection parses an object type definition. This allows for structured
// // types to be defined, and for member variables to be added and overridden.
// func (parser *ParsingOperation) parseObjtSection () (
// section ObjtSection,
// err error,
// ) {
// err = parser.expect(lexer.TokenKindName)
// if err != nil { return }
//
// section.location = parser.token.Location()
//
// // get permission
// err = parser.nextToken(lexer.TokenKindPermission)
// if err != nil { return }
// section.permission = parser.token.Value().(types.Permission)
//
// // get name
// err = parser.nextToken(lexer.TokenKindName)
// if err != nil { return }
// section.name = parser.token.Value().(string)
//
// // parse inherited type
// err = parser.nextToken(lexer.TokenKindColon)
// if err != nil { return }
// err = parser.nextToken()
// if err != nil { return }
// section.inherits, err = parser.parseIdentifier()
// if err != nil { return }
// err = parser.expect(lexer.TokenKindNewline)
// if err != nil { return }
// err = parser.nextToken()
// if err != nil { return }
//
// // parse members
// err = parser.parseObjtMembers(&section)
// if err != nil { return }
//
// if len(section.members) == 0 {
// infoerr.NewError (
// section.location,
// "defining an object with no members",
// infoerr.ErrorKindWarn).Print()
// }
// return
// }
//
// // parseObjtMembers parses a list of members for an object section. Indentation
// // level is assumed.
// func (parser *ParsingOperation) parseObjtMembers (
// into *ObjtSection,
// ) (
// err error,
// ) {
// for {
// // if we've left the block, stop parsing
// if !parser.token.Is(lexer.TokenKindIndent) { return }
// if parser.token.Value().(int) != 1 { return }
//
// // add member to object section
// var member ObjtMember
// member, err = parser.parseObjtMember()
// into.members = append(into.members, member)
// if err != nil { return }
// }
// }
//
// // parseObjtMember parses a single member of an object section. Indentation
// // level is assumed.
// func (parser *ParsingOperation) parseObjtMember () (
// member ObjtMember,
// err error,
// ) {
// // get permission
// err = parser.nextToken(lexer.TokenKindPermission)
// if err != nil { return }
// member.permission = parser.token.Value().(types.Permission)
//
// // get name
// err = parser.nextToken(lexer.TokenKindName)
// if err != nil { return }
// member.name = parser.token.Value().(string)
//
// // get type
// err = parser.nextToken(lexer.TokenKindColon)
// if err != nil { return }
// err = parser.nextToken()
// if err != nil { return }
// member.what, err = parser.parseType()
// if err != nil { return }
//
// // if there is a bit width, get it
// if parser.token.Is(lexer.TokenKindBinaryAnd) {
// err = parser.nextToken(lexer.TokenKindUInt)
// if err != nil { return }
// member.bitWidth = parser.token.Value().(uint64)
// err = parser.nextToken()
// if err != nil { return }
// }
//
// // parse default value
// if parser.token.Is(lexer.TokenKindNewline) {
// err = parser.nextToken()
// if err != nil { return }
//
// member.value,
// err = parser.parseInitializationValues(1)
// if err != nil { return }
// } else {
// member.value, err = parser.parseArgument()
// if err != nil { return }
//
// err = parser.expect(lexer.TokenKindNewline)
// if err != nil { return }
// err = parser.nextToken()
// if err != nil { 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) {
output += doIndent (
indent,
"data ",
"type ",
section.permission.ToString(), " ",
section.name, ":",
section.what.ToString())
@ -265,22 +265,43 @@ func (section DataSection) ToString (indent int) (output string) {
isComplexInitialization :=
section.value.kind == ArgumentKindObjectInitializationValues ||
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 {
output += "\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
}
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) {
output += doIndent (
indent,
@ -292,61 +313,23 @@ func (section TypeSection) ToString (indent int) (output string) {
isComplexInitialization :=
section.value.kind == ArgumentKindObjectInitializationValues ||
section.value.kind == ArgumentKindArrayInitializationValues
if section.value.value == nil {
output += "\n"
} else if isComplexInitialization {
output += "\n"
output += section.value.ToString(indent + 1, true)
} else {
if !isComplexInitialization && section.value.value != nil {
output += " " + section.value.ToString(0, false)
output += "\n"
}
return
}
output += "\n"
func (member ObjtMember) 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)
}
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 {
for _, member := range section.what.members {
output += member.ToString(indent + 1)
}
if isComplexInitialization {
output += section.value.ToString(indent + 1, true)
}
return
}
func (section EnumSection) ToString (indent int) (output string) {
output += doIndent (
indent,
@ -410,6 +393,7 @@ func (phrase Phrase) ToString (indent int, ownLine bool) (output string) {
}
var initializationValues Argument
var declaration Argument
output += "[" + phrase.command.ToString(0, false)
for _, argument := range phrase.arguments {
@ -418,6 +402,8 @@ func (phrase Phrase) ToString (indent int, ownLine bool) (output string) {
argument.kind == ArgumentKindArrayInitializationValues
if isInitializationValue {
initializationValues = argument
} else if argument.kind == ArgumentKindDeclaration {
declaration = argument
} else {
output += " " + argument.ToString(0, false)
}
@ -433,6 +419,13 @@ func (phrase Phrase) ToString (indent int, ownLine bool) (output string) {
if ownLine {
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 {
output += initializationValues.ToString(indent + 1, true)
}

View File

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

View File

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