diff --git a/examples/basic/main.arf b/examples/basic/main.arf index 3a8695e..7084112 100644 --- a/examples/basic/main.arf +++ b/examples/basic/main.arf @@ -3,7 +3,7 @@ require "io" --- func ro main - > arguments:{String} + > arguments:{String ..} < status:Int 0 --- io.println "hello world" diff --git a/examples/full/main.arf b/examples/full/main.arf index 9cfa79a..0817ddd 100644 --- a/examples/full/main.arf +++ b/examples/full/main.arf @@ -13,7 +13,7 @@ objt ro Greeter:Obj # this is a function func ro main - > arguments:{String} + > arguments:{String ..} < status:Int 0 --- = greeter:Greeter:mut diff --git a/parser/accessors.go b/parser/accessors.go index 28e51d9..fbf9a32 100644 --- a/parser/accessors.go +++ b/parser/accessors.go @@ -75,10 +75,11 @@ func (what Type) Mutable () (mutable bool) { return } -// Length returns the length of the type if the type is a fixed length array. -// Otherwise, it just returns zero. +// Length returns the length of the type. If it is greater than 1, that means +// the type is a fixed length array. func (what Type) Length () (length uint64) { - if what.kind == TypeKindArray { + length = 1 + if what.length > 1 { length = what.length } return diff --git a/parser/body.go b/parser/body.go index 15b9092..bb852a0 100644 --- a/parser/body.go +++ b/parser/body.go @@ -15,37 +15,37 @@ func (parser *ParsingOperation) parseBody () (err error) { section, parseErr := parser.parseDataSection() err = parser.tree.addSection(section) if err != nil { return } - if parseErr != nil { return } + if parseErr != nil { return parseErr } case "type": section, parseErr := parser.parseTypeSection() err = parser.tree.addSection(section) if err != nil { return } - if parseErr != 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 } + if parseErr != nil { return parseErr } case "face": section, parseErr := parser.parseFaceSection() err = parser.tree.addSection(section) if err != nil { return } - if parseErr != nil { return } + if parseErr != nil { return parseErr } case "enum": section, parseErr := parser.parseEnumSection() err = parser.tree.addSection(section) if err != nil { return } - if parseErr != nil { return } + if parseErr != nil { return parseErr } case "func": section, parseErr := parser.parseFuncSection() err = parser.tree.addSection(section) if err != nil { return } - if parseErr != nil { return } + if parseErr != nil { return parseErr } default: err = parser.token.NewError ( diff --git a/parser/data_test.go b/parser/data_test.go index 2d9e54e..08c77d9 100644 --- a/parser/data_test.go +++ b/parser/data_test.go @@ -6,9 +6,13 @@ func TestData (test *testing.T) { checkTree ("../tests/parser/data", `:arf --- -data ro integer:Int 3202 -data ro integerArray16:{Int 16} -data ro integerArrayInitialized:{Int 16} +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 @@ -20,19 +24,28 @@ data ro integerArrayInitialized:{Int 16} 0 4785 92 -data ro integerArrayVariable:{Int ..} -data ro integerPointer:{Int} -data ro mutInteger:Int:mut 3202 -data ro mutIntegerPointer:{Int}:mut -data ro nestedObject:Obj +data ro jObject:thing.Thing.thing.thing + .that 2139 + .this 324 +data ro kNestedObject:Obj .that .bird2 123.8439 .bird3 9328.21348239 .this .bird0 324 .bird1 "hello world" -data ro object:thing.thing.thing.thing - .that 2139 - .this 324 +data ro lMutIntegerArray16:Int:16:mut +data ro mIntegerArrayInitialized:Int:16:mut + 3948 + 293 + 293049 + 948 + 912 + 340 + 0 + 2304 + 0 + 4785 + 92 `, test) } diff --git a/parser/enum_test.go b/parser/enum_test.go index 7857387..a695dfc 100644 --- a/parser/enum_test.go +++ b/parser/enum_test.go @@ -6,7 +6,7 @@ func TestEnum (test *testing.T) { checkTree ("../tests/parser/enum", `:arf --- -enum ro AffrontToGod:{Int 4} +enum ro AffrontToGod:Int:4 bird0 28394 9328 diff --git a/parser/func_test.go b/parser/func_test.go index f221b9e..d7137b3 100644 --- a/parser/func_test.go +++ b/parser/func_test.go @@ -25,7 +25,7 @@ func ro cBasicPhrases [fn [gn 329 983 57] 123] func ro dArgumentTypes --- - [bird tree butterfly.wing "hello world" grass:{Int:mut 8}] + [bird tree butterfly.wing "hello world" grass:Int:8:mut] func ro eMath > x:Int > y:Int @@ -103,7 +103,7 @@ func ro hSetPhrase --- [= x:Int 3] [= y:{Int} [loc x]] - [= z:{Int 8}] + [= z:Int:8] 398 9 2309 diff --git a/parser/misc.go b/parser/misc.go index 9ccc17c..b2a54d5 100644 --- a/parser/misc.go +++ b/parser/misc.go @@ -44,19 +44,11 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { what.points = &points err = parser.expect ( - lexer.TokenKindUInt, lexer.TokenKindRBrace, lexer.TokenKindElipsis) if err != nil { return } - if parser.token.Is(lexer.TokenKindUInt) { - what.kind = TypeKindArray - - what.length = parser.token.Value().(uint64) - - err = parser.nextToken(lexer.TokenKindRBrace) - if err != nil { return } - } else if parser.token.Is(lexer.TokenKindElipsis) { + if parser.token.Is(lexer.TokenKindElipsis) { what.kind = TypeKindVariableArray err = parser.nextToken(lexer.TokenKindRBrace) @@ -70,19 +62,28 @@ func (parser *ParsingOperation) parseType () (what Type, err error) { if err != nil { return } } - if parser.token.Is(lexer.TokenKindColon) { - err = parser.nextToken(lexer.TokenKindName) + for { + if !parser.token.Is(lexer.TokenKindColon) { break } + + err = parser.nextToken(lexer.TokenKindName, lexer.TokenKindUInt) if err != nil { return } - qualifier := parser.token.Value().(string) - switch qualifier { - case "mut": - what.mutable = true - default: - err = parser.token.NewError ( - "unknown type qualifier \"" + qualifier + "\"", - infoerr.ErrorKindError) - 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() diff --git a/parser/objt_test.go b/parser/objt_test.go index 4490f38..3a6775a 100644 --- a/parser/objt_test.go +++ b/parser/objt_test.go @@ -13,7 +13,7 @@ objt ro BitFields:Obj ro that:Int & 1 ro this:Int & 24 298 objt ro ComplexInit:Obj - ro whatever:{Int 3} + ro whatever:Int:3 230984 849 394580 diff --git a/parser/tree-tostring.go b/parser/tree-tostring.go index 78dd94c..a7e8cb5 100644 --- a/parser/tree-tostring.go +++ b/parser/tree-tostring.go @@ -73,15 +73,17 @@ func (what Type) ToString () (output string) { output += "{" output += what.points.ToString() - if what.kind == TypeKindArray { - output += fmt.Sprint(" ", what.length) - } else if what.kind == TypeKindVariableArray { + if what.kind == TypeKindVariableArray { output += " .." } output += "}" } + if what.length > 1 { + output += fmt.Sprint(":", what.length) + } + if what.mutable { output += ":mut" } diff --git a/parser/tree.go b/parser/tree.go index fa47cc9..8f13b2c 100644 --- a/parser/tree.go +++ b/parser/tree.go @@ -55,9 +55,6 @@ const ( // TypeKindPointer means it's a pointer TypeKindPointer - // TypeKindArray means it's a fixed length array. - TypeKindArray - // TypeKindVariableArray means it's an array of variable length. TypeKindVariableArray ) @@ -68,8 +65,6 @@ type Type struct { mutable bool kind TypeKind - - // only applicable for fixed length arrays. length uint64 // only applicable for basic. diff --git a/parser/type_test.go b/parser/type_test.go index 3221737..44219bc 100644 --- a/parser/type_test.go +++ b/parser/type_test.go @@ -9,7 +9,7 @@ func TestType (test *testing.T) { type ro Basic:Int type ro BasicInit:Int 6 type ro IntArray:{Int ..} -type ro IntArrayInit:{Int 3} +type ro IntArrayInit:Int:3 3298 923 92 diff --git a/tests/parser/data/main.arf b/tests/parser/data/main.arf index e6e03ff..b850361 100644 --- a/tests/parser/data/main.arf +++ b/tests/parser/data/main.arf @@ -1,34 +1,34 @@ :arf --- -data ro integer:Int 3202 +data ro aInteger:Int 3202 -data ro mutInteger:Int:mut 3202 +data ro bMutInteger:Int:mut 3202 -data ro integerPointer:{Int} +data ro cIntegerPointer:{Int} -data ro mutIntegerPointer:{Int}:mut +data ro dMutIntegerPointer:{Int}:mut -data ro integerArray16:{Int 16} +data ro eIntegerArray16:Int:16 -data ro integerArrayVariable:{Int ..} +data ro fIntegerArrayVariable:{Int ..} -data ro integerArrayInitialized:{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 integerPointerInit:{Int} [& integer] +# data wr hIntegerPointerInit:{Int} [& integer] -# data wr mutIntegerPointerInit:{Int}:mut [& integer] +# data wr iMutIntegerPointerInit:{Int}:mut [& integer] # TODO: maybe test identifiers somewhere else? -data ro object:thing.thing. +data ro jObject:thing.Thing. thing.thing .this 324 .that 2139 -data ro nestedObject:Obj +data ro kNestedObject:Obj .this .bird0 324 .bird1 "hello world" @@ -36,19 +36,8 @@ data ro nestedObject:Obj .bird2 123.8439 .bird3 9328.21348239 +data ro lMutIntegerArray16:Int:16:mut -# func ro main - # --- - # # TODO: set should be a special case, checking under itself for object - # member initialization args. it should also check for args in general - # under there which should be treated as array initialization args. - # basically, under a set phrase, it should do the same checks that it - # does under a data section. - # - # [set object:Obj] - # .this 324 - # .that 2139 - # - # set object:Obj - # .this 324 - # .that 2139 +data ro mIntegerArrayInitialized:Int:16:mut + 3948 293 293049 948 912 + 340 0 2304 0 4785 92 diff --git a/tests/parser/enum/main.arf b/tests/parser/enum/main.arf index 0571149..6d2788e 100644 --- a/tests/parser/enum/main.arf +++ b/tests/parser/enum/main.arf @@ -15,7 +15,7 @@ enum ro NamedColor:U32 green 0x00FF00 blue 0x0000FF -enum ro AffrontToGod:{Int 4} +enum ro AffrontToGod:Int:4 bird0 28394 9328 398 9 diff --git a/tests/parser/full/main.arf b/tests/parser/full/main.arf index e64decb..0817ddd 100644 --- a/tests/parser/full/main.arf +++ b/tests/parser/full/main.arf @@ -5,37 +5,31 @@ require "io" --- # this is a global variable -data wn helloText:String "Hello, world!" +data pv helloText:String "Hello, world!" # this is a struct definition -type rr Greeter:Obj - # "Hi." is a string constant. all Greeters will be initialized with a - # pointer to it. I don't know really it depends on what I decide that - # a String type even is. - wr text:String "Hi." - "sdfdsf" "ahh" - "asdf" +objt ro Greeter:Obj + rw text:String "Hi." # this is a function -func rr main - > argc:Int - > argv:{String} - < status:Int 0 - --- - let greeter:Greeter:mut - greeter.setText helloText - greeter.greet +func ro main + > arguments:{String ..} + < status:Int 0 + --- + = greeter:Greeter:mut + greeter.setText helloText + greeter.greet # this is a member function -func rr greet - @ greeter:{Greeter} - --- - io.println greeter.text +func ro greet + @ greeter:{Greeter} + --- + io.println greeter.text # this is mutator member function -func rr setText - @ greeter:{Greeter} - > text:String - --- - greeter.text.set text +func ro setText + @ greeter:{Greeter} + > text:String + --- + greeter.text.set text diff --git a/tests/parser/func/main.arf b/tests/parser/func/main.arf index fcb1671..79ab114 100644 --- a/tests/parser/func/main.arf +++ b/tests/parser/func/main.arf @@ -28,7 +28,7 @@ func ro cBasicPhrases func ro dArgumentTypes --- [bird tree butterfly.wing "hello world" - grass:{Int:mut 8}] + grass:Int:mut:8] func ro eMath > x:Int @@ -127,7 +127,7 @@ func ro hSetPhrase = x:Int 3 # loc is a reference, similar to * in C = y:{Int} [loc x] - = z:{Int 8} + = z:Int:8 398 9 2309 983 -2387 478 555 123 = bird:Bird diff --git a/tests/parser/objt/main.arf b/tests/parser/objt/main.arf index 7bdaf3c..9026d29 100644 --- a/tests/parser/objt/main.arf +++ b/tests/parser/objt/main.arf @@ -13,7 +13,7 @@ objt ro Init:Obj ro this:Int 23 objt ro ComplexInit:Obj - ro whatever:{Int 3} + ro whatever:Int:3 230984 849 394580 ro complex0:Bird diff --git a/tests/parser/type/main.arf b/tests/parser/type/main.arf index d7feb7e..7c84c2a 100644 --- a/tests/parser/type/main.arf +++ b/tests/parser/type/main.arf @@ -6,5 +6,5 @@ type ro BasicInit:Int 6 type ro IntArray:{Int ..} -type ro IntArrayInit:{Int 3} +type ro IntArrayInit:Int:3 3298 923 92