From 362b904900c6dc21e06c91faa9dc458d6743eecb Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sun, 11 Sep 2022 10:52:53 -0400 Subject: [PATCH 01/46] Rewrote test cases with new syntax --- parser/data_test.go | 16 ++++++++-------- parser/objt_test.go | 37 ++++++++++++++++++++----------------- tests/parser/data/main.arf | 17 +++++++++-------- tests/parser/objt/main.arf | 34 ++++++++++++++++++---------------- tests/parser/skim/main.arf | 18 +++++++++--------- 5 files changed, 64 insertions(+), 58 deletions(-) diff --git a/parser/data_test.go b/parser/data_test.go index f6b7df3..ab7b8f7 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -25,15 +25,15 @@ data ro gIntegerArrayInitialized:Int:16 4785 92 data ro jObject:thing.Thing.thing.thing - .that 2139 - .this 324 + -- that 2139 + -- this 324 data ro kNestedObject:Obj - .that - .bird2 123.8439 - .bird3 9328.21348239 - .this - .bird0 324 - .bird1 "hello world" + -- that + -- bird2 123.8439 + -- bird3 9328.21348239 + -- this + -- bird0 324 + -- bird1 "hello world" data ro lMutIntegerArray16:Int:16:mut data ro mExternalData:Int:8 external diff --git a/parser/objt_test.go b/parser/objt_test.go index eda582d..aa3651b 100644 --- a/parser/objt_test.go +++ b/parser/objt_test.go @@ -2,30 +2,33 @@ package parser import "testing" +// TODO: merge this test with the type test func TestObjt (test *testing.T) { checkTree ("../tests/parser/objt", false, `:arf --- -objt ro Basic:Obj - ro that:Basic - ro this:Basic -objt ro BitFields:Obj +type ro aBasic:Obj + ro that:Int + ro this:Int +type ro bBitFields:Obj ro that:Int & 1 ro this:Int & 24 298 -objt ro ComplexInit:Obj - ro whatever:Int:3 - 230984 - 849 - 394580 - ro complex0:Bird - .that 98 - .this 2 - ro complex1:Bird - .that 98902 - .this 235 - ro basic:Int 87 -objt ro Init:Obj +type ro cInit:Obj ro that:String "hello world" ro this:Int 23 +type ro dInitInherit:aBasic + -- that 9384 + -- this 389 +type ro cInitAndDefine:aBasic + -- this 389 + ro these:aBasic + ro born:Int 4 + ro in:Int + ro the:Int:3 + 9348 + 92384 + 92834 + -- this 98 + -- that 9384 `, test) } diff --git a/tests/parser/data/main.arf b/tests/parser/data/main.arf index 55833af..81fb5d2 100644 --- a/tests/parser/data/main.arf +++ b/tests/parser/data/main.arf @@ -25,16 +25,17 @@ data ro gIntegerArrayInitialized:Int:16 # TODO: maybe test identifiers somewhere else? data ro jObject:thing.Thing. thing.thing - .this 324 - .that 2139 + -- this 324 + -- that 2139 data ro kNestedObject:Obj - .this - .bird0 324 - .bird1 "hello world" - .that - .bird2 123.8439 - .bird3 9328.21348239 + -- this + -- bird0 324 + -- bird1 "hello world" + ro newMember:Int 9023 + -- that + -- bird2 123.8439 + -- bird3 9328.21348239 data ro lMutIntegerArray16:Int:16:mut diff --git a/tests/parser/objt/main.arf b/tests/parser/objt/main.arf index 9026d29..795bba3 100644 --- a/tests/parser/objt/main.arf +++ b/tests/parser/objt/main.arf @@ -1,25 +1,27 @@ :arf --- -objt ro Basic:Obj - ro that:Basic - ro this:Basic +type ro aBasic:Obj + ro that:Int + ro this:Int -objt ro BitFields:Obj +type ro bBitFields:Obj ro that:Int & 1 ro this:Int & 24 298 -objt ro Init:Obj +type ro cInit:Obj ro that:String "hello world" ro this:Int 23 -objt ro ComplexInit:Obj - ro whatever:Int:3 - 230984 - 849 394580 - ro complex0:Bird - .that 98 - .this 2 - ro complex1:Bird - .that 98902 - .this 235 - ro basic:Int 87 +type ro dInitInherit:aBasic + -- that 9384 + -- this 389 + +type ro cInitAndDefine:aBasic + -- this 389 + ro these:aBasic + ro born:Int 4 + ro in:Int + ro the:Int:3 + 9348 92384 92834 + -- this 98 + -- that 9384 diff --git a/tests/parser/skim/main.arf b/tests/parser/skim/main.arf index eefef04..762a451 100644 --- a/tests/parser/skim/main.arf +++ b/tests/parser/skim/main.arf @@ -7,12 +7,12 @@ data ro aExternalData:Int data ro bSingleValue:Int 342 data ro cNestedObject:Obj - .this - .bird0 324 - .bird1 "hello world" - .that - .bird2 123.8439 - .bird3 9328.21348239 + -- this + -- bird0 324 + -- bird1 "hello world" + -- that + -- bird2 123.8439 + -- bird3 9328.21348239 data ro dUninitialized:Int:16:mut @@ -28,9 +28,9 @@ func ro fComplexFunction 398 9 2309 983 -2387 478 555 123 = bird:Bird - .that - .whenYou 99999 - .this 324 + -- that + -- whenYou 99999 + -- this 324 func ro gExternalFunction > x:Int From 0af08a4d2440151bf762863131c8a714a95edc0c Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sun, 11 Sep 2022 15:35:07 -0400 Subject: [PATCH 02/46] Merged objt and type test cases --- parser/objt_test.go | 34 ---------------------------------- parser/type_test.go | 32 ++++++++++++++++++++++++++++---- tests/parser/objt/main.arf | 27 --------------------------- tests/parser/type/main.arf | 34 ++++++++++++++++++++++++++++++---- 4 files changed, 58 insertions(+), 69 deletions(-) delete mode 100644 parser/objt_test.go delete mode 100644 tests/parser/objt/main.arf diff --git a/parser/objt_test.go b/parser/objt_test.go deleted file mode 100644 index aa3651b..0000000 --- a/parser/objt_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package parser - -import "testing" - -// TODO: merge this test with the type test -func TestObjt (test *testing.T) { - checkTree ("../tests/parser/objt", false, -`:arf ---- -type ro aBasic:Obj - ro that:Int - ro this:Int -type ro bBitFields:Obj - ro that:Int & 1 - ro this:Int & 24 298 -type ro cInit:Obj - ro that:String "hello world" - ro this:Int 23 -type ro dInitInherit:aBasic - -- that 9384 - -- this 389 -type ro cInitAndDefine:aBasic - -- this 389 - ro these:aBasic - ro born:Int 4 - ro in:Int - ro the:Int:3 - 9348 - 92384 - 92834 - -- this 98 - -- that 9384 -`, test) -} diff --git a/parser/type_test.go b/parser/type_test.go index db05b06..b84d339 100644 --- a/parser/type_test.go +++ b/parser/type_test.go @@ -6,10 +6,34 @@ func TestType (test *testing.T) { checkTree ("../tests/parser/type", false, `:arf --- -type ro Basic:Int -type ro BasicInit:Int 6 -type ro IntArray:{Int ..} -type ro IntArrayInit:Int:3 +type ro aBasic:Obj + ro that:Int + ro this:Int +type ro bBitFields:Obj + ro that:Int & 1 + ro this:Int & 24 298 +type ro cInit:Obj + ro that:String "hello world" + ro this:Int 23 +type ro dInitInherit:aBasic + -- that 9384 + -- this 389 +type ro eInitAndDefine:aBasic + -- this 389 + ro these:aBasic + ro born:Int 4 + ro in:Int + ro the:Int:3 + 9348 + 92384 + 92834 + -- this 98 + -- that 9384 + +type ro fBasic:Int +type ro gBasicInit:Int 6 +type ro hIntArray:{Int ..} +type ro iIntArrayInit:Int:3 3298 923 92 diff --git a/tests/parser/objt/main.arf b/tests/parser/objt/main.arf deleted file mode 100644 index 795bba3..0000000 --- a/tests/parser/objt/main.arf +++ /dev/null @@ -1,27 +0,0 @@ -:arf ---- -type ro aBasic:Obj - ro that:Int - ro this:Int - -type ro bBitFields:Obj - ro that:Int & 1 - ro this:Int & 24 298 - -type ro cInit:Obj - ro that:String "hello world" - ro this:Int 23 - -type ro dInitInherit:aBasic - -- that 9384 - -- this 389 - -type ro cInitAndDefine:aBasic - -- this 389 - ro these:aBasic - ro born:Int 4 - ro in:Int - ro the:Int:3 - 9348 92384 92834 - -- this 98 - -- that 9384 diff --git a/tests/parser/type/main.arf b/tests/parser/type/main.arf index 7c84c2a..3500e3f 100644 --- a/tests/parser/type/main.arf +++ b/tests/parser/type/main.arf @@ -1,10 +1,36 @@ :arf --- -type ro Basic:Int +type ro aBasic:Obj + ro that:Int + ro this:Int -type ro BasicInit:Int 6 +type ro bBitFields:Obj + ro that:Int & 1 + ro this:Int & 24 298 -type ro IntArray:{Int ..} +type ro cInit:Obj + ro that:String "hello world" + ro this:Int 23 -type ro IntArrayInit:Int:3 +type ro dInitInherit:aBasic + -- that 9384 + -- this 389 + +type ro cInitAndDefine:aBasic + -- this 389 + ro these:aBasic + ro born:Int 4 + ro in:Int + ro the:Int:3 + 9348 92384 92834 + -- this 98 + -- that 9384 + +type ro fBasic:Int + +type ro gBasicInit:Int 6 + +type ro hIntArray:{Int ..} + +type ro iIntArrayInit:Int:3 3298 923 92 From 3e9ff7dcd651b89aba8d2f162514c29cbb05be48 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sun, 11 Sep 2022 16:15:02 -0400 Subject: [PATCH 03/46] Altered syntax tree accordingly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🦀🦀🦀 Object sections are gone 🦀🦀🦀 and members are now stored in the type specifier. --- parser/accessors.go | 45 ++++++++++++++++++++------------------------- parser/tree.go | 38 +++++++++++++++----------------------- 2 files changed, 35 insertions(+), 48 deletions(-) diff --git a/parser/accessors.go b/parser/accessors.go index bdfcd72..eca4312 100644 --- a/parser/accessors.go +++ b/parser/accessors.go @@ -29,12 +29,6 @@ func (section TypeSection) Kind () (kind SectionKind) { return } -// Kind returns the section's kind (SectionKindObjt). -func (section ObjtSection) Kind () (kind SectionKind) { - kind = SectionKindObjt - return -} - // Kind returns the section's kind (SectionKindEnum). func (section EnumSection) Kind () (kind SectionKind) { kind = SectionKindEnum @@ -111,6 +105,26 @@ func (what Type) Points () (points Type) { return } +// MembersLength returns the amount of new members the type specifier defines. +// If it defines no new members, it returns zero. +func (what Type) MembersLength () (length int) { + length = len(what.members) + return +} + +// Member returns the member at index. +func (what Type) Member (index int) (member TypeMember) { + member = what.members[index] + return +} + +// BitWidth returns the bit width of the type member. If it is zero, it should +// be treated as unspecified. +func (member TypeMember) BitWidth () (width uint64) { + width = member.bitWidth + return +} + // Values returns an iterator for the initialization values. func (values ObjectInitializationValues) Sections () ( iterator types.Iterator[Argument], @@ -144,25 +158,6 @@ func (argument Argument) Value () (value any) { return } -// BitWidth returns the bit width of the object member. If it is zero, it should -// be treated as unspecified. -func (member ObjtMember) BitWidth () (width uint64) { - width = member.bitWidth - return -} - -// Length returns the amount of members in the section. -func (section ObjtSection) Length () (length int) { - length = len(section.members) - return -} - -// Item returns the member at index. -func (section ObjtSection) Item (index int) (member ObjtMember) { - member = section.members[index] - return -} - // Length returns the amount of members in the section. func (section EnumSection) Length () (length int) { length = len(section.members) diff --git a/parser/tree.go b/parser/tree.go index a1be9dd..a9d2345 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -20,7 +20,6 @@ type SectionKind int const ( SectionKindType = iota - SectionKindObjt SectionKindEnum SectionKindFace SectionKindData @@ -59,6 +58,17 @@ const ( TypeKindVariableArray ) +// TypeMember represents a member variable of a type specifier. +type TypeMember struct { + locatable + nameable + typeable + permissionable + valuable + + bitWidth uint64 +} + // Type represents a type specifier type Type struct { locatable @@ -72,6 +82,9 @@ type Type struct { // not applicable for basic. points *Type + + // if non-nil, this type defines new members. + members []TypeMember } // Declaration represents a variable declaration. @@ -173,7 +186,7 @@ type DataSection struct { external bool } -// TypeSection represents a blind type definition. +// TypeSection represents a type definition. type TypeSection struct { locatable nameable @@ -182,27 +195,6 @@ type TypeSection struct { valuable } -// ObjtMember represents a part of an object type definition. -type ObjtMember struct { - locatable - nameable - typeable - permissionable - valuable - - bitWidth uint64 -} - -// ObjtSection represents an object type definition. -type ObjtSection struct { - locatable - nameable - permissionable - inherits Identifier - - members []ObjtMember -} - // EnumMember represents a member of an enum section. type EnumMember struct { locatable From dbd0eb570d35f66b327a57adcee3ecd659d381a3 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Mon, 12 Sep 2022 15:27:29 -0400 Subject: [PATCH 04/46] Did some ToString stuff --- parser/data_test.go | 1 + parser/initialization-values.go | 9 ++ parser/objt.go | 248 ++++++++++++++++---------------- parser/tree-tostring.go | 105 +++++++------- parser/tree.go | 6 +- parser/type_test.go | 3 +- 6 files changed, 188 insertions(+), 184 deletions(-) diff --git a/parser/data_test.go b/parser/data_test.go index ab7b8f7..12b8793 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -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 diff --git a/parser/initialization-values.go b/parser/initialization-values.go index 58e4ed5..2ee9990 100644 --- a/parser/initialization-values.go +++ b/parser/initialization-values.go @@ -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, diff --git a/parser/objt.go b/parser/objt.go index 1e83e98..1449db7 100644 --- a/parser/objt.go +++ b/parser/objt.go @@ -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(§ion) - 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(§ion) + // 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 +// } diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 28c09ff..d0cf239 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -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) } diff --git a/parser/tree.go b/parser/tree.go index a9d2345..cbd9ee3 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -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. diff --git a/parser/type_test.go b/parser/type_test.go index b84d339..6574e83 100644 --- a/parser/type_test.go +++ b/parser/type_test.go @@ -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 From 389c9a313c9085e59166e38264e210701b56a916 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 13 Sep 2022 11:02:24 -0400 Subject: [PATCH 05/46] Function section ouputs now print complex initialization values --- parser/tree-tostring.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index d0cf239..918b3dd 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -442,11 +442,25 @@ func (block Block) ToString (indent int) (output string) { return } -func (funcOutput FuncOutput) ToString () (output string) { - output += funcOutput.Declaration.ToString() - if funcOutput.value.kind != ArgumentKindNil { +func (funcOutput FuncOutput) ToString (indent int) (output string) { + output += doIndent(indent + 1, "< ", funcOutput.Declaration.ToString()) + + isComplexInitialization := + funcOutput.value.kind == ArgumentKindObjectInitializationValues || + funcOutput.value.kind == ArgumentKindArrayInitializationValues + + if !isComplexInitialization && funcOutput.value.value != nil { output += " " + funcOutput.value.ToString(0, false) } + output += "\n" + + for _, member := range funcOutput.what.members { + output += member.ToString(indent + 1) + } + + if isComplexInitialization { + output += funcOutput.value.ToString(indent + 1, true) + } return } @@ -468,7 +482,7 @@ func (section FuncSection) ToString (indent int) (output string) { } for _, outputItem := range section.outputs { - output += doIndent(indent + 1, "< ", outputItem.ToString(), "\n") + output += outputItem.ToString(indent + 1) } output += doIndent(indent + 1, "---\n") From ba3825287db0096c40a5c5524d0ddb05084c39bd Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 13 Sep 2022 11:09:41 -0400 Subject: [PATCH 06/46] Removed the horrendus "ArgumentKindObjectInitializationValues" name --- parser/accessors.go | 6 ++-- parser/initialization-values.go | 56 ++++++++++++++++----------------- parser/tree-tostring.go | 34 ++++++++++---------- parser/tree.go | 13 ++++---- 4 files changed, 54 insertions(+), 55 deletions(-) diff --git a/parser/accessors.go b/parser/accessors.go index eca4312..2222efa 100644 --- a/parser/accessors.go +++ b/parser/accessors.go @@ -126,7 +126,7 @@ func (member TypeMember) BitWidth () (width uint64) { } // Values returns an iterator for the initialization values. -func (values ObjectInitializationValues) Sections () ( +func (values ObjectDefaultValues) Sections () ( iterator types.Iterator[Argument], ) { iterator = types.NewIterator(values.attributes) @@ -134,13 +134,13 @@ func (values ObjectInitializationValues) Sections () ( } // Length returns the amount of values. -func (values ArrayInitializationValues) Length () (length int) { +func (values ArrayDefaultValues) Length () (length int) { length = len(values.values) return } // Item returns the value at index. -func (values ArrayInitializationValues) Value (index int) (value Argument) { +func (values ArrayDefaultValues) Value (index int) (value Argument) { value = values.values[index] return } diff --git a/parser/initialization-values.go b/parser/initialization-values.go index 2ee9990..102a19d 100644 --- a/parser/initialization-values.go +++ b/parser/initialization-values.go @@ -12,21 +12,21 @@ import "git.tebibyte.media/arf/arf/infoerr" // (parser *ParsingOperation) parseDefaultMemberValue // (parser *ParsingOperation) parseMemberDeclaration -// parseInitializationValues starts on the line after a data section, or a set +// parsedefaultValues 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, // it parses initialization values. -func (parser *ParsingOperation) parseInitializationValues ( +func (parser *ParsingOperation) parsedefaultValues ( baseIndent int, ) ( - initializationArgument Argument, + argument Argument, err error, ) { // check if line is indented one more than baseIndent if !parser.token.Is(lexer.TokenKindIndent) { return } if parser.token.Value().(int) != baseIndent + 1 { return } - initializationArgument.location = parser.token.Location() + argument.location = parser.token.Location() err = parser.nextToken() if err != nil { return } @@ -35,31 +35,31 @@ func (parser *ParsingOperation) parseInitializationValues ( // object initialization parser.previousToken() - var initializationValues ObjectInitializationValues - initializationValues, err = parser.parseObjectInitializationValues() - initializationArgument.kind = ArgumentKindObjectInitializationValues - initializationArgument.value = initializationValues + var values ObjectDefaultValues + values, err = parser.parseObjectdefaultValues() + argument.kind = ArgumentKindObjectDefaultValues + argument.value = values } else { // array initialization parser.previousToken() - var initializationValues ArrayInitializationValues - initializationValues, err = parser.parseArrayInitializationValues() - initializationArgument.kind = ArgumentKindArrayInitializationValues - initializationArgument.value = initializationValues + var values ArrayDefaultValues + values, err = parser.parseArrayDefaultValues() + argument.kind = ArgumentKindArrayDefaultValues + argument.value = values } return } -// parseObjectInitializationValues parses a list of object initialization +// parseObjectdefaultValues parses a list of object initialization // values until the indentation level drops. -func (parser *ParsingOperation) parseObjectInitializationValues () ( - initializationValues ObjectInitializationValues, +func (parser *ParsingOperation) parseObjectdefaultValues () ( + defaultValues ObjectDefaultValues, err error, ) { - initializationValues.attributes = make(map[string] Argument) + defaultValues.attributes = make(map[string] Argument) baseIndent := 0 begin := true @@ -70,7 +70,7 @@ func (parser *ParsingOperation) parseObjectInitializationValues () ( indent := parser.token.Value().(int) if begin == true { - initializationValues.location = parser.token.Location() + defaultValues.location = parser.token.Location() baseIndent = indent begin = false } @@ -87,7 +87,7 @@ func (parser *ParsingOperation) parseObjectInitializationValues () ( name := parser.token.Value().(string) // if the member has already been listed, throw an error - _, exists := initializationValues.attributes[name] + _, exists := defaultValues.attributes[name] if exists { err = parser.token.NewError ( "duplicate member \"" + name + "\" in object " + @@ -107,15 +107,15 @@ func (parser *ParsingOperation) parseObjectInitializationValues () ( err = parser.nextToken(lexer.TokenKindIndent) if err != nil { return } - value, err = parser.parseInitializationValues(baseIndent) - initializationValues.attributes[name] = value + value, err = parser.parsedefaultValues(baseIndent) + defaultValues.attributes[name] = value if err != nil { return } } else { // parse as normal argument value, err = parser.parseArgument() - initializationValues.attributes[name] = value + defaultValues.attributes[name] = value if err != nil { return } err = parser.expect(lexer.TokenKindNewline) @@ -128,10 +128,10 @@ func (parser *ParsingOperation) parseObjectInitializationValues () ( return } -// parseArrayInitializationValues parses a list of array initialization values -// until the indentation lexel drops. -func (parser *ParsingOperation) parseArrayInitializationValues () ( - initializationValues ArrayInitializationValues, +// parseArrayDefaultValues parses a list of array initialization values until +// the indentation lexel drops. +func (parser *ParsingOperation) parseArrayDefaultValues () ( + defaultValues ArrayDefaultValues, err error, ) { baseIndent := 0 @@ -143,7 +143,7 @@ func (parser *ParsingOperation) parseArrayInitializationValues () ( indent := parser.token.Value().(int) if begin == true { - initializationValues.location = parser.token.Location() + defaultValues.location = parser.token.Location() baseIndent = indent begin = false } @@ -169,8 +169,8 @@ func (parser *ParsingOperation) parseArrayInitializationValues () ( var argument Argument argument, err = parser.parseArgument() if err != nil { return } - initializationValues.values = append ( - initializationValues.values, + defaultValues.values = append ( + defaultValues.values, argument) } } diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 918b3dd..77c4885 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -97,7 +97,7 @@ func (declaration Declaration) ToString () (output string) { return } -func (attributes ObjectInitializationValues) ToString ( +func (attributes ObjectDefaultValues) ToString ( indent int, ) ( output string, @@ -106,7 +106,7 @@ func (attributes ObjectInitializationValues) ToString ( value := attributes.attributes[name] output += doIndent(indent, ".", name) - if value.kind == ArgumentKindObjectInitializationValues { + if value.kind == ArgumentKindObjectDefaultValues { output += "\n" output += value.ToString(indent + 1, true) } else { @@ -117,7 +117,7 @@ func (attributes ObjectInitializationValues) ToString ( return } -func (values ArrayInitializationValues) ToString ( +func (values ArrayDefaultValues) ToString ( indent int, ) ( output string, @@ -143,14 +143,14 @@ func (argument Argument) ToString (indent int, breakLine bool) (output string) { indent, breakLine) - case ArgumentKindObjectInitializationValues: + case ArgumentKindObjectDefaultValues: // this should only appear in contexts where breakLine is true - output += argument.value.(ObjectInitializationValues). + output += argument.value.(ObjectDefaultValues). ToString(indent) - case ArgumentKindArrayInitializationValues: + case ArgumentKindArrayDefaultValues: // this should only appear in contexts where breakLine is true - output += argument.value.(ArrayInitializationValues). + output += argument.value.(ArrayDefaultValues). ToString(indent) case ArgumentKindIdentifier: @@ -263,8 +263,8 @@ func (section DataSection) ToString (indent int) (output string) { section.what.ToString()) isComplexInitialization := - section.value.kind == ArgumentKindObjectInitializationValues || - section.value.kind == ArgumentKindArrayInitializationValues + section.value.kind == ArgumentKindObjectDefaultValues || + section.value.kind == ArgumentKindArrayDefaultValues if !isComplexInitialization && section.value.value != nil { output += " " + section.value.ToString(0, false) @@ -311,8 +311,8 @@ func (section TypeSection) ToString (indent int) (output string) { section.what.ToString()) isComplexInitialization := - section.value.kind == ArgumentKindObjectInitializationValues || - section.value.kind == ArgumentKindArrayInitializationValues + section.value.kind == ArgumentKindObjectDefaultValues || + section.value.kind == ArgumentKindArrayDefaultValues if !isComplexInitialization && section.value.value != nil { output += " " + section.value.ToString(0, false) @@ -342,8 +342,8 @@ func (section EnumSection) ToString (indent int) (output string) { output += doIndent(indent + 1, member.name) isComplexInitialization := - member.value.kind == ArgumentKindObjectInitializationValues || - member.value.kind == ArgumentKindArrayInitializationValues + member.value.kind == ArgumentKindObjectDefaultValues || + member.value.kind == ArgumentKindArrayDefaultValues if member.value.value == nil { output += "\n" @@ -398,8 +398,8 @@ func (phrase Phrase) ToString (indent int, ownLine bool) (output string) { output += "[" + phrase.command.ToString(0, false) for _, argument := range phrase.arguments { isInitializationValue := - argument.kind == ArgumentKindObjectInitializationValues || - argument.kind == ArgumentKindArrayInitializationValues + argument.kind == ArgumentKindObjectDefaultValues || + argument.kind == ArgumentKindArrayDefaultValues if isInitializationValue { initializationValues = argument } else if argument.kind == ArgumentKindDeclaration { @@ -446,8 +446,8 @@ func (funcOutput FuncOutput) ToString (indent int) (output string) { output += doIndent(indent + 1, "< ", funcOutput.Declaration.ToString()) isComplexInitialization := - funcOutput.value.kind == ArgumentKindObjectInitializationValues || - funcOutput.value.kind == ArgumentKindArrayInitializationValues + funcOutput.value.kind == ArgumentKindObjectDefaultValues || + funcOutput.value.kind == ArgumentKindArrayDefaultValues if !isComplexInitialization && funcOutput.value.value != nil { output += " " + funcOutput.value.ToString(0, false) diff --git a/parser/tree.go b/parser/tree.go index cbd9ee3..b1548ea 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -94,16 +94,15 @@ type Declaration struct { typeable } -// ObjectInitializationValues represents a list of object member initialization +// ObjectDefaultValues represents a list of object member initialization // attributes. -type ObjectInitializationValues struct { +type ObjectDefaultValues struct { locatable attributes map[string] Argument } -// ArrayInitializationValues represents a list of attributes initializing an -// array. -type ArrayInitializationValues struct { +// ArrayDefaultValues represents a list of elements initializing an array. +type ArrayDefaultValues struct { locatable values []Argument } @@ -128,10 +127,10 @@ const ( // .name value // but like, a lot of them - ArgumentKindObjectInitializationValues + ArgumentKindObjectDefaultValues // value value... - ArgumentKindArrayInitializationValues + ArgumentKindArrayDefaultValues // name.name // name.name.name From 5384dff15bcd55d4027de94b0eb0edd0de92ce84 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 13 Sep 2022 11:10:42 -0400 Subject: [PATCH 07/46] Removed object sections from body --- parser/body.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/parser/body.go b/parser/body.go index bb852a0..ba29ab9 100644 --- a/parser/body.go +++ b/parser/body.go @@ -23,12 +23,6 @@ func (parser *ParsingOperation) parseBody () (err error) { if err != nil { return } if parseErr != nil { return parseErr } - case "objt": - section, parseErr := parser.parseObjtSection() - err = parser.tree.addSection(section) - if err != nil { return } - if parseErr != nil { return parseErr } - case "face": section, parseErr := parser.parseFaceSection() err = parser.tree.addSection(section) From 21ea27791d130db9ced8454c88a2001b743f5877 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 13 Sep 2022 11:12:38 -0400 Subject: [PATCH 08/46] Removed the last traces of the word "initialization" --- parser/data.go | 2 +- parser/enum.go | 2 +- parser/func.go | 2 +- parser/initialization-values.go | 4 ++-- parser/phrase.go | 2 +- parser/type.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/parser/data.go b/parser/data.go index 52cb5e3..4a228e6 100644 --- a/parser/data.go +++ b/parser/data.go @@ -58,7 +58,7 @@ func (parser *ParsingOperation) parseDataSection () ( // otherwise, parse initialization values parser.previousToken() - section.value, err = parser.parseInitializationValues(0) + section.value, err = parser.parseDefaultValues(0) if err != nil { return } } else { section.value, err = parser.parseArgument() diff --git a/parser/enum.go b/parser/enum.go index 9625dc5..ea45b09 100644 --- a/parser/enum.go +++ b/parser/enum.go @@ -77,7 +77,7 @@ func (parser *ParsingOperation) parseEnumMembers ( err = parser.nextToken() if err != nil { return } - member.value, err = parser.parseInitializationValues(1) + member.value, err = parser.parseDefaultValues(1) into.members = append(into.members, member) if err != nil { return } } else { diff --git a/parser/func.go b/parser/func.go index 1722d9f..8619cc7 100644 --- a/parser/func.go +++ b/parser/func.go @@ -200,7 +200,7 @@ func (parser *ParsingOperation) parseFuncArguments ( if err != nil { return } output.value, err = - parser.parseInitializationValues(1) + parser.parseDefaultValues(1) into.outputs = append(into.outputs, output) if err != nil { return } } else { diff --git a/parser/initialization-values.go b/parser/initialization-values.go index 102a19d..983f2ca 100644 --- a/parser/initialization-values.go +++ b/parser/initialization-values.go @@ -16,7 +16,7 @@ import "git.tebibyte.media/arf/arf/infoerr" // 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, // it parses initialization values. -func (parser *ParsingOperation) parsedefaultValues ( +func (parser *ParsingOperation) parseDefaultValues ( baseIndent int, ) ( argument Argument, @@ -107,7 +107,7 @@ func (parser *ParsingOperation) parseObjectdefaultValues () ( err = parser.nextToken(lexer.TokenKindIndent) if err != nil { return } - value, err = parser.parsedefaultValues(baseIndent) + value, err = parser.parseDefaultValues(baseIndent) defaultValues.attributes[name] = value if err != nil { return } diff --git a/parser/phrase.go b/parser/phrase.go index 8864772..829ca49 100644 --- a/parser/phrase.go +++ b/parser/phrase.go @@ -216,7 +216,7 @@ func (parser *ParsingOperation) parseBlockLevelPhrase ( // if this is a set phrase, parse initialization values under it if phrase.kind == PhraseKindAssign { var values Argument - values, err = parser.parseInitializationValues(indent) + values, err = parser.parseDefaultValues(indent) if values.kind != ArgumentKindNil { phrase.arguments = append(phrase.arguments, values) diff --git a/parser/type.go b/parser/type.go index 309e543..34ed380 100644 --- a/parser/type.go +++ b/parser/type.go @@ -37,7 +37,7 @@ func (parser *ParsingOperation) parseTypeSection () ( err = parser.nextToken() if err != nil { return } - section.value, err = parser.parseInitializationValues(0) + section.value, err = parser.parseDefaultValues(0) if err != nil { return } } else { section.value, err = parser.parseArgument() From 767bf81b8549ec0c0913f584090f92c47613ffc5 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 13 Sep 2022 16:31:08 -0400 Subject: [PATCH 09/46] Lobbotomized the codebase --- parser/data.go | 37 ++----- parser/default-values.go | 180 ++++++++++++++++++++++++++++++++ parser/enum.go | 23 ++-- parser/func.go | 31 +----- parser/initialization-values.go | 179 ------------------------------- parser/misc.go | 68 ------------ parser/phrase.go | 12 --- parser/tree-tostring.go | 67 ++---------- parser/tree.go | 9 +- parser/type-notation.go | 72 +++++++++++++ parser/type.go | 21 +--- 11 files changed, 286 insertions(+), 413 deletions(-) create mode 100644 parser/default-values.go delete mode 100644 parser/initialization-values.go create mode 100644 parser/type-notation.go diff --git a/parser/data.go b/parser/data.go index 4a228e6..22fcdfb 100644 --- a/parser/data.go +++ b/parser/data.go @@ -35,39 +35,16 @@ func (parser *ParsingOperation) parseDataSection () ( return } - if parser.token.Is(lexer.TokenKindNewline) { - 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.parseDefaultValues(0) - if err != nil { return } - } else { - section.value, err = parser.parseArgument() - if err != nil { return } - - err = parser.expect(lexer.TokenKindNewline) + // check if data is external + 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 } return } diff --git a/parser/default-values.go b/parser/default-values.go new file mode 100644 index 0000000..cc8b1df --- /dev/null +++ b/parser/default-values.go @@ -0,0 +1,180 @@ +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 +// +// // parsedefaultValues starts on the line after a = phrase, a data section, a +// // type section, or anywhere else where there can be a default value. It returns +// // a default value in the form of an argument, as well as any defined members +// // that it finds. +// func (parser *ParsingOperation) parseDefaultValues ( + // baseIndent int, +// ) ( + // argument Argument, + // members []TypeMember, + // err error, +// ) { + // // check if line is indented one more than baseIndent + // if !parser.token.Is(lexer.TokenKindIndent) { return } + // if parser.token.Value().(int) != baseIndent + 1 { return } +// + // argument.location = parser.token.Location() + // + // err = parser.nextToken() + // if err != nil { return } +// + // if parser.token.Is(lexer.TokenKindDot) { +// + // // object initialization + // parser.previousToken() + // var values ObjectDefaultValues + // values, err = parser.parseObjectdefaultValues() + // argument.kind = ArgumentKindObjectDefaultValues + // argument.value = values + // + // } else { + // + // // array initialization + // parser.previousToken() + // var values ArrayDefaultValues + // values, err = parser.parseArrayDefaultValues() + // argument.kind = ArgumentKindArrayDefaultValues + // argument.value = values + // } + // + // return +// } +// +// // parseObjectdefaultValues parses a list of object initialization +// // values until the indentation level drops. +// func (parser *ParsingOperation) parseObjectdefaultValues () ( + // defaultValues ObjectDefaultValues, + // err error, +// ) { + // defaultValues.attributes = make(map[string] Argument) +// + // baseIndent := 0 + // begin := true + // + // for { + // // if there is no indent we can just stop parsing + // if !parser.token.Is(lexer.TokenKindIndent) { break} + // indent := parser.token.Value().(int) + // + // if begin == true { + // defaultValues.location = parser.token.Location() + // baseIndent = indent + // begin = false + // } +// + // // do not parse any further if the indent has changed + // if indent != baseIndent { break } +// + // // move on to the beginning of the line, which must contain + // // a member initialization value + // err = parser.nextToken(lexer.TokenKindDot) + // if err != nil { return } + // err = parser.nextToken(lexer.TokenKindName) + // if err != nil { return } + // name := parser.token.Value().(string) +// + // // if the member has already been listed, throw an error + // _, exists := defaultValues.attributes[name] + // if exists { + // err = parser.token.NewError ( + // "duplicate member \"" + name + "\" in object " + + // "member initialization", + // infoerr.ErrorKindError) + // return + // } +// + // // parse the argument determining the member initialization + // // value + // err = parser.nextToken() + // if err != nil { return } + // var value Argument + // if parser.token.Is(lexer.TokenKindNewline) { + // + // // recurse + // err = parser.nextToken(lexer.TokenKindIndent) + // if err != nil { return } + // + // value, err = parser.parseDefaultValues(baseIndent) + // defaultValues.attributes[name] = value + // if err != nil { return } + // + // } else { +// + // // parse as normal argument + // value, err = parser.parseArgument() + // defaultValues.attributes[name] = value + // if err != nil { return } + // + // err = parser.expect(lexer.TokenKindNewline) + // if err != nil { return } + // err = parser.nextToken() + // if err != nil { return } + // } + // } + // + // return +// } +// +// // parseArrayDefaultValues parses a list of array initialization values until +// // the indentation lexel drops. +// func (parser *ParsingOperation) parseArrayDefaultValues () ( + // defaultValues ArrayDefaultValues, + // err error, +// ) { + // baseIndent := 0 + // begin := true + // + // for { + // // if there is no indent we can just stop parsing + // if !parser.token.Is(lexer.TokenKindIndent) { break} + // indent := parser.token.Value().(int) + // + // if begin == true { + // defaultValues.location = parser.token.Location() + // baseIndent = indent + // begin = false + // } +// + // // do not parse any further if the indent has changed + // if indent != baseIndent { break } +// + // // move on to the beginning of the line, which must contain + // // arguments + // err = parser.nextToken(validArgumentStartTokens...) + // if err != nil { return } +// + // for { + // // stop parsing this line and go on to the next if a + // // newline token is encountered + // if parser.token.Is(lexer.TokenKindNewline) { + // err = parser.nextToken() + // if err != nil { return } + // break + // } +// + // // otherwise, parse the argument + // var argument Argument + // argument, err = parser.parseArgument() + // if err != nil { return } + // defaultValues.values = append ( + // defaultValues.values, + // argument) + // } + // } +// + // return +// } diff --git a/parser/enum.go b/parser/enum.go index ea45b09..8c71e0c 100644 --- a/parser/enum.go +++ b/parser/enum.go @@ -73,22 +73,13 @@ func (parser *ParsingOperation) parseEnumMembers ( if err != nil { return } // parse default value - if parser.token.Is(lexer.TokenKindNewline) { - err = parser.nextToken() - if err != nil { return } + member.value, err = parser.parseArgument() + into.members = append(into.members, member) + if err != nil { return } - member.value, err = parser.parseDefaultValues(1) - into.members = append(into.members, member) - if err != nil { return } - } else { - member.value, err = parser.parseArgument() - into.members = append(into.members, member) - if err != nil { return } - - err = parser.expect(lexer.TokenKindNewline) - if err != nil { return } - err = parser.nextToken() - if err != nil { return } - } + err = parser.expect(lexer.TokenKindNewline) + if err != nil { return } + err = parser.nextToken() + if err != nil { return } } } diff --git a/parser/func.go b/parser/func.go index 8619cc7..cc486a3 100644 --- a/parser/func.go +++ b/parser/func.go @@ -187,33 +187,10 @@ func (parser *ParsingOperation) parseFuncArguments ( output.what, err = parser.parseType() if err != nil { return } - // skip the default value if we are skimming - if parser.skimming { - err = parser.skipIndentLevel(2) - into.outputs = append(into.outputs, output) - return - } - - // parse default value - if parser.token.Is(lexer.TokenKindNewline) { - err = parser.nextToken() - if err != nil { return } - - output.value, err = - parser.parseDefaultValues(1) - into.outputs = append(into.outputs, output) - if err != nil { return } - } else { - output.value, err = - parser.parseArgument() - into.outputs = append(into.outputs, output) - if err != nil { return } - - err = parser.expect(lexer.TokenKindNewline) - if err != nil { return } - err = parser.nextToken() - if err != nil { return } - } + parser.expect(lexer.TokenKindNewline) + if err != nil { return } + err = parser.nextToken() + if err != nil { return } } } } diff --git a/parser/initialization-values.go b/parser/initialization-values.go deleted file mode 100644 index 983f2ca..0000000 --- a/parser/initialization-values.go +++ /dev/null @@ -1,179 +0,0 @@ -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 - -// parsedefaultValues 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, -// it parses initialization values. -func (parser *ParsingOperation) parseDefaultValues ( - baseIndent int, -) ( - argument Argument, - err error, -) { - // check if line is indented one more than baseIndent - if !parser.token.Is(lexer.TokenKindIndent) { return } - if parser.token.Value().(int) != baseIndent + 1 { return } - - argument.location = parser.token.Location() - - err = parser.nextToken() - if err != nil { return } - - if parser.token.Is(lexer.TokenKindDot) { - - // object initialization - parser.previousToken() - var values ObjectDefaultValues - values, err = parser.parseObjectdefaultValues() - argument.kind = ArgumentKindObjectDefaultValues - argument.value = values - - } else { - - // array initialization - parser.previousToken() - var values ArrayDefaultValues - values, err = parser.parseArrayDefaultValues() - argument.kind = ArgumentKindArrayDefaultValues - argument.value = values - } - - return -} - -// parseObjectdefaultValues parses a list of object initialization -// values until the indentation level drops. -func (parser *ParsingOperation) parseObjectdefaultValues () ( - defaultValues ObjectDefaultValues, - err error, -) { - defaultValues.attributes = make(map[string] Argument) - - baseIndent := 0 - begin := true - - for { - // if there is no indent we can just stop parsing - if !parser.token.Is(lexer.TokenKindIndent) { break} - indent := parser.token.Value().(int) - - if begin == true { - defaultValues.location = parser.token.Location() - baseIndent = indent - begin = false - } - - // do not parse any further if the indent has changed - if indent != baseIndent { break } - - // move on to the beginning of the line, which must contain - // a member initialization value - err = parser.nextToken(lexer.TokenKindDot) - if err != nil { return } - err = parser.nextToken(lexer.TokenKindName) - if err != nil { return } - name := parser.token.Value().(string) - - // if the member has already been listed, throw an error - _, exists := defaultValues.attributes[name] - if exists { - err = parser.token.NewError ( - "duplicate member \"" + name + "\" in object " + - "member initialization", - infoerr.ErrorKindError) - return - } - - // parse the argument determining the member initialization - // value - err = parser.nextToken() - if err != nil { return } - var value Argument - if parser.token.Is(lexer.TokenKindNewline) { - - // recurse - err = parser.nextToken(lexer.TokenKindIndent) - if err != nil { return } - - value, err = parser.parseDefaultValues(baseIndent) - defaultValues.attributes[name] = value - if err != nil { return } - - } else { - - // parse as normal argument - value, err = parser.parseArgument() - defaultValues.attributes[name] = value - if err != nil { return } - - err = parser.expect(lexer.TokenKindNewline) - if err != nil { return } - err = parser.nextToken() - if err != nil { return } - } - } - - return -} - -// parseArrayDefaultValues parses a list of array initialization values until -// the indentation lexel drops. -func (parser *ParsingOperation) parseArrayDefaultValues () ( - defaultValues ArrayDefaultValues, - err error, -) { - baseIndent := 0 - begin := true - - for { - // if there is no indent we can just stop parsing - if !parser.token.Is(lexer.TokenKindIndent) { break} - indent := parser.token.Value().(int) - - if begin == true { - defaultValues.location = parser.token.Location() - baseIndent = indent - begin = false - } - - // do not parse any further if the indent has changed - if indent != baseIndent { break } - - // move on to the beginning of the line, which must contain - // arguments - err = parser.nextToken(validArgumentStartTokens...) - if err != nil { return } - - for { - // stop parsing this line and go on to the next if a - // newline token is encountered - if parser.token.Is(lexer.TokenKindNewline) { - err = parser.nextToken() - if err != nil { return } - break - } - - // otherwise, parse the argument - var argument Argument - argument, err = parser.parseArgument() - if err != nil { return } - defaultValues.values = append ( - defaultValues.values, - argument) - } - } - - return -} diff --git a/parser/misc.go b/parser/misc.go index 52b3879..9d54782 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -1,74 +1,6 @@ package parser import "git.tebibyte.media/arf/arf/lexer" -import "git.tebibyte.media/arf/arf/infoerr" - -// parseType parses a type notation of the form Name, {Name}, etc. -func (parser *ParsingOperation) parseType () (what Type, err error) { - err = parser.expect(lexer.TokenKindName, lexer.TokenKindLBrace) - if err != nil { return } - what.location = parser.token.Location() - - if parser.token.Is(lexer.TokenKindLBrace) { - what.kind = TypeKindPointer - - err = parser.nextToken() - if err != nil { return } - - var points Type - points, err = parser.parseType() - if err != nil { return } - what.points = &points - - err = parser.expect ( - lexer.TokenKindRBrace, - lexer.TokenKindElipsis) - if err != nil { return } - - if parser.token.Is(lexer.TokenKindElipsis) { - what.kind = TypeKindVariableArray - - err = parser.nextToken(lexer.TokenKindRBrace) - if err != nil { return } - } - - err = parser.nextToken() - if err != nil { return } - } else { - what.name, err = parser.parseIdentifier() - if err != nil { return } - } - - for { - if !parser.token.Is(lexer.TokenKindColon) { break } - - err = parser.nextToken(lexer.TokenKindName, lexer.TokenKindUInt) - if err != nil { return } - - if parser.token.Is(lexer.TokenKindName) { - // parse type qualifier - qualifier := parser.token.Value().(string) - switch qualifier { - case "mut": - what.mutable = true - default: - err = parser.token.NewError ( - "unknown type qualifier \"" + - qualifier + "\"", - infoerr.ErrorKindError) - return - } - } else { - // parse fixed array length - what.length = parser.token.Value().(uint64) - } - - err = parser.nextToken() - if err != nil { return } - } - - return -} // parseIdentifier parses an identifier made out of dot separated names. func (parser *ParsingOperation) parseIdentifier () ( diff --git a/parser/phrase.go b/parser/phrase.go index 829ca49..f1c882f 100644 --- a/parser/phrase.go +++ b/parser/phrase.go @@ -213,18 +213,6 @@ func (parser *ParsingOperation) parseBlockLevelPhrase ( err = parser.nextToken() if err != nil { return } - // if this is a set phrase, parse initialization values under it - if phrase.kind == PhraseKindAssign { - var values Argument - values, err = parser.parseDefaultValues(indent) - - if values.kind != ArgumentKindNil { - phrase.arguments = append(phrase.arguments, values) - } - - return - } - // if this is a control flow phrase, parse block under it isControlFlow := false for _, kind := range controlFlowKinds { diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 77c4885..6fa93b9 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -87,7 +87,8 @@ func (what Type) ToString () (output string) { if what.mutable { output += ":mut" } - + + // TODO: print out default value return } @@ -260,29 +261,7 @@ func (section DataSection) ToString (indent int) (output string) { "type ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString()) - - isComplexInitialization := - section.value.kind == ArgumentKindObjectDefaultValues || - section.value.kind == ArgumentKindArrayDefaultValues - - 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") - } + section.what.ToString(), "\n") return } @@ -308,24 +287,7 @@ func (section TypeSection) ToString (indent int) (output string) { "type ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString()) - - isComplexInitialization := - section.value.kind == ArgumentKindObjectDefaultValues || - section.value.kind == ArgumentKindArrayDefaultValues - - 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) - } + section.what.ToString(), "\n") return } @@ -443,24 +405,9 @@ func (block Block) ToString (indent int) (output string) { } func (funcOutput FuncOutput) ToString (indent int) (output string) { - output += doIndent(indent + 1, "< ", funcOutput.Declaration.ToString()) - - isComplexInitialization := - funcOutput.value.kind == ArgumentKindObjectDefaultValues || - funcOutput.value.kind == ArgumentKindArrayDefaultValues - - if !isComplexInitialization && funcOutput.value.value != nil { - output += " " + funcOutput.value.ToString(0, false) - } - output += "\n" - - for _, member := range funcOutput.what.members { - output += member.ToString(indent + 1) - } - - if isComplexInitialization { - output += funcOutput.value.ToString(indent + 1, true) - } + output += doIndent ( + indent + 1, + "< ", funcOutput.Declaration.ToString(), "\n") return } diff --git a/parser/tree.go b/parser/tree.go index b1548ea..c4f30bb 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -64,7 +64,6 @@ type TypeMember struct { nameable typeable permissionable - valuable bitWidth uint64 } @@ -84,7 +83,10 @@ type Type struct { points *Type // if non-nil, this type defines new members. - members []TypeMember + members []TypeMember + + // the default value of the type. + defaultValue Argument } // Declaration represents a variable declaration. @@ -180,7 +182,6 @@ type DataSection struct { nameable typeable permissionable - valuable external bool } @@ -191,7 +192,6 @@ type TypeSection struct { nameable typeable permissionable - valuable } // EnumMember represents a member of an enum section. @@ -270,7 +270,6 @@ type Block []Phrase // that it can have a default value. type FuncOutput struct { Declaration - valuable } // FuncSection represents a function section. diff --git a/parser/type-notation.go b/parser/type-notation.go new file mode 100644 index 0000000..c28bbe7 --- /dev/null +++ b/parser/type-notation.go @@ -0,0 +1,72 @@ +package parser + +import "git.tebibyte.media/arf/arf/lexer" +import "git.tebibyte.media/arf/arf/infoerr" + +// parseType parses a type notation of the form Name, {Name}, etc. +func (parser *ParsingOperation) parseType () (what Type, err error) { + err = parser.expect(lexer.TokenKindName, lexer.TokenKindLBrace) + if err != nil { return } + what.location = parser.token.Location() + + if parser.token.Is(lexer.TokenKindLBrace) { + what.kind = TypeKindPointer + + err = parser.nextToken() + if err != nil { return } + + var points Type + points, err = parser.parseType() + if err != nil { return } + what.points = &points + + err = parser.expect ( + lexer.TokenKindRBrace, + lexer.TokenKindElipsis) + if err != nil { return } + + if parser.token.Is(lexer.TokenKindElipsis) { + what.kind = TypeKindVariableArray + + err = parser.nextToken(lexer.TokenKindRBrace) + if err != nil { return } + } + + err = parser.nextToken() + if err != nil { return } + } else { + what.name, err = parser.parseIdentifier() + if err != nil { return } + } + + for { + if !parser.token.Is(lexer.TokenKindColon) { break } + + err = parser.nextToken(lexer.TokenKindName, lexer.TokenKindUInt) + if err != nil { return } + + if parser.token.Is(lexer.TokenKindName) { + // parse type qualifier + qualifier := parser.token.Value().(string) + switch qualifier { + case "mut": + what.mutable = true + default: + err = parser.token.NewError ( + "unknown type qualifier \"" + + qualifier + "\"", + infoerr.ErrorKindError) + return + } + } else { + // parse fixed array length + what.length = parser.token.Value().(uint64) + } + + err = parser.nextToken() + if err != nil { return } + } + + return +} + diff --git a/parser/type.go b/parser/type.go index 34ed380..14c8aa6 100644 --- a/parser/type.go +++ b/parser/type.go @@ -32,21 +32,10 @@ func (parser *ParsingOperation) parseTypeSection () ( section.what, err = parser.parseType() if err != nil { return } - // parse default values - if parser.token.Is(lexer.TokenKindNewline) { - err = parser.nextToken() - if err != nil { return } - - section.value, err = parser.parseDefaultValues(0) - if err != nil { return } - } else { - section.value, err = parser.parseArgument() - if err != nil { return } - - err = parser.expect(lexer.TokenKindNewline) - if err != nil { return } - err = parser.nextToken() - if err != nil { return } - } + parser.expect(lexer.TokenKindNewline) + if err != nil { return } + err = parser.nextToken() + if err != nil { return } + return } From 42a51477ec49609528d28ce759049b0c3a47c1c5 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 13 Sep 2022 17:04:43 -0400 Subject: [PATCH 10/46] Added ( and ) tokens --- lexer/lexer.go | 10 ++++++++++ lexer/lexer_test.go | 2 ++ lexer/token.go | 6 ++++++ parser/enum.go | 8 +++++--- parser/type-notation.go | 1 - tests/lexer/all.arf | 2 +- 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lexer/lexer.go b/lexer/lexer.go index d5e1bf7..c49154c 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -192,6 +192,16 @@ func (lexer *LexingOperation) tokenizeSymbolBeginning () (err error) { token.kind = TokenKindComma lexer.addToken(token) err = lexer.nextRune() + case '(': + token := lexer.newToken() + token.kind = TokenKindLParen + lexer.addToken(token) + err = lexer.nextRune() + case ')': + token := lexer.newToken() + token.kind = TokenKindRParen + lexer.addToken(token) + err = lexer.nextRune() case '[': token := lexer.newToken() token.kind = TokenKindLBracket diff --git a/lexer/lexer_test.go b/lexer/lexer_test.go index 932c9be..623410c 100644 --- a/lexer/lexer_test.go +++ b/lexer/lexer_test.go @@ -138,6 +138,8 @@ func TestTokenizeAll (test *testing.T) { quickToken(1, TokenKindDot, nil), quickToken(1, TokenKindComma, nil), quickToken(2, TokenKindElipsis, nil), + quickToken(1, TokenKindLParen, nil), + quickToken(1, TokenKindRParen, nil), quickToken(1, TokenKindLBracket, nil), quickToken(1, TokenKindRBracket, nil), quickToken(1, TokenKindLBrace, nil), diff --git a/lexer/token.go b/lexer/token.go index c8b6624..033bd06 100644 --- a/lexer/token.go +++ b/lexer/token.go @@ -28,6 +28,8 @@ const ( TokenKindElipsis TokenKindComma + TokenKindLParen + TokenKindRParen TokenKindLBracket TokenKindRBracket TokenKindLBrace @@ -166,6 +168,10 @@ func (tokenKind TokenKind) Describe () (description string) { description = "Elipsis" case TokenKindComma: description = "Comma" + case TokenKindLParen: + description = "LParen" + case TokenKindRParen: + description = "RParen" case TokenKindLBracket: description = "LBracket" case TokenKindRBracket: diff --git a/parser/enum.go b/parser/enum.go index 8c71e0c..92f01ec 100644 --- a/parser/enum.go +++ b/parser/enum.go @@ -73,9 +73,11 @@ func (parser *ParsingOperation) parseEnumMembers ( if err != nil { return } // parse default value - member.value, err = parser.parseArgument() - into.members = append(into.members, member) - if err != nil { return } + if !parser.token.Is(lexer.TokenKindNewline) { + member.value, err = parser.parseArgument() + into.members = append(into.members, member) + if err != nil { return } + } err = parser.expect(lexer.TokenKindNewline) if err != nil { return } diff --git a/parser/type-notation.go b/parser/type-notation.go index c28bbe7..e72ab20 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -69,4 +69,3 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { return } - diff --git a/tests/lexer/all.arf b/tests/lexer/all.arf index aeacf53..950ece0 100644 --- a/tests/lexer/all.arf +++ b/tests/lexer/all.arf @@ -1,3 +1,3 @@ :arf ---- rw -> -349820394 932748397 239485.37520 "hello world!\n" 'E' helloWorld:.,..[]{} +--- rw -> -349820394 932748397 239485.37520 "hello world!\n" 'E' helloWorld:.,..()[]{} + - ++ -- * / @ ! % %= ~ ~= = == != < <= << <<= > >= >> >>= | |= || & &= && ^ ^= From 1457067c553fab294555a50e2dc584aa932ca146 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 13 Sep 2022 18:16:18 -0400 Subject: [PATCH 11/46] Added method to parse --- parser/tree.go | 6 ++--- parser/type-notation.go | 50 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/parser/tree.go b/parser/tree.go index c4f30bb..8c422e4 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -127,11 +127,11 @@ const ( // {name 23} ArgumentKindSubscript - // .name value - // but like, a lot of them + // (.name ) + // (.name .name (.name ArgumentKindArrayDefaultValues // name.name diff --git a/parser/type-notation.go b/parser/type-notation.go index e72ab20..764137e 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -67,5 +67,55 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { if err != nil { return } } + // TODO: consider offloading array default values to argument parsing, and + // then just grabbing the next argument after this if it exists. that way + // we can have array litreals anywhere. + + // get default value + if parser.token.Is(lexer.TokenKindLessThan) { + what.defaultValue, err = parser.parseBasicDefaultValue() + if err != nil { return } + + } else if parser.token.Is(lexer.TokenKindLParen) { + // TODO: parse members and member default values + } + + return +} + +// parseBasicDefaultValue parses a default value of a non-object type. +func (parser *ParsingOperation) parseBasicDefaultValue () ( + value Argument, + err error, +) { + err = parser.expect(lexer.TokenKindLessThan) + if err != nil { return } + + var arguments []Argument + + defer func () { + // if we have multiple values, we need to return the full array + // instead. + if len(arguments) > 1 { + // FIXME: i think this is a sign that the tree needs + // cleaning up. + value.kind = ArgumentKindArrayDefaultValues + location := value.location + value.value = ArrayDefaultValues { + values: arguments, + } + value.location = location + } + } () + + for { + if parser.token.Is(lexer.TokenKindIndent) { continue } + if parser.token.Is(lexer.TokenKindNewline) { continue } + if parser.token.Is(lexer.TokenKindGreaterThan) { break } + + value, err = parser.parseArgument() + if err != nil { return } + arguments = append(arguments, value) + } return } From 98a5d5c25230000ca5632eccd6670ee7ffe59393 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 13 Sep 2022 20:45:21 -0400 Subject: [PATCH 12/46] Something --- parser/type-notation.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/parser/type-notation.go b/parser/type-notation.go index 764137e..35ef99d 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -90,6 +90,8 @@ func (parser *ParsingOperation) parseBasicDefaultValue () ( ) { err = parser.expect(lexer.TokenKindLessThan) if err != nil { return } + err = parser.nextToken() + if err != nil { return } var arguments []Argument @@ -119,3 +121,25 @@ func (parser *ParsingOperation) parseBasicDefaultValue () ( } return } + +// parseObjectDefaultValue parses default values and new members of an object +// type. +func (parser *ParsingOperation) parseObjectDefaultValue () ( + value Argument, + members []TypeMember, + err error, +) { + err = parser.expect(lexer.TokenKindLParen) + if err != nil { return } + parser.nextToken() + if err != nil { return } + + for { + err = parser.expect(lexer.TokenKindDot) + if err != nil { return } + parser.nextToken() + if err != nil { return } + } + + return +} From a9f8881eb47e33faa242b260aae52c438a4ef139 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 13 Sep 2022 20:45:59 -0400 Subject: [PATCH 13/46] oh my jod --- parser/type-notation.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/parser/type-notation.go b/parser/type-notation.go index 35ef99d..7cdfd08 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -137,8 +137,10 @@ func (parser *ParsingOperation) parseObjectDefaultValue () ( for { err = parser.expect(lexer.TokenKindDot) if err != nil { return } - parser.nextToken() + parser.nextToken(lexer.TokenKindName, lexer.TokenKindPermission) if err != nil { return } + + // TODO: if name, parse parent default. if permission, } return From 558542127d9ced42ce15dd0aa04395245e74725a Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Wed, 14 Sep 2022 15:16:56 -0400 Subject: [PATCH 14/46] Among impostor --- parser/tree.go | 12 +-- parser/type-notation.go | 165 ++++++++++++++++++++++++++++++------- tests/parser/data/main.arf | 34 ++++---- 3 files changed, 156 insertions(+), 55 deletions(-) diff --git a/parser/tree.go b/parser/tree.go index 8c422e4..e40cb5f 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -83,7 +83,7 @@ type Type struct { points *Type // if non-nil, this type defines new members. - members []TypeMember + members []TypeMember // the default value of the type. defaultValue Argument @@ -98,16 +98,10 @@ type Declaration struct { // ObjectDefaultValues represents a list of object member initialization // attributes. -type ObjectDefaultValues struct { - locatable - attributes map[string] Argument -} +type ObjectDefaultValues map[string] Argument // ArrayDefaultValues represents a list of elements initializing an array. -type ArrayDefaultValues struct { - locatable - values []Argument -} +type ArrayDefaultValues []Argument // ArgumentKind specifies the type of thing the value of an argument should be // cast to. diff --git a/parser/type-notation.go b/parser/type-notation.go index 7cdfd08..524c96d 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -42,7 +42,11 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { for { if !parser.token.Is(lexer.TokenKindColon) { break } - err = parser.nextToken(lexer.TokenKindName, lexer.TokenKindUInt) + err = parser.nextToken( + lexer.TokenKindName, + lexer.TokenKindUInt, + lexer.TokenKindLParen, + lexer.TokenKindLessThan) if err != nil { return } if parser.token.Is(lexer.TokenKindName) { @@ -58,28 +62,27 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { infoerr.ErrorKindError) return } - } else { + } else if parser.token.Is(lexer.TokenKindUInt) { // parse fixed array length what.length = parser.token.Value().(uint64) + + } else if parser.token.Is(lexer.TokenKindLessThan) { + // parse default value + what.defaultValue, err = parser.parseBasicDefaultValue() + if err != nil { return } + + } else if parser.token.Is(lexer.TokenKindLParen) { + // parse members and member default values + what.defaultValue, + what.members, + err = parser.parseObjectDefaultValueAndMembers() + if err != nil { return } } err = parser.nextToken() if err != nil { return } } - // TODO: consider offloading array default values to argument parsing, and - // then just grabbing the next argument after this if it exists. that way - // we can have array litreals anywhere. - - // get default value - if parser.token.Is(lexer.TokenKindLessThan) { - what.defaultValue, err = parser.parseBasicDefaultValue() - if err != nil { return } - - } else if parser.token.Is(lexer.TokenKindLParen) { - // TODO: parse members and member default values - } - return } @@ -88,25 +91,21 @@ func (parser *ParsingOperation) parseBasicDefaultValue () ( value Argument, err error, ) { + value.location = parser.token.Location() + err = parser.expect(lexer.TokenKindLessThan) if err != nil { return } err = parser.nextToken() if err != nil { return } - var arguments []Argument + var attributes []Argument defer func () { // if we have multiple values, we need to return the full array // instead. - if len(arguments) > 1 { - // FIXME: i think this is a sign that the tree needs - // cleaning up. + if len(attributes) > 1 { value.kind = ArgumentKindArrayDefaultValues - location := value.location - value.value = ArrayDefaultValues { - values: arguments, - } - value.location = location + value.value = ArrayDefaultValues(attributes) } } () @@ -117,31 +116,139 @@ func (parser *ParsingOperation) parseBasicDefaultValue () ( value, err = parser.parseArgument() if err != nil { return } - arguments = append(arguments, value) + attributes = append(attributes, value) } return } -// parseObjectDefaultValue parses default values and new members of an object -// type. -func (parser *ParsingOperation) parseObjectDefaultValue () ( +// parseObjectDefaultValueAndMembers parses default values and new members of an +// object type. +func (parser *ParsingOperation) parseObjectDefaultValueAndMembers () ( value Argument, members []TypeMember, err error, ) { + value.location = parser.token.Location() + err = parser.expect(lexer.TokenKindLParen) if err != nil { return } parser.nextToken() if err != nil { return } + var attributes ObjectDefaultValues + for { + if parser.token.Is(lexer.TokenKindIndent) { continue } + if parser.token.Is(lexer.TokenKindNewline) { continue } + if parser.token.Is(lexer.TokenKindRParen) { break } + err = parser.expect(lexer.TokenKindDot) if err != nil { return } parser.nextToken(lexer.TokenKindName, lexer.TokenKindPermission) if err != nil { return } - // TODO: if name, parse parent default. if permission, + if parser.token.Is(lexer.TokenKindName) { + // parsing a defalut value for an inherited member + var memberName string + var memberValue Argument + + memberName, + memberValue, err = parser.parseObjectMemberDefinition() + if err != nil { return } + + if value.kind == ArgumentKindNil { + // create default value map if it doesn't + // already exist + value.kind = ArgumentKindObjectDefaultValues + attributes = make(ObjectDefaultValues) + value.value = attributes + } + + // TODO: error on duplicate + if memberValue.kind != ArgumentKindNil { + attributes[memberName] = memberValue + } + + } else if parser.token.Is(lexer.TokenKindPermission) { + // parsing a member declaration + var member TypeMember + member, + err = parser.parseObjectMemberDeclaration() + + members = append(members, member) + } } return } + +// parseObjectDefaultValue parses member default values only, and will throw an +// error when it encounteres a new member definition. +func (parser *ParsingOperation) parseObjectDefaultValue () ( + value Argument, + err error, +) { + value.location = parser.token.Location() + + err = parser.expect(lexer.TokenKindLParen) + if err != nil { return } + parser.nextToken() + if err != nil { return } + + var attributes ObjectDefaultValues + + for { + if parser.token.Is(lexer.TokenKindIndent) { continue } + if parser.token.Is(lexer.TokenKindNewline) { continue } + if parser.token.Is(lexer.TokenKindRParen) { break } + + err = parser.expect(lexer.TokenKindDot) + if err != nil { return } + parser.nextToken(lexer.TokenKindName) + if err != nil { return } + + if value.kind == ArgumentKindNil { + value.kind = ArgumentKindObjectDefaultValues + attributes = make(ObjectDefaultValues) + value.value = attributes + } + + var memberName string + var memberValue Argument + memberName, + memberValue, err = parser.parseObjectMemberDefinition() + + attributes[memberName] = memberValue + } + + return +} + +// .ro name:Type:qualifier: + +// parseObjectMemberDeclaration parses a new default value for an inherited +// member. +func (parser *ParsingOperation) parseObjectMemberDefinition () ( + name string, + value Argument, + err error, +) { + err = parser.expect(lexer.TokenKindName) + if err != nil { return } + + return +} + +// .name: + +// parseObjectMemberDeclaration parses an object member declaration, and its +// default value if it exists. +func (parser *ParsingOperation) parseObjectMemberDeclaration () ( + member TypeMember, + err error, +) { + err = parser.expect(lexer.TokenKindPermission) + if err != nil { return } + + return +} diff --git a/tests/parser/data/main.arf b/tests/parser/data/main.arf index 81fb5d2..98dfbc3 100644 --- a/tests/parser/data/main.arf +++ b/tests/parser/data/main.arf @@ -1,9 +1,9 @@ :arf --- -data ro aInteger:Int 3202 +data ro aInteger:Int:<3202> -data ro bMutInteger:Int:mut 3202 +data ro bMutInteger:Int:mut:<3202> data ro cIntegerPointer:{Int} @@ -13,35 +13,35 @@ data ro eIntegerArray16:Int:16 data ro fIntegerArrayVariable:{Int ..} -data ro gIntegerArrayInitialized:Int:16 +data ro gIntegerArrayInitialized:Int:16:< 3948 293 293049 948 912 340 0 2304 0 4785 92 + > # TODO: reinstate these two after phrase parsing is implemented # data wr hIntegerPointerInit:{Int} [& integer] # data wr iMutIntegerPointerInit:{Int}:mut [& integer] -# TODO: maybe test identifiers somewhere else? -data ro jObject:thing.Thing. - thing.thing - -- this 324 - -- that 2139 +data ro jObject:Obj:( + .this:<324> + .that:<324>) -data ro kNestedObject:Obj - -- this - -- bird0 324 - -- bird1 "hello world" - ro newMember:Int 9023 - -- that - -- bird2 123.8439 - -- bird3 9328.21348239 +data ro kNestedObject:Obj:( + .this:( + .bird0:<324> + .bird1:<"hello world">) + .ro newMember:Int:<9023> + .that:( + .bird2:<123.8439> + .bird3:<9328.21348239>)) data ro lMutIntegerArray16:Int:16:mut data ro mExternalData:Int:8 external -data ro nIntegerArrayInitialized:Int:16:mut +data ro nIntegerArrayInitialized:Int:16:mut:< 3948 293 293049 948 912 340 0 2304 0 4785 92 + > From ce5394af11c202643862bef4603ba3ed554d9bef Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 15 Sep 2022 13:04:31 -0400 Subject: [PATCH 15/46] ok now i havet to go harvest potatoes --- parser/type-notation.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/parser/type-notation.go b/parser/type-notation.go index 524c96d..0ec079c 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -233,8 +233,19 @@ func (parser *ParsingOperation) parseObjectMemberDefinition () ( value Argument, err error, ) { + // get the name of the inherited member err = parser.expect(lexer.TokenKindName) if err != nil { return } + name = parser.token.Value().(string) + + // we require a default value, or else why would this structure even be + // present? + err = parser.nextToken(lexer.TokenKindColon) + if err != nil { return } + err = parser.nextToken(lexer.TokenKindLParen, lexer.TokenKindLessThan) + if err != nil { return } + + // TODO: parse default value return } From fe57f5e0ee56a23fb5eb133969d5625937ebd417 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 15 Sep 2022 14:03:32 -0400 Subject: [PATCH 16/46] Implemented parseObjectMemberDefinition fully --- parser/type-notation.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/parser/type-notation.go b/parser/type-notation.go index 0ec079c..372fea1 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -226,7 +226,7 @@ func (parser *ParsingOperation) parseObjectDefaultValue () ( // .ro name:Type:qualifier: -// parseObjectMemberDeclaration parses a new default value for an inherited +// parseObjectMemberDefinition parses a new default value for an inherited // member. func (parser *ParsingOperation) parseObjectMemberDefinition () ( name string, @@ -245,7 +245,16 @@ func (parser *ParsingOperation) parseObjectMemberDefinition () ( err = parser.nextToken(lexer.TokenKindLParen, lexer.TokenKindLessThan) if err != nil { return } - // TODO: parse default value + if parser.token.Is(lexer.TokenKindLessThan) { + // parse default value + value, err = parser.parseBasicDefaultValue() + if err != nil { return } + + } else if parser.token.Is(lexer.TokenKindLParen) { + // parse member default values + value, err = parser.parseObjectDefaultValue() + if err != nil { return } + } return } From 28312f1c7fe3a4cb9131b4ad3812911fec2e7b78 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 15 Sep 2022 14:54:13 -0400 Subject: [PATCH 17/46] Implemented parseObjectNewMember --- parser/type-notation.go | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/parser/type-notation.go b/parser/type-notation.go index 372fea1..1b8e5aa 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -2,6 +2,7 @@ package parser import "git.tebibyte.media/arf/arf/lexer" import "git.tebibyte.media/arf/arf/infoerr" +import "git.tebibyte.media/arf/arf/types" // parseType parses a type notation of the form Name, {Name}, etc. func (parser *ParsingOperation) parseType () (what Type, err error) { @@ -153,7 +154,7 @@ func (parser *ParsingOperation) parseObjectDefaultValueAndMembers () ( var memberValue Argument memberName, - memberValue, err = parser.parseObjectMemberDefinition() + memberValue, err = parser.parseObjectInheritedMember() if err != nil { return } if value.kind == ArgumentKindNil { @@ -173,8 +174,9 @@ func (parser *ParsingOperation) parseObjectDefaultValueAndMembers () ( // parsing a member declaration var member TypeMember member, - err = parser.parseObjectMemberDeclaration() + err = parser.parseObjectNewMember() + // TODO: error on duplicate members = append(members, member) } } @@ -216,7 +218,7 @@ func (parser *ParsingOperation) parseObjectDefaultValue () ( var memberName string var memberValue Argument memberName, - memberValue, err = parser.parseObjectMemberDefinition() + memberValue, err = parser.parseObjectInheritedMember() attributes[memberName] = memberValue } @@ -224,22 +226,22 @@ func (parser *ParsingOperation) parseObjectDefaultValue () ( return } -// .ro name:Type:qualifier: +// .name: -// parseObjectMemberDefinition parses a new default value for an inherited +// parseObjectInheritedMember parses a new default value for an inherited // member. -func (parser *ParsingOperation) parseObjectMemberDefinition () ( +func (parser *ParsingOperation) parseObjectInheritedMember () ( name string, value Argument, err error, ) { // get the name of the inherited member err = parser.expect(lexer.TokenKindName) + value.location = parser.token.Location() if err != nil { return } name = parser.token.Value().(string) - // we require a default value, or else why would this structure even be - // present? + // we require a default value to be present err = parser.nextToken(lexer.TokenKindColon) if err != nil { return } err = parser.nextToken(lexer.TokenKindLParen, lexer.TokenKindLessThan) @@ -259,15 +261,29 @@ func (parser *ParsingOperation) parseObjectMemberDefinition () ( return } -// .name: +// .ro name:Type:qualifier: -// parseObjectMemberDeclaration parses an object member declaration, and its +// parseObjectNewMember parses an object member declaration, and its // default value if it exists. -func (parser *ParsingOperation) parseObjectMemberDeclaration () ( +func (parser *ParsingOperation) parseObjectNewMember () ( member TypeMember, err error, ) { + // get member permission err = parser.expect(lexer.TokenKindPermission) + member.location = parser.token.Location() + if err != nil { return } + member.permission = parser.token.Value().(types.Permission) + + // get member 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 } + member.what, err = parser.parseType() if err != nil { return } return From 6e7a38a7a98d575f2688beeaad6477b70fe84f54 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 15 Sep 2022 14:55:41 -0400 Subject: [PATCH 18/46] Removed unneeded accessors for complex default value maps --- parser/accessors.go | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/parser/accessors.go b/parser/accessors.go index 2222efa..d92de35 100644 --- a/parser/accessors.go +++ b/parser/accessors.go @@ -125,26 +125,6 @@ func (member TypeMember) BitWidth () (width uint64) { return } -// Values returns an iterator for the initialization values. -func (values ObjectDefaultValues) Sections () ( - iterator types.Iterator[Argument], -) { - iterator = types.NewIterator(values.attributes) - return -} - -// Length returns the amount of values. -func (values ArrayDefaultValues) Length () (length int) { - length = len(values.values) - return -} - -// Item returns the value at index. -func (values ArrayDefaultValues) Value (index int) (value Argument) { - value = values.values[index] - return -} - // Kind returns what kind of argument it is. func (argument Argument) Kind () (kind ArgumentKind) { kind = argument.kind From df1636e8fad5e1d25588636321b218aeb9b5fa30 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 15 Sep 2022 14:58:50 -0400 Subject: [PATCH 19/46] tree-tostring.go compiles --- parser/tree-tostring.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 6fa93b9..63e20a0 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -103,8 +103,8 @@ func (attributes ObjectDefaultValues) ToString ( ) ( output string, ) { - for _, name := range sortMapKeysAlphabetically(attributes.attributes) { - value := attributes.attributes[name] + for _, name := range sortMapKeysAlphabetically(attributes) { + value := attributes[name] output += doIndent(indent, ".", name) if value.kind == ArgumentKindObjectDefaultValues { @@ -123,7 +123,7 @@ func (values ArrayDefaultValues) ToString ( ) ( output string, ) { - for _, value := range values.values { + for _, value := range values { output += value.ToString(indent, true) } From eaeba12fbec11069adee6a610d963d510eb9d527 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 15 Sep 2022 15:10:52 -0400 Subject: [PATCH 20/46] Removed old things from tree-tostring.go --- parser/data_test.go | 56 +++++++++++++------------------------- parser/tree-tostring.go | 43 ++--------------------------- tests/parser/data/main.arf | 6 ++-- 3 files changed, 24 insertions(+), 81 deletions(-) diff --git a/parser/data_test.go b/parser/data_test.go index 12b8793..964f2d6 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -6,49 +6,31 @@ func TestData (test *testing.T) { checkTree ("../tests/parser/data", false, `:arf --- -data ro aInteger:Int 3202 -data ro bMutInteger:Int:mut 3202 +data ro aInteger:Int:<3202> +data ro bMutInteger:Int:mut:<3202> data ro cIntegerPointer:{Int} data ro dMutIntegerPointer:{Int}:mut data ro eIntegerArray16:Int:16 data ro fIntegerArrayVariable:{Int ..} -data ro gIntegerArrayInitialized:Int:16 - 3948 - 293 - 293049 - 948 - 912 - 340 - 0 - 2304 - 0 - 4785 - 92 -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 - -- this - -- bird0 324 - -- bird1 "hello world" +data ro gIntegerArrayInitialized:Int:16:< + 3948 293 293049 948 912 + 340 0 2304 0 4785 92> +data ro jObject:Obj:( + .this:<324> + .that:<324>) +data ro kNestedObject:Obj:( + .ro newMember:Int:<9023> + .this:( + .bird0:<324> + .bird1:<"hello world">) + .that:( + .bird2:<123.8439> + .bird3:<9328.21348239>)) data ro lMutIntegerArray16: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 +data ro nIntegerArrayInitialized:Int:16:mut:< + 3948 293 293049 948 912 + 340 0 2304 0 4785 92> `, test) } diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 63e20a0..a0e96e1 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -98,38 +98,6 @@ func (declaration Declaration) ToString () (output string) { return } -func (attributes ObjectDefaultValues) ToString ( - indent int, -) ( - output string, -) { - for _, name := range sortMapKeysAlphabetically(attributes) { - value := attributes[name] - - output += doIndent(indent, ".", name) - if value.kind == ArgumentKindObjectDefaultValues { - output += "\n" - output += value.ToString(indent + 1, true) - } else { - output += " " + value.ToString(0, false) + "\n" - } - } - - return -} - -func (values ArrayDefaultValues) ToString ( - indent int, -) ( - output string, -) { - for _, value := range values { - output += value.ToString(indent, true) - } - - return -} - func (argument Argument) ToString (indent int, breakLine bool) (output string) { if !breakLine { indent = 0 } if argument.kind == ArgumentKindNil { @@ -144,15 +112,8 @@ func (argument Argument) ToString (indent int, breakLine bool) (output string) { indent, breakLine) - case ArgumentKindObjectDefaultValues: - // this should only appear in contexts where breakLine is true - output += argument.value.(ObjectDefaultValues). - ToString(indent) - - case ArgumentKindArrayDefaultValues: - // this should only appear in contexts where breakLine is true - output += argument.value.(ArrayDefaultValues). - ToString(indent) + case ArgumentKindArrayDefaultValues, ArgumentKindObjectDefaultValues: + output += "DEFAULT VALUES IN WRONG PLACE" case ArgumentKindIdentifier: output += doIndent ( diff --git a/tests/parser/data/main.arf b/tests/parser/data/main.arf index 98dfbc3..713a463 100644 --- a/tests/parser/data/main.arf +++ b/tests/parser/data/main.arf @@ -18,10 +18,10 @@ data ro gIntegerArrayInitialized:Int:16:< 340 0 2304 0 4785 92 > -# TODO: reinstate these two after phrase parsing is implemented -# data wr hIntegerPointerInit:{Int} [& integer] +# TODO: reinstate these two +# data wr hIntegerPointerInit:{Int}:<[& integer]> -# data wr iMutIntegerPointerInit:{Int}:mut [& integer] +# data wr iMutIntegerPointerInit:{Int}:mut:<[& integer]> data ro jObject:Obj:( .this:<324> From 319b60bfcd1e2258e2ebc44970091b7745a40135 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 15 Sep 2022 22:43:02 -0400 Subject: [PATCH 21/46] not tryna work on this on my laptop rn --- parser/data_test.go | 56 +++++++++++++++++++++++-------- parser/tree-tostring.go | 74 +++++++++++++++++++++++++++++++---------- parser/type-notation.go | 2 ++ 3 files changed, 102 insertions(+), 30 deletions(-) diff --git a/parser/data_test.go b/parser/data_test.go index 964f2d6..9bcb0ee 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -12,25 +12,55 @@ data ro cIntegerPointer:{Int} data ro dMutIntegerPointer:{Int}:mut data ro eIntegerArray16:Int:16 data ro fIntegerArrayVariable:{Int ..} -data ro gIntegerArrayInitialized:Int:16:< - 3948 293 293049 948 912 - 340 0 2304 0 4785 92> -data ro jObject:Obj:( +data ro gIntegerArrayInitialized:Int:16: + < + 3948 + 293 + 293049 + 948 + 912 + 340 + 0 + 2304 + 0 + 4785 + 92 + > +data ro jObject:Obj: + ( .this:<324> - .that:<324>) -data ro kNestedObject:Obj:( + .that:<324> + ) +data ro kNestedObject:Obj: + ( .ro newMember:Int:<9023> - .this:( + .this: + ( .bird0:<324> - .bird1:<"hello world">) - .that:( + .bird1:<"hello world"> + ) + .that: + ( .bird2:<123.8439> - .bird3:<9328.21348239>)) + .bird3:<9328.21348239> + ) + ) data ro lMutIntegerArray16: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> +data ro nIntegerArrayInitialized:Int:16:mut: + < + 3948 + 293 + 293049 + 948 + 912 + 340 + 0 + 2304 + 0 + 4785 + 92 + > `, test) } diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index a0e96e1..2b14391 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -66,12 +66,22 @@ func (identifier Identifier) ToString () (output string) { return } -func (what Type) ToString () (output string) { +func (values ObjectDefaultValues) ToString (indent int) (output string) { + + return +} + +func (values ArrayDefaultValues) ToString (indent int) (output string) { + + return +} + +func (what Type) ToString (indent int) (output string) { if what.kind == TypeKindBasic { output += what.name.ToString() } else { output += "{" - output += what.points.ToString() + output += what.points.ToString(indent) if what.kind == TypeKindVariableArray { output += " .." @@ -88,13 +98,38 @@ func (what Type) ToString () (output string) { output += ":mut" } - // TODO: print out default value + if what.members != nil { + output += ":(" + for _, member := range what.members { + output += doIndent ( + indent, + "\n" + member.ToString(indent + 1)) + } + output += ")" + } + + defaultValueKind := what.defaultValue.kind + if defaultValueKind != ArgumentKindNil { + isComplexDefaultValue := + defaultValueKind == ArgumentKindObjectDefaultValues || + defaultValueKind == ArgumentKindArrayDefaultValues + + if isComplexDefaultValue { + output += ":\n" + output += what.defaultValue.ToString(indent, true) + } + } + + if what.defaultValue.kind == ArgumentKindObjectDefaultValues { + } else if what.defaultValue.kind != ArgumentKindNil { + output += ":<" + what.defaultValue.ToString(indent, true) + ">" + } return } -func (declaration Declaration) ToString () (output string) { +func (declaration Declaration) ToString (indent int) (output string) { output += declaration.name + ":" - output += declaration.what.ToString() + output += declaration.what.ToString(indent) return } @@ -112,8 +147,13 @@ func (argument Argument) ToString (indent int, breakLine bool) (output string) { indent, breakLine) - case ArgumentKindArrayDefaultValues, ArgumentKindObjectDefaultValues: - output += "DEFAULT VALUES IN WRONG PLACE" + case ArgumentKindObjectDefaultValues: + output += argument.value.(ObjectDefaultValues). + ToString(indent) + + case ArgumentKindArrayDefaultValues: + output += argument.value.(ArrayDefaultValues). + ToString(indent) case ArgumentKindIdentifier: output += doIndent ( @@ -124,7 +164,7 @@ func (argument Argument) ToString (indent int, breakLine bool) (output string) { case ArgumentKindDeclaration: output += doIndent ( indent, - argument.value.(Declaration).ToString()) + argument.value.(Declaration).ToString(indent)) if breakLine { output += "\n" } case ArgumentKindInt, ArgumentKindUInt, ArgumentKindFloat: @@ -222,7 +262,7 @@ func (section DataSection) ToString (indent int) (output string) { "type ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString(), "\n") + section.what.ToString(indent), "\n") return } @@ -231,7 +271,7 @@ func (member TypeMember) ToString (indent int) (output string) { output += member.permission.ToString() + " " output += member.name + ":" - output += member.what.ToString() + output += member.what.ToString(indent) if member.bitWidth > 0 { output += fmt.Sprint(" & ", member.bitWidth) @@ -248,7 +288,7 @@ func (section TypeSection) ToString (indent int) (output string) { "type ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString(), "\n") + section.what.ToString(indent), "\n") return } @@ -259,7 +299,7 @@ func (section EnumSection) ToString (indent int) (output string) { "enum ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString(), "\n") + section.what.ToString(indent), "\n") for _, member := range section.members { output += doIndent(indent + 1, member.name) @@ -300,11 +340,11 @@ func (behavior FaceBehavior) ToString (indent int) (output string) { output += doIndent(indent, behavior.name, "\n") for _, inputItem := range behavior.inputs { - output += doIndent(indent + 1, "> ", inputItem.ToString(), "\n") + output += doIndent(indent + 1, "> ", inputItem.ToString(indent), "\n") } for _, outputItem := range behavior.outputs { - output += doIndent(indent + 1, "< ", outputItem.ToString(), "\n") + output += doIndent(indent + 1, "< ", outputItem.ToString(indent), "\n") } return @@ -368,7 +408,7 @@ func (block Block) ToString (indent int) (output string) { func (funcOutput FuncOutput) ToString (indent int) (output string) { output += doIndent ( indent + 1, - "< ", funcOutput.Declaration.ToString(), "\n") + "< ", funcOutput.Declaration.ToString(indent), "\n") return } @@ -382,11 +422,11 @@ func (section FuncSection) ToString (indent int) (output string) { if section.receiver != nil { output += doIndent ( indent + 1, - "@ ", section.receiver.ToString(), "\n") + "@ ", section.receiver.ToString(indent), "\n") } for _, inputItem := range section.inputs { - output += doIndent(indent + 1, "> ", inputItem.ToString(), "\n") + output += doIndent(indent + 1, "> ", inputItem.ToString(indent), "\n") } for _, outputItem := range section.outputs { diff --git a/parser/type-notation.go b/parser/type-notation.go index 1b8e5aa..f12bf96 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -285,6 +285,8 @@ func (parser *ParsingOperation) parseObjectNewMember () ( if err != nil { return } member.what, err = parser.parseType() if err != nil { return } + + // TODO: get bit width return } From 2111960f6d0f443b62ad6e897f818820b8149d3a Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 12:00:16 -0400 Subject: [PATCH 22/46] ToString for type notation might be done now? --- parser/tree-tostring.go | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 2b14391..497272e 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -67,12 +67,22 @@ func (identifier Identifier) ToString () (output string) { } func (values ObjectDefaultValues) ToString (indent int) (output string) { - + output += doIndent(indent, "(\n") + for name, value := range values { + output += doIndent ( + indent, + name + ":" + value.ToString(indent, true)) + } + output += doIndent(indent, ")\n") return } func (values ArrayDefaultValues) ToString (indent int) (output string) { - + output += doIndent(indent, "<\n") + for _, value := range values { + output += doIndent(indent, value.ToString(indent, true)) + } + output += doIndent(indent, ">\n") return } @@ -99,13 +109,12 @@ func (what Type) ToString (indent int) (output string) { } if what.members != nil { - output += ":(" + output += ":\n" + doIndent(indent, "(\n") for _, member := range what.members { output += doIndent ( - indent, - "\n" + member.ToString(indent + 1)) + indent, member.ToString(indent + 1), "\n") } - output += ")" + output += doIndent(indent, ")") } defaultValueKind := what.defaultValue.kind @@ -117,13 +126,12 @@ func (what Type) ToString (indent int) (output string) { if isComplexDefaultValue { output += ":\n" output += what.defaultValue.ToString(indent, true) + } else { + output += ":<" + output += what.defaultValue.ToString(indent, true) + output += ">\n" } } - - if what.defaultValue.kind == ArgumentKindObjectDefaultValues { - } else if what.defaultValue.kind != ArgumentKindNil { - output += ":<" + what.defaultValue.ToString(indent, true) + ">" - } return } @@ -150,10 +158,12 @@ func (argument Argument) ToString (indent int, breakLine bool) (output string) { case ArgumentKindObjectDefaultValues: output += argument.value.(ObjectDefaultValues). ToString(indent) + if breakLine { output += "\n" } case ArgumentKindArrayDefaultValues: output += argument.value.(ArrayDefaultValues). ToString(indent) + if breakLine { output += "\n" } case ArgumentKindIdentifier: output += doIndent ( From 5b627f8995411d7a865c1817c68efea11fccb678 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 12:16:23 -0400 Subject: [PATCH 23/46] wow it hangs --- parser/data.go | 28 ++++++++++++++++++++-------- parser/tree-tostring.go | 4 ++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/parser/data.go b/parser/data.go index 22fcdfb..313a909 100644 --- a/parser/data.go +++ b/parser/data.go @@ -35,16 +35,28 @@ func (parser *ParsingOperation) parseDataSection () ( return } - // check if data is external - if parser.token.Is(lexer.TokenKindName) && - parser.token.Value().(string) == "external" { + err = parser.expect(lexer.TokenKindNewline) + if err != nil { return } + err = parser.nextToken() + if err != nil { return } - section.external = true - err = parser.nextToken(lexer.TokenKindNewline) + // check if data is external + if parser.token.Is(lexer.TokenKindIndent) && + parser.token.Value().(int) == 1 { + + err = parser.nextToken(lexer.TokenKindName) if err != nil { return } - err = parser.nextToken() - if err != nil { return } - return + if 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 + } + + parser.previousToken() } return } diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 497272e..07e19b7 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -128,7 +128,7 @@ func (what Type) ToString (indent int) (output string) { output += what.defaultValue.ToString(indent, true) } else { output += ":<" - output += what.defaultValue.ToString(indent, true) + output += what.defaultValue.ToString(indent, false) output += ">\n" } } @@ -269,7 +269,7 @@ func (argument Argument) ToString (indent int, breakLine bool) (output string) { func (section DataSection) ToString (indent int) (output string) { output += doIndent ( indent, - "type ", + "data ", section.permission.ToString(), " ", section.name, ":", section.what.ToString(indent), "\n") From 925f55788f538820c57bf5936952ee813a1bba20 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 12:27:13 -0400 Subject: [PATCH 24/46] Fixed the hanging thing --- parser/parser.go | 18 ++++++++++++++++++ parser/type-notation.go | 12 ++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index 2520af9..b64f89c 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -166,3 +166,21 @@ func (parser *ParsingOperation) skipIndentLevel (indent int) (err error) { if err != nil { return } } } + +// skipWhitespace skips over newlines and indent tokens. +func (parser *ParsingOperation) skipWhitespace () (err error) { + for { + isWhitespace := + parser.token.Is(lexer.TokenKindIndent) || + parser.token.Is(lexer.TokenKindNewline) + + if !isWhitespace { + break + } + + err = parser.nextToken() + if err != nil { return } + } + + return +} diff --git a/parser/type-notation.go b/parser/type-notation.go index f12bf96..2788a73 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -111,8 +111,8 @@ func (parser *ParsingOperation) parseBasicDefaultValue () ( } () for { - if parser.token.Is(lexer.TokenKindIndent) { continue } - if parser.token.Is(lexer.TokenKindNewline) { continue } + err = parser.skipWhitespace() + if err != nil { return } if parser.token.Is(lexer.TokenKindGreaterThan) { break } value, err = parser.parseArgument() @@ -139,8 +139,8 @@ func (parser *ParsingOperation) parseObjectDefaultValueAndMembers () ( var attributes ObjectDefaultValues for { - if parser.token.Is(lexer.TokenKindIndent) { continue } - if parser.token.Is(lexer.TokenKindNewline) { continue } + err = parser.skipWhitespace() + if err != nil { return } if parser.token.Is(lexer.TokenKindRParen) { break } err = parser.expect(lexer.TokenKindDot) @@ -200,8 +200,8 @@ func (parser *ParsingOperation) parseObjectDefaultValue () ( var attributes ObjectDefaultValues for { - if parser.token.Is(lexer.TokenKindIndent) { continue } - if parser.token.Is(lexer.TokenKindNewline) { continue } + err = parser.skipWhitespace() + if err != nil { return } if parser.token.Is(lexer.TokenKindRParen) { break } err = parser.expect(lexer.TokenKindDot) From a6af1d512170d438c11b91997247fc952f7fc9b3 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 18:16:51 -0400 Subject: [PATCH 25/46] Made ToString for type notations actually work properly --- parser/tree-tostring.go | 49 ++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 07e19b7..1e76fe1 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -66,32 +66,43 @@ func (identifier Identifier) ToString () (output string) { return } -func (values ObjectDefaultValues) ToString (indent int) (output string) { +func (values ObjectDefaultValues) ToString ( + indent int, + breakLine bool, +) ( + output string, +) { output += doIndent(indent, "(\n") for name, value := range values { output += doIndent ( indent, - name + ":" + value.ToString(indent, true)) + name + ":" + value.ToString(indent, false)) + output += "\n" } - output += doIndent(indent, ")\n") + output += doIndent(indent, ")") return } -func (values ArrayDefaultValues) ToString (indent int) (output string) { +func (values ArrayDefaultValues) ToString ( + indent int, + breakLine bool, +) ( + output string, +) { output += doIndent(indent, "<\n") for _, value := range values { - output += doIndent(indent, value.ToString(indent, true)) + output += value.ToString(indent, breakLine) } - output += doIndent(indent, ">\n") + output += doIndent(indent, ">") return } -func (what Type) ToString (indent int) (output string) { +func (what Type) ToString (indent int, breakLine bool) (output string) { if what.kind == TypeKindBasic { output += what.name.ToString() } else { output += "{" - output += what.points.ToString(indent) + output += what.points.ToString(indent, breakLine) if what.kind == TypeKindVariableArray { output += " .." @@ -123,13 +134,13 @@ func (what Type) ToString (indent int) (output string) { defaultValueKind == ArgumentKindObjectDefaultValues || defaultValueKind == ArgumentKindArrayDefaultValues - if isComplexDefaultValue { + if isComplexDefaultValue && breakLine{ output += ":\n" - output += what.defaultValue.ToString(indent, true) + output += what.defaultValue.ToString(indent + 1, breakLine) } else { output += ":<" output += what.defaultValue.ToString(indent, false) - output += ">\n" + output += ">" } } return @@ -137,7 +148,7 @@ func (what Type) ToString (indent int) (output string) { func (declaration Declaration) ToString (indent int) (output string) { output += declaration.name + ":" - output += declaration.what.ToString(indent) + output += declaration.what.ToString(indent, false) return } @@ -157,13 +168,11 @@ func (argument Argument) ToString (indent int, breakLine bool) (output string) { case ArgumentKindObjectDefaultValues: output += argument.value.(ObjectDefaultValues). - ToString(indent) - if breakLine { output += "\n" } + ToString(indent, breakLine) case ArgumentKindArrayDefaultValues: output += argument.value.(ArrayDefaultValues). - ToString(indent) - if breakLine { output += "\n" } + ToString(indent, breakLine) case ArgumentKindIdentifier: output += doIndent ( @@ -272,7 +281,7 @@ func (section DataSection) ToString (indent int) (output string) { "data ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString(indent), "\n") + section.what.ToString(indent, true), "\n") return } @@ -281,7 +290,7 @@ func (member TypeMember) ToString (indent int) (output string) { output += member.permission.ToString() + " " output += member.name + ":" - output += member.what.ToString(indent) + output += member.what.ToString(indent, true) if member.bitWidth > 0 { output += fmt.Sprint(" & ", member.bitWidth) @@ -298,7 +307,7 @@ func (section TypeSection) ToString (indent int) (output string) { "type ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString(indent), "\n") + section.what.ToString(indent, true), "\n") return } @@ -309,7 +318,7 @@ func (section EnumSection) ToString (indent int) (output string) { "enum ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString(indent), "\n") + section.what.ToString(indent, true), "\n") for _, member := range section.members { output += doIndent(indent + 1, member.name) From ff04433ad5521ea4ad263e9cd0804be24ba180bb Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 18:27:26 -0400 Subject: [PATCH 26/46] The parser now steps past > --- parser/data_test.go | 1 + parser/type-notation.go | 3 +++ 2 files changed, 4 insertions(+) diff --git a/parser/data_test.go b/parser/data_test.go index 9bcb0ee..7101357 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -34,6 +34,7 @@ data ro jObject:Obj: data ro kNestedObject:Obj: ( .ro newMember:Int:<9023> + ) .this: ( .bird0:<324> diff --git a/parser/type-notation.go b/parser/type-notation.go index 2788a73..ce87672 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -257,6 +257,9 @@ func (parser *ParsingOperation) parseObjectInheritedMember () ( value, err = parser.parseObjectDefaultValue() if err != nil { return } } + + err = parser.nextToken() + if err != nil { return } return } From f2f6e2f3d3c7d38cd8404b641dd9fad05674b121 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 18:29:39 -0400 Subject: [PATCH 27/46] Whole Freaking Thing parses --- parser/type-notation.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/parser/type-notation.go b/parser/type-notation.go index ce87672..69f7e5c 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -286,6 +286,8 @@ func (parser *ParsingOperation) parseObjectNewMember () ( // get type err = parser.nextToken(lexer.TokenKindColon) if err != nil { return } + err = parser.nextToken(lexer.TokenKindName, lexer.TokenKindLBrace) + if err != nil { return } member.what, err = parser.parseType() if err != nil { return } From e123e973575607cded8ca6442efb896ba9b3f217 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 22:22:07 -0400 Subject: [PATCH 28/46] Type attributes can have whitespace before them By type attributes I mean things like :mut :N :. After the colon and before the attribute, whitespace is now permitted. This makes syntax like data ro nIntegerArrayInitialized:Int:16:mut: <3948 293 293049 948 912 340 0 2304 0 4785 92> possible. --- parser/type-notation.go | 7 ++++++- tests/parser/data/main.arf | 7 +++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/parser/type-notation.go b/parser/type-notation.go index 69f7e5c..e13fb73 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -42,8 +42,13 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { for { if !parser.token.Is(lexer.TokenKindColon) { break } + + err = parser.nextToken() + if err != nil { return } + err = parser.skipWhitespace() + if err != nil { return } - err = parser.nextToken( + err = parser.expect( lexer.TokenKindName, lexer.TokenKindUInt, lexer.TokenKindLParen, diff --git a/tests/parser/data/main.arf b/tests/parser/data/main.arf index 713a463..6eaf69f 100644 --- a/tests/parser/data/main.arf +++ b/tests/parser/data/main.arf @@ -41,7 +41,6 @@ data ro lMutIntegerArray16: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 - > +data ro nIntegerArrayInitialized:Int:16:mut: + <3948 293 293049 948 912 + 340 0 2304 0 4785 92> From aff5b1749c08cf260e844dd2d1a56071db0c3c31 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 22:35:55 -0400 Subject: [PATCH 29/46] Various ToString fixes --- parser/data_test.go | 15 ++--- parser/tree-tostring.go | 123 ++++++++++++++++++++++------------------ 2 files changed, 75 insertions(+), 63 deletions(-) diff --git a/parser/data_test.go b/parser/data_test.go index 7101357..aa64558 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -28,23 +28,24 @@ data ro gIntegerArrayInitialized:Int:16: > data ro jObject:Obj: ( - .this:<324> .that:<324> + .this:<324> ) data ro kNestedObject:Obj: ( .ro newMember:Int:<9023> - ) - .this: - ( - .bird0:<324> - .bird1:<"hello world"> - ) + ): + ( .that: ( .bird2:<123.8439> .bird3:<9328.21348239> ) + .this: + ( + .bird0:<324> + .bird1:<"hello world"> + ) ) data ro lMutIntegerArray16:Int:16:mut data ro mExternalData:Int:8 diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 1e76fe1..023289c 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -72,12 +72,28 @@ func (values ObjectDefaultValues) ToString ( ) ( output string, ) { - output += doIndent(indent, "(\n") - for name, value := range values { - output += doIndent ( - indent, - name + ":" + value.ToString(indent, false)) - output += "\n" + if !breakLine { indent = 0 } + output += doIndent(indent, "(") + if breakLine { output += "\n" } + + for _, name := range sortMapKeysAlphabetically(values) { + value := values[name] + + output += doIndent(indent, "." + name + ":") + + isComplexDefaultValue := + value.kind == ArgumentKindObjectDefaultValues || + value.kind == ArgumentKindArrayDefaultValues + + if isComplexDefaultValue { + if breakLine { output += "\n" } + output += value.ToString(indent + 1, breakLine) + } else { + output += "<" + output += value.ToString(indent + 1, false) + output += ">" + } + if breakLine { output += "\n" } } output += doIndent(indent, ")") return @@ -89,14 +105,36 @@ func (values ArrayDefaultValues) ToString ( ) ( output string, ) { - output += doIndent(indent, "<\n") + if !breakLine { indent = 0 } + output += doIndent(indent, "<") + if breakLine { output += "\n" } + for _, value := range values { output += value.ToString(indent, breakLine) } + output += doIndent(indent, ">") return } +func (member TypeMember) ToString (indent int, breakLine bool) (output string) { + output += doIndent(indent, ".") + + output += member.permission.ToString() + " " + output += member.name + ":" + output += member.what.ToString(indent, breakLine) + + if member.bitWidth > 0 { + output += fmt.Sprint(" & ", member.bitWidth) + } + + if breakLine { + output += "\n" + } + + return +} + func (what Type) ToString (indent int, breakLine bool) (output string) { if what.kind == TypeKindBasic { output += what.name.ToString() @@ -120,12 +158,20 @@ func (what Type) ToString (indent int, breakLine bool) (output string) { } if what.members != nil { - output += ":\n" + doIndent(indent, "(\n") - for _, member := range what.members { - output += doIndent ( - indent, member.ToString(indent + 1), "\n") + if breakLine { + output += ":\n" + doIndent(indent, "(\n") + for _, member := range what.members { + output += member.ToString(indent, breakLine) + } + output += doIndent(indent, ")") + } else { + output += ":(" + for index, member := range what.members { + if index > 0 { output += " " } + output += member.ToString(indent, breakLine) + } + output += ")" } - output += doIndent(indent, ")") } defaultValueKind := what.defaultValue.kind @@ -134,9 +180,10 @@ func (what Type) ToString (indent int, breakLine bool) (output string) { defaultValueKind == ArgumentKindObjectDefaultValues || defaultValueKind == ArgumentKindArrayDefaultValues - if isComplexDefaultValue && breakLine{ - output += ":\n" - output += what.defaultValue.ToString(indent + 1, breakLine) + if isComplexDefaultValue { + output += ":" + if breakLine { output += "\n" } + output += what.defaultValue.ToString(indent, breakLine) } else { output += ":<" output += what.defaultValue.ToString(indent, false) @@ -281,23 +328,7 @@ func (section DataSection) ToString (indent int) (output string) { "data ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString(indent, true), "\n") - return -} - -func (member TypeMember) ToString (indent int) (output string) { - output += doIndent(indent) - - output += member.permission.ToString() + " " - output += member.name + ":" - output += member.what.ToString(indent, true) - - if member.bitWidth > 0 { - output += fmt.Sprint(" & ", member.bitWidth) - } - - output += "\n" - + section.what.ToString(indent + 1, true), "\n") return } @@ -307,7 +338,7 @@ func (section TypeSection) ToString (indent int) (output string) { "type ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString(indent, true), "\n") + section.what.ToString(indent + 1, true), "\n") return } @@ -374,21 +405,9 @@ func (phrase Phrase) ToString (indent int, ownLine bool) (output string) { output += doIndent(indent) } - var initializationValues Argument - var declaration Argument - output += "[" + phrase.command.ToString(0, false) for _, argument := range phrase.arguments { - isInitializationValue := - argument.kind == ArgumentKindObjectDefaultValues || - argument.kind == ArgumentKindArrayDefaultValues - if isInitializationValue { - initializationValues = argument - } else if argument.kind == ArgumentKindDeclaration { - declaration = argument - } else { - output += " " + argument.ToString(0, false) - } + output += " " + argument.ToString(0, false) } output += "]" @@ -401,17 +420,9 @@ 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) - } output += phrase.block.ToString(indent + 1) + } else if len(phrase.block) > 0 { + output += "NON BLOCKLEVEL PHRASE HAS BLOCK" } return } From ac0444bcc91e17f207deaa099f010c2280e1c805 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 22:37:43 -0400 Subject: [PATCH 30/46] DataSection.ToString prints external specifier Data section is now passing unit test! Woo! --- parser/tree-tostring.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 023289c..535f81b 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -329,6 +329,11 @@ func (section DataSection) ToString (indent int) (output string) { section.permission.ToString(), " ", section.name, ":", section.what.ToString(indent + 1, true), "\n") + + if section.external { + output += doIndent(indent + 1, "external\n") + } + return } From 302ff76a8a8256d5e92ce8f81f97e46892ad2e64 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 22:45:08 -0400 Subject: [PATCH 31/46] Rewrote type section test case --- parser/type_test.go | 67 +++++++++++++++++++++++--------------- tests/parser/type/main.arf | 47 +++++++++++++------------- 2 files changed, 63 insertions(+), 51 deletions(-) diff --git a/parser/type_test.go b/parser/type_test.go index 6574e83..8988ec5 100644 --- a/parser/type_test.go +++ b/parser/type_test.go @@ -6,37 +6,50 @@ func TestType (test *testing.T) { checkTree ("../tests/parser/type", false, `:arf --- -type ro aBasic:Obj - ro that:Int - ro this:Int -type ro bBitFields:Obj - ro that:Int & 1 - ro this:Int & 24 298 -type ro cInit:Obj - ro that:String "hello world" - ro this:Int 23 -type ro dInitInherit:aBasic - -- that 9384 - -- this 389 -type ro eInitAndDefine:aBasic - ro these:aBasic - ro born:Int 4 - ro in:Int - ro the:Int:3 - 9348 - 92384 - 92834 - -- this 389 - -- these - -- this 98 - -- that 9384 - +type ro aBasic:Obj: + ( + .ro that:Int + .ro this:Int + ) +type ro bBitFields:Obj: + ( + .ro that:Int & 1 + .ro this:Int:<298> & 24 + ) +type ro cInit:Obj: + ( + .ro that:String:<"hello world"> + .ro this:Int:<23> + ) +type ro dInitInherit:aBasic: + ( + .that:<9384> + .this:<389> + ) +type ro cInitAndDefine:aBasic: + ( + .ro these:aBasic: + ( + .ro born:Int:<4> + .ro in:Int + .ro the:Int:3:<9348 92384 92834> + ): + ( + .this:<98> + ) + ): + ( + .that:<9384> + .this:<389> + ) type ro fBasic:Int -type ro gBasicInit:Int 6 +type ro gBasicInit:Int:<6> type ro hIntArray:{Int ..} -type ro iIntArrayInit:Int:3 +type ro iIntArrayInit:Int:3: + < 3298 923 92 + > `, test) } diff --git a/tests/parser/type/main.arf b/tests/parser/type/main.arf index 3500e3f..20f5131 100644 --- a/tests/parser/type/main.arf +++ b/tests/parser/type/main.arf @@ -1,36 +1,35 @@ :arf --- -type ro aBasic:Obj - ro that:Int - ro this:Int +type ro aBasic:Obj:( + .ro that:Int + .ro this:Int) -type ro bBitFields:Obj - ro that:Int & 1 - ro this:Int & 24 298 +type ro bBitFields:Obj:( + .ro that:Int & 1 + .ro this:Int:<298> & 24) -type ro cInit:Obj - ro that:String "hello world" - ro this:Int 23 +type ro cInit:Obj:( + .ro that:String:<"hello world"> + .ro this:Int:<23>) -type ro dInitInherit:aBasic - -- that 9384 - -- this 389 +type ro dInitInherit:aBasic:( + .that:<9384> + .this:<389>) -type ro cInitAndDefine:aBasic - -- this 389 - ro these:aBasic - ro born:Int 4 - ro in:Int - ro the:Int:3 - 9348 92384 92834 - -- this 98 - -- that 9384 +type ro cInitAndDefine:aBasic:( + .this:<389> + .ro these:aBasic:( + .ro born:Int:<4> + .ro in:Int + .ro the:Int:3:<9348 92384 92834> + .this:<98>) + .that:<9384>) type ro fBasic:Int -type ro gBasicInit:Int 6 +type ro gBasicInit:Int:<6> type ro hIntArray:{Int ..} -type ro iIntArrayInit:Int:3 - 3298 923 92 +type ro iIntArrayInit:Int:3: + <3298 923 92> From 2a1e8c5df7a2b96651f230e0e0b1af9a765d1a52 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 22:48:24 -0400 Subject: [PATCH 32/46] Implemented parsing bit width --- parser/type-notation.go | 7 +++++++ tests/parser/type/main.arf | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/parser/type-notation.go b/parser/type-notation.go index e13fb73..d428520 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -297,6 +297,13 @@ func (parser *ParsingOperation) parseObjectNewMember () ( if err != nil { return } // TODO: get bit width + 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 } + } return } diff --git a/tests/parser/type/main.arf b/tests/parser/type/main.arf index 20f5131..8ffe9df 100644 --- a/tests/parser/type/main.arf +++ b/tests/parser/type/main.arf @@ -16,7 +16,7 @@ type ro dInitInherit:aBasic:( .that:<9384> .this:<389>) -type ro cInitAndDefine:aBasic:( +type ro eInitAndDefine:aBasic:( .this:<389> .ro these:aBasic:( .ro born:Int:<4> From f1cd9856eac279230e2872812d5c4305b87e9dd4 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 22:54:26 -0400 Subject: [PATCH 33/46] Fixed TypeMember.ToString Type section now passes test --- parser/tree-tostring.go | 4 ++-- parser/type_test.go | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 535f81b..90e422c 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -122,7 +122,7 @@ func (member TypeMember) ToString (indent int, breakLine bool) (output string) { output += member.permission.ToString() + " " output += member.name + ":" - output += member.what.ToString(indent, breakLine) + output += member.what.ToString(indent + 1, breakLine) if member.bitWidth > 0 { output += fmt.Sprint(" & ", member.bitWidth) @@ -427,7 +427,7 @@ func (phrase Phrase) ToString (indent int, ownLine bool) (output string) { output += "\n" output += phrase.block.ToString(indent + 1) } else if len(phrase.block) > 0 { - output += "NON BLOCKLEVEL PHRASE HAS BLOCK" + output += "NON-BLOCK-LEVEL-PHRASE-HAS-BLOCK" } return } diff --git a/parser/type_test.go b/parser/type_test.go index 8988ec5..9863344 100644 --- a/parser/type_test.go +++ b/parser/type_test.go @@ -26,13 +26,18 @@ type ro dInitInherit:aBasic: .that:<9384> .this:<389> ) -type ro cInitAndDefine:aBasic: +type ro eInitAndDefine:aBasic: ( .ro these:aBasic: ( .ro born:Int:<4> .ro in:Int - .ro the:Int:3:<9348 92384 92834> + .ro the:Int:3: + < + 9348 + 92384 + 92834 + > ): ( .this:<98> From 2f26e63354f0e19bddd2c02bdefc27cad4b963a0 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Fri, 16 Sep 2022 23:01:32 -0400 Subject: [PATCH 34/46] Reinstated those two lines in the data section test --- parser/data_test.go | 2 ++ tests/parser/data/main.arf | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/parser/data_test.go b/parser/data_test.go index aa64558..c7bd803 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -26,6 +26,8 @@ data ro gIntegerArrayInitialized:Int:16: 4785 92 > +data wr hIntegerPointerInit:{Int}:<[& integer]> +data wr iMutIntegerPointerInit:{Int}:mut:<[& integer]> data ro jObject:Obj: ( .that:<324> diff --git a/tests/parser/data/main.arf b/tests/parser/data/main.arf index 6eaf69f..f883b6f 100644 --- a/tests/parser/data/main.arf +++ b/tests/parser/data/main.arf @@ -18,10 +18,9 @@ data ro gIntegerArrayInitialized:Int:16:< 340 0 2304 0 4785 92 > -# TODO: reinstate these two -# data wr hIntegerPointerInit:{Int}:<[& integer]> +data wr hIntegerPointerInit:{Int}:<[& integer]> -# data wr iMutIntegerPointerInit:{Int}:mut:<[& integer]> +data wr iMutIntegerPointerInit:{Int}:mut:<[& integer]> data ro jObject:Obj:( .this:<324> From b260d9424af3c6afedab81759b5f4771a64249e9 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 00:58:08 -0400 Subject: [PATCH 35/46] Introducing new enum syntax --- parser/enum.go | 65 +++++++++++++++++++++++++++++--------- parser/enum_test.go | 46 ++++++++++++++------------- parser/tree-tostring.go | 12 +++---- parser/type-notation.go | 20 ++++++++---- tests/parser/enum/main.arf | 44 +++++++++++++++----------- 5 files changed, 117 insertions(+), 70 deletions(-) diff --git a/parser/enum.go b/parser/enum.go index 92f01ec..06e110b 100644 --- a/parser/enum.go +++ b/parser/enum.go @@ -61,23 +61,13 @@ func (parser *ParsingOperation) parseEnumMembers ( // if we've left the block, stop parsing if !parser.token.Is(lexer.TokenKindIndent) { return } if parser.token.Value().(int) != 1 { return } + err = parser.nextToken(lexer.TokenKindMinus) + if err != nil { return } - member := EnumMember { } - - // get name - err = parser.nextToken(lexer.TokenKindName) + var member EnumMember + member, err = parser.parseEnumMember() + into.members = append(into.members, member) if err != nil { return } - member.location = parser.token.Location() - member.name = parser.token.Value().(string) - err = parser.nextToken() - if err != nil { return } - - // parse default value - if !parser.token.Is(lexer.TokenKindNewline) { - member.value, err = parser.parseArgument() - into.members = append(into.members, member) - if err != nil { return } - } err = parser.expect(lexer.TokenKindNewline) if err != nil { return } @@ -85,3 +75,48 @@ func (parser *ParsingOperation) parseEnumMembers ( if err != nil { return } } } + +// parseEnumMember parses a single enum member. Indenttion level is assumed. +func (parser *ParsingOperation) parseEnumMember () ( + member EnumMember, + err error, +) { + err = parser.expect(lexer.TokenKindMinus) + if err != nil { return } + + // get name + err = parser.nextToken(lexer.TokenKindName) + if err != nil { return } + member.location = parser.token.Location() + member.name = parser.token.Value().(string) + + // see if value exists + err = parser.nextToken ( + lexer.TokenKindColon, + lexer.TokenKindNewline) + if err != nil { return } + + if parser.token.Is(lexer.TokenKindColon) { + err = parser.nextToken() + if err != nil { return } + err = parser.skipWhitespace() + if err != nil { return } + err = parser.expect ( + lexer.TokenKindLessThan, + lexer.TokenKindGreaterThan) + if err != nil { return } + + if parser.token.Is(lexer.TokenKindLessThan) { + // parse value + member.value, err = parser.parseBasicDefaultValue() + if err != nil { return } + + } else if parser.token.Is(lexer.TokenKindLParen) { + // parse default values + member.value, err = parser.parseObjectDefaultValue() + if err != nil { return } + } + } + + return +} diff --git a/parser/enum_test.go b/parser/enum_test.go index bdc57e5..582084e 100644 --- a/parser/enum_test.go +++ b/parser/enum_test.go @@ -7,32 +7,34 @@ func TestEnum (test *testing.T) { `:arf --- enum ro AffrontToGod:Int:4 - bird0 - 28394 - 9328 + - bird0: + <28394 9328 + 398 9> + - bird1: + <23 932832 398 - 9 - bird1 - 23 - 932832 - 398 - 2349 - bird2 - 1 + 2349> + - bird2: + <1 2 3 - 4 + 4> enum ro NamedColor:U32 - red 16711680 - green 65280 - blue 255 + - red: <0xFF0000> + - green: <0x00FF00> + - blue: <0x0000FF> +enum ro ThisIsTerrible:Obj:(.rw x:Int .rw y:Int) + - up: (.x: 0 .y: -1) + - down: (.x: 0 .y: 1) + - left: (.x: -1 .y: 0) + - right: (.x: 1 .y: 0) enum ro Weekday:Int - sunday - monday - tuesday - wednesday - thursday - friday - saturday + - sunday + - monday + - tuesday + - wednesday + - thursday + - friday + - saturday `, test) } diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 90e422c..f0cf4b4 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -354,24 +354,22 @@ func (section EnumSection) ToString (indent int) (output string) { "enum ", section.permission.ToString(), " ", section.name, ":", - section.what.ToString(indent, true), "\n") + section.what.ToString(indent + 1, true), "\n") for _, member := range section.members { - output += doIndent(indent + 1, member.name) + output += doIndent(indent + 1, "- ", member.name) isComplexInitialization := member.value.kind == ArgumentKindObjectDefaultValues || member.value.kind == ArgumentKindArrayDefaultValues - if member.value.value == nil { - output += "\n" - } else if isComplexInitialization { + if isComplexInitialization { output += "\n" output += member.value.ToString(indent + 2, true) - } else { + } else if member.value.kind != ArgumentKindNil { output += " " + member.value.ToString(0, false) - output += "\n" } + output += "\n" } return } diff --git a/parser/type-notation.go b/parser/type-notation.go index d428520..1c7b50c 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -71,6 +71,8 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { } else if parser.token.Is(lexer.TokenKindUInt) { // parse fixed array length what.length = parser.token.Value().(uint64) + err = parser.nextToken() + if err != nil { return } } else if parser.token.Is(lexer.TokenKindLessThan) { // parse default value @@ -84,9 +86,6 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { err = parser.parseObjectDefaultValueAndMembers() if err != nil { return } } - - err = parser.nextToken() - if err != nil { return } } return @@ -124,6 +123,10 @@ func (parser *ParsingOperation) parseBasicDefaultValue () ( if err != nil { return } attributes = append(attributes, value) } + + err = parser.nextToken() + if err != nil { return } + return } @@ -186,6 +189,9 @@ func (parser *ParsingOperation) parseObjectDefaultValueAndMembers () ( } } + err = parser.nextToken() + if err != nil { return } + return } @@ -228,6 +234,9 @@ func (parser *ParsingOperation) parseObjectDefaultValue () ( attributes[memberName] = memberValue } + err = parser.nextToken() + if err != nil { return } + return } @@ -262,9 +271,6 @@ func (parser *ParsingOperation) parseObjectInheritedMember () ( value, err = parser.parseObjectDefaultValue() if err != nil { return } } - - err = parser.nextToken() - if err != nil { return } return } @@ -296,7 +302,7 @@ func (parser *ParsingOperation) parseObjectNewMember () ( member.what, err = parser.parseType() if err != nil { return } - // TODO: get bit width + // get bit width if parser.token.Is(lexer.TokenKindBinaryAnd) { err = parser.nextToken(lexer.TokenKindUInt) if err != nil { return } diff --git a/tests/parser/enum/main.arf b/tests/parser/enum/main.arf index 6d2788e..90ab9be 100644 --- a/tests/parser/enum/main.arf +++ b/tests/parser/enum/main.arf @@ -2,29 +2,35 @@ --- enum ro Weekday:Int - sunday - monday - tuesday - wednesday - thursday - friday - saturday + - sunday + - monday + - tuesday + - wednesday + - thursday + - friday + - saturday enum ro NamedColor:U32 - red 0xFF0000 - green 0x00FF00 - blue 0x0000FF + - red: <0xFF0000> + - green: <0x00FF00> + - blue: <0x0000FF> enum ro AffrontToGod:Int:4 - bird0 - 28394 9328 - 398 9 - bird1 - 23 932832 + - bird0: + <28394 9328 + 398 9> + - bird1: + <23 932832 398 - 2349 - bird2 - 1 + 2349> + - bird2: + <1 2 3 - 4 + 4> + +enum ro ThisIsTerrible:Obj:(.rw x:Int .rw y:Int) + - up: (.x: 0 .y: -1) + - down: (.x: 0 .y: 1) + - left: (.x: -1 .y: 0) + - right: (.x: 1 .y: 0) From b49e3823317df6297a28d43ee543df73dcca34b1 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 00:58:48 -0400 Subject: [PATCH 36/46] Removed old objt.go --- parser/objt.go | 125 ------------------------------------------------- 1 file changed, 125 deletions(-) delete mode 100644 parser/objt.go diff --git a/parser/objt.go b/parser/objt.go deleted file mode 100644 index 1449db7..0000000 --- a/parser/objt.go +++ /dev/null @@ -1,125 +0,0 @@ -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(§ion) - // 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 -// } From ec21a1d05ea21e2ecf3b511870078b591b556bb7 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 01:01:30 -0400 Subject: [PATCH 37/46] oopsie hehe --- tests/parser/enum/main.arf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/parser/enum/main.arf b/tests/parser/enum/main.arf index 90ab9be..9e2aedf 100644 --- a/tests/parser/enum/main.arf +++ b/tests/parser/enum/main.arf @@ -30,7 +30,7 @@ enum ro AffrontToGod:Int:4 4> enum ro ThisIsTerrible:Obj:(.rw x:Int .rw y:Int) - - up: (.x: 0 .y: -1) - - down: (.x: 0 .y: 1) - - left: (.x: -1 .y: 0) - - right: (.x: 1 .y: 0) + - up: (.x:< 0> .y:<-1>) + - down: (.x:< 0> .y:< 1>) + - left: (.x:<-1> .y:< 0>) + - right: (.x:< 1> .y:< 0>) From b76cb30d94a46d07c4536ce075b6f6946bea2ad8 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 02:07:50 -0400 Subject: [PATCH 38/46] Fixed bug with identifier parsing --- parser/enum.go | 2 +- parser/enum_test.go | 35 +++++++++++++++++++++++++++-------- parser/misc.go | 5 ++++- parser/tree-tostring.go | 4 ++-- parser/type-notation.go | 7 +++++-- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/parser/enum.go b/parser/enum.go index 06e110b..c2427d9 100644 --- a/parser/enum.go +++ b/parser/enum.go @@ -103,7 +103,7 @@ func (parser *ParsingOperation) parseEnumMember () ( if err != nil { return } err = parser.expect ( lexer.TokenKindLessThan, - lexer.TokenKindGreaterThan) + lexer.TokenKindLParen) if err != nil { return } if parser.token.Is(lexer.TokenKindLessThan) { diff --git a/parser/enum_test.go b/parser/enum_test.go index 582084e..c6c8c75 100644 --- a/parser/enum_test.go +++ b/parser/enum_test.go @@ -20,14 +20,33 @@ enum ro AffrontToGod:Int:4 3 4> enum ro NamedColor:U32 - - red: <0xFF0000> - - green: <0x00FF00> - - blue: <0x0000FF> -enum ro ThisIsTerrible:Obj:(.rw x:Int .rw y:Int) - - up: (.x: 0 .y: -1) - - down: (.x: 0 .y: 1) - - left: (.x: -1 .y: 0) - - right: (.x: 1 .y: 0) + - red:<0xFF0000> + - green:<0x00FF00> + - blue:<0x0000FF> +enum ro ThisIsTerrible:Obj: + ( + .rw x:Int + .rw y:Int + ) + - up: + ( + .x:<0> + .y:<-1> + ) + - down: + ( + .x:<0> + .y:<1>) + - left: + ( + .x:<-1> + .y:<0> + ) + - right: + ( + .x:<1> + .y:<0> + ) enum ro Weekday:Int - sunday - monday diff --git a/parser/misc.go b/parser/misc.go index 9d54782..ebe2e00 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -12,7 +12,10 @@ func (parser *ParsingOperation) parseIdentifier () ( identifier.location = parser.token.Location() for { - if !parser.token.Is(lexer.TokenKindName) { break } + if !parser.token.Is(lexer.TokenKindName) { + parser.previousToken() + break + } identifier.trail = append ( identifier.trail, diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index f0cf4b4..31bbfb2 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -364,10 +364,10 @@ func (section EnumSection) ToString (indent int) (output string) { member.value.kind == ArgumentKindArrayDefaultValues if isComplexInitialization { - output += "\n" + output += ":\n" output += member.value.ToString(indent + 2, true) } else if member.value.kind != ArgumentKindNil { - output += " " + member.value.ToString(0, false) + output += ":<" + member.value.ToString(0, false) + ">" } output += "\n" } diff --git a/parser/type-notation.go b/parser/type-notation.go index 1c7b50c..44c6b9a 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -6,7 +6,10 @@ import "git.tebibyte.media/arf/arf/types" // parseType parses a type notation of the form Name, {Name}, etc. func (parser *ParsingOperation) parseType () (what Type, err error) { + println("START") + defer println("END") err = parser.expect(lexer.TokenKindName, lexer.TokenKindLBrace) + println(parser.token.Describe()) if err != nil { return } what.location = parser.token.Location() @@ -181,11 +184,11 @@ func (parser *ParsingOperation) parseObjectDefaultValueAndMembers () ( } else if parser.token.Is(lexer.TokenKindPermission) { // parsing a member declaration var member TypeMember - member, - err = parser.parseObjectNewMember() + member, err = parser.parseObjectNewMember() // TODO: error on duplicate members = append(members, member) + if err != nil { return } } } From 8b8754a12df481e998ea3a66fbc3ce993f21f763 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 02:11:12 -0400 Subject: [PATCH 39/46] Enum now passes its test --- parser/enum_test.go | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/parser/enum_test.go b/parser/enum_test.go index c6c8c75..74c59b7 100644 --- a/parser/enum_test.go +++ b/parser/enum_test.go @@ -8,21 +8,30 @@ func TestEnum (test *testing.T) { --- enum ro AffrontToGod:Int:4 - bird0: - <28394 9328 - 398 9> - - bird1: - <23 932832 + < + 28394 + 9328 398 - 2349> + 9 + > + - bird1: + < + 23 + 932832 + 398 + 2349 + > - bird2: - <1 + < + 1 2 3 - 4> + 4 + > enum ro NamedColor:U32 - - red:<0xFF0000> - - green:<0x00FF00> - - blue:<0x0000FF> + - red:<16711680> + - green:<65280> + - blue:<255> enum ro ThisIsTerrible:Obj: ( .rw x:Int @@ -36,7 +45,8 @@ enum ro ThisIsTerrible:Obj: - down: ( .x:<0> - .y:<1>) + .y:<1> + ) - left: ( .x:<-1> From bd25006897e9d1006d5f9a5c3a012646fd3df67c Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 11:50:27 -0400 Subject: [PATCH 40/46] Fixed some errors that cropped up in the data section test --- parser/data_test.go | 4 ++-- parser/type-notation.go | 8 ++++---- tests/parser/data/main.arf | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/parser/data_test.go b/parser/data_test.go index c7bd803..30739c1 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -26,8 +26,8 @@ data ro gIntegerArrayInitialized:Int:16: 4785 92 > -data wr hIntegerPointerInit:{Int}:<[& integer]> -data wr iMutIntegerPointerInit:{Int}:mut:<[& integer]> +data rw hIntegerPointerInit:{Int}:<[& integer]> +data rw iMutIntegerPointerInit:{Int}:mut:<[& integer]> data ro jObject:Obj: ( .that:<324> diff --git a/parser/type-notation.go b/parser/type-notation.go index 44c6b9a..945a08f 100644 --- a/parser/type-notation.go +++ b/parser/type-notation.go @@ -6,10 +6,7 @@ import "git.tebibyte.media/arf/arf/types" // parseType parses a type notation of the form Name, {Name}, etc. func (parser *ParsingOperation) parseType () (what Type, err error) { - println("START") - defer println("END") err = parser.expect(lexer.TokenKindName, lexer.TokenKindLBrace) - println(parser.token.Describe()) if err != nil { return } what.location = parser.token.Location() @@ -50,7 +47,7 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { if err != nil { return } err = parser.skipWhitespace() if err != nil { return } - + err = parser.expect( lexer.TokenKindName, lexer.TokenKindUInt, @@ -71,6 +68,9 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { infoerr.ErrorKindError) return } + err = parser.nextToken() + if err != nil { return } + } else if parser.token.Is(lexer.TokenKindUInt) { // parse fixed array length what.length = parser.token.Value().(uint64) diff --git a/tests/parser/data/main.arf b/tests/parser/data/main.arf index f883b6f..824cacd 100644 --- a/tests/parser/data/main.arf +++ b/tests/parser/data/main.arf @@ -18,9 +18,9 @@ data ro gIntegerArrayInitialized:Int:16:< 340 0 2304 0 4785 92 > -data wr hIntegerPointerInit:{Int}:<[& integer]> +data rw hIntegerPointerInit:{Int}:<[& integer]> -data wr iMutIntegerPointerInit:{Int}:mut:<[& integer]> +data rw iMutIntegerPointerInit:{Int}:mut:<[& integer]> data ro jObject:Obj:( .this:<324> From a492622e30074ab122c287bdab85ce033386176c Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 12:07:39 -0400 Subject: [PATCH 41/46] Edited func section test case --- parser/func_test.go | 24 +++++++----------------- tests/parser/func/main.arf | 21 ++++++++++----------- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/parser/func_test.go b/parser/func_test.go index 99facdf..ed10863 100644 --- a/parser/func_test.go +++ b/parser/func_test.go @@ -8,13 +8,13 @@ func TestFunc (test *testing.T) { --- func ro aBasicExternal > someInput:Int:mut - < someOutput:Int 4 + < someOutput:Int:<4> --- external func ro bMethod @ bird:{Bird} > someInput:Int:mut - < someOutput:Int 4 + < someOutput:Int:<4> --- external func ro cBasicPhrases @@ -101,20 +101,10 @@ func ro gControlFlow [otherThing] func ro hSetPhrase --- - [= x:Int 3] - [= y:{Int} [loc x]] - [= z:Int:8] - 398 - 9 - 2309 - 983 - -2387 - 478 - 555 - 123 - [= bird:Bird] - .that - .whenYou 99999 - .this 324 + let x:Int:<3> + let y:{Int}:<[loc x]> + let z:Int:8:<398 9 2309 983 -2387 478 555 123> + let bird:Bird:(.that:(.whenYou:<99999>) .this:<324>) + `, test) } diff --git a/tests/parser/func/main.arf b/tests/parser/func/main.arf index 79ab114..adee836 100644 --- a/tests/parser/func/main.arf +++ b/tests/parser/func/main.arf @@ -2,14 +2,14 @@ --- func ro aBasicExternal > someInput:Int:mut - < someOutput:Int 4 + < someOutput:Int:<4> --- external func ro bMethod @ bird:{Bird} > someInput:Int:mut - < someOutput:Int 4 + < someOutput:Int:<4> --- external @@ -124,13 +124,12 @@ func ro gControlFlow func ro hSetPhrase --- - = x:Int 3 + let x:Int:<3> # loc is a reference, similar to * in C - = y:{Int} [loc x] - = z:Int:8 - 398 9 2309 983 -2387 - 478 555 123 - = bird:Bird - .that - .whenYou 99999 - .this 324 + let y:{Int}:<[loc x]> + let z:Int:8: + <398 9 2309 983 -2387 + 478 555 123> + let bird:Bird:( + .that:(.whenYou:<99999>) + .this:<324>) From 49eb7f9b9d7196d0b1c259427b9839323601a7af Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 12:12:04 -0400 Subject: [PATCH 42/46] Removed FuncOutput from the tree --- parser/accessors.go | 6 ------ parser/func.go | 4 +++- parser/tree-tostring.go | 9 +-------- parser/tree.go | 8 +------- 4 files changed, 5 insertions(+), 22 deletions(-) diff --git a/parser/accessors.go b/parser/accessors.go index d92de35..952402f 100644 --- a/parser/accessors.go +++ b/parser/accessors.go @@ -247,12 +247,6 @@ func (section FuncSection) OutputsLength () (length int) { return } -// Output returns the output at index. -func (section FuncSection) Output (index int) (output FuncOutput) { - output = section.outputs[index] - return -} - // Root returns the root block of the section. func (section FuncSection) Root () (root Block) { root = section.root diff --git a/parser/func.go b/parser/func.go index cc486a3..7e775c5 100644 --- a/parser/func.go +++ b/parser/func.go @@ -171,7 +171,7 @@ func (parser *ParsingOperation) parseFuncArguments ( if err != nil { return } case lexer.TokenKindLessThan: - output := FuncOutput { } + output := Declaration { } output.location = parser.token.Location() // get name @@ -186,6 +186,8 @@ func (parser *ParsingOperation) parseFuncArguments ( if err != nil { return } output.what, err = parser.parseType() if err != nil { return } + + into.outputs = append(into.outputs, output) parser.expect(lexer.TokenKindNewline) if err != nil { return } diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 31bbfb2..332f5e5 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -438,13 +438,6 @@ func (block Block) ToString (indent int) (output string) { return } -func (funcOutput FuncOutput) ToString (indent int) (output string) { - output += doIndent ( - indent + 1, - "< ", funcOutput.Declaration.ToString(indent), "\n") - return -} - func (section FuncSection) ToString (indent int) (output string) { output += doIndent ( indent, @@ -463,7 +456,7 @@ func (section FuncSection) ToString (indent int) (output string) { } for _, outputItem := range section.outputs { - output += outputItem.ToString(indent + 1) + output += doIndent(indent + 1, "< ", outputItem.ToString(indent), "\n") } output += doIndent(indent + 1, "---\n") diff --git a/parser/tree.go b/parser/tree.go index e40cb5f..47862a9 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -260,12 +260,6 @@ type Phrase struct { // Block represents a scoped/indented block of code. type Block []Phrase -// FuncOutput represents an input a function section. It is unlike an input in -// that it can have a default value. -type FuncOutput struct { - Declaration -} - // FuncSection represents a function section. type FuncSection struct { locatable @@ -274,7 +268,7 @@ type FuncSection struct { receiver *Declaration inputs []Declaration - outputs []FuncOutput + outputs []Declaration root Block external bool From 77acfd1cf26def0d7963274a6c4e22c733b746bf Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 12:22:17 -0400 Subject: [PATCH 43/46] Fixed func ToString and test case --- parser/func_test.go | 9 ++++----- parser/tree-tostring.go | 7 +++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/parser/func_test.go b/parser/func_test.go index ed10863..e44e528 100644 --- a/parser/func_test.go +++ b/parser/func_test.go @@ -101,10 +101,9 @@ func ro gControlFlow [otherThing] func ro hSetPhrase --- - let x:Int:<3> - let y:{Int}:<[loc x]> - let z:Int:8:<398 9 2309 983 -2387 478 555 123> - let bird:Bird:(.that:(.whenYou:<99999>) .this:<324>) - + [let x:Int:<3>] + [let y:{Int}:<[loc x]>] + [let z:Int:8:<398 9 2309 983 -2387 478 555 123>] + [let bird:Bird:(.that:(.whenYou:<99999>) .this:<324>)] `, test) } diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 332f5e5..e38f6cf 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -76,7 +76,9 @@ func (values ObjectDefaultValues) ToString ( output += doIndent(indent, "(") if breakLine { output += "\n" } - for _, name := range sortMapKeysAlphabetically(values) { + for index, name := range sortMapKeysAlphabetically(values) { + if index > 0 && !breakLine { output += " " } + value := values[name] output += doIndent(indent, "." + name + ":") @@ -109,7 +111,8 @@ func (values ArrayDefaultValues) ToString ( output += doIndent(indent, "<") if breakLine { output += "\n" } - for _, value := range values { + for index, value := range values { + if index > 0 && !breakLine { output += " " } output += value.ToString(indent, breakLine) } From 85f97189acc533b8d1a908d90769c61b612c309e Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 12:30:56 -0400 Subject: [PATCH 44/46] Cleaned up phrase parsing a bit --- parser/phrase.go | 28 ++++++++++------------------ parser/tree.go | 1 + 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/parser/phrase.go b/parser/phrase.go index f1c882f..7db3fbd 100644 --- a/parser/phrase.go +++ b/parser/phrase.go @@ -139,25 +139,16 @@ func (parser *ParsingOperation) parseBlockLevelPhrase ( err = parser.expect(validDelimitedPhraseTokens...) if err != nil { return } + // we are delimited so we can safely skip whitespace + err = parser.skipWhitespace() + if err != nil { return } + if parser.token.Is(lexer.TokenKindRBracket) { // this is an ending delimiter err = parser.nextToken() if err != nil { return } break - } else if parser.token.Is(lexer.TokenKindNewline) { - // we are delimited, so we can safely skip - // newlines - err = parser.nextToken() - if err != nil { return } - continue - - } else if parser.token.Is(lexer.TokenKindIndent) { - // we are delimited, so we can safely skip - // indents - err = parser.nextToken() - if err != nil { return } - continue } } else { // not delimited @@ -176,7 +167,7 @@ func (parser *ParsingOperation) parseBlockLevelPhrase ( } } - // this is an argument + // if we've got this far, we are parsing an argument var argument Argument argument, err = parser.parseArgument() phrase.arguments = append(phrase.arguments, argument) @@ -222,10 +213,9 @@ func (parser *ParsingOperation) parseBlockLevelPhrase ( } } - if !isControlFlow { return } - - // if it is any of those, parse the block under it - phrase.block, err = parser.parseBlock(indent + 1) + if isControlFlow { + phrase.block, err = parser.parseBlock(indent + 1) + } return } @@ -318,6 +308,8 @@ func (parser *ParsingOperation) parsePhraseCommand () ( identifier := command.value.(Identifier) if len(identifier.trail) == 1 { switch identifier.trail[0] { + case "let": + kind = PhraseKindLet case "loc": kind = PhraseKindReference case "defer": diff --git a/parser/tree.go b/parser/tree.go index 47862a9..3a7745a 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -231,6 +231,7 @@ const ( PhraseKindCall = iota PhraseKindCallExternal PhraseKindOperator + PhraseKindLet PhraseKindAssign PhraseKindReference PhraseKindDefer From ea92decfe7d21bf4f1a38e5d1d90eda14da153e1 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 12:31:23 -0400 Subject: [PATCH 45/46] Fixed meta test Parser now passes all tests --- parser/meta_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parser/meta_test.go b/parser/meta_test.go index 26af856..467135f 100644 --- a/parser/meta_test.go +++ b/parser/meta_test.go @@ -12,7 +12,7 @@ author "Sasha Koshka" license "GPLv3" require "` + filepath.Join(cwd, "./some/local/module") + `" require "/some/absolute/path/to/someModule" -require "/usr/include/arf/someLibraryInstalledInStandardLocation" +require "/usr/local/include/arf/someLibraryInstalledInStandardLocation" --- `, test) } From 8d3f6a8233308f930c0cb00af4be77e75b58d36d Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Sat, 17 Sep 2022 12:33:52 -0400 Subject: [PATCH 46/46] Updated example code --- examples/basic/main.arf | 2 +- examples/full/main.arf | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/basic/main.arf b/examples/basic/main.arf index 7084112..12847f7 100644 --- a/examples/basic/main.arf +++ b/examples/basic/main.arf @@ -4,6 +4,6 @@ require "io" func ro main > arguments:{String ..} - < status:Int 0 + < status:Int:<0> --- io.println "hello world" diff --git a/examples/full/main.arf b/examples/full/main.arf index 0817ddd..a05acbc 100644 --- a/examples/full/main.arf +++ b/examples/full/main.arf @@ -5,18 +5,18 @@ require "io" --- # this is a global variable -data pv helloText:String "Hello, world!" +data pv helloText:String:<"Hello, world!"> # this is a struct definition -objt ro Greeter:Obj - rw text:String "Hi." +type ro Greeter:Obj:( + .rw text:String:<"Hi.">) # this is a function func ro main > arguments:{String ..} - < status:Int 0 + < status:Int:<0> --- - = greeter:Greeter:mut + let greeter:Greeter:mut greeter.setText helloText greeter.greet