alter-fixed-array-syntax #3

Merged
sashakoshka merged 6 commits from alter-fixed-array-syntax into main 2022-09-05 09:39:27 -06:00
18 changed files with 106 additions and 111 deletions

View File

@ -3,7 +3,7 @@ require "io"
---
func ro main
> arguments:{String}
> arguments:{String ..}
< status:Int 0
---
io.println "hello world"

View File

@ -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

View File

@ -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

View File

@ -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 (

View File

@ -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)
}

View File

@ -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

View File

@ -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

View File

@ -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,20 +62,29 @@ 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 }
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 + "\"",
"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 }

View File

@ -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

View File

@ -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"
}

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -5,35 +5,29 @@ 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}
func ro main
> arguments:{String ..}
< status:Int 0
---
let greeter:Greeter:mut
= greeter:Greeter:mut
greeter.setText helloText
greeter.greet
# this is a member function
func rr greet
func ro greet
@ greeter:{Greeter}
---
io.println greeter.text
# this is mutator member function
func rr setText
func ro setText
@ greeter:{Greeter}
> text:String
---

View File

@ -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

View File

@ -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

View File

@ -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