Merge pull request 'remove-participle-refit-generator' (#9) from remove-participle-refit-generator into remove-participle

Reviewed-on: sashakoshka/fspl#9
This commit is contained in:
Sasha Koshka 2024-02-08 18:33:37 +00:00
commit 05bf1be5ba
11 changed files with 47 additions and 108 deletions

View File

@ -97,6 +97,9 @@ func (this *generator) generateExpressionAny (expression entity.Expression) (reg
return this.generateLoop(expression, ResultModeAny)
// we get nothing from these
case *entity.Assignment:
_, err := this.generateAssignment(expression)
return nil, false, err
case *entity.Break:
_, err := this.generateBreak(expression)
return nil, false, err
@ -163,6 +166,8 @@ func (this *generator) generateExpressionVal (expression entity.Expression) (llv
return this.generateLiteralNil(expression)
// we get nothing from these
case *entity.Assignment:
return this.generateAssignment(expression)
case *entity.Break:
return this.generateBreak(expression)
case *entity.Return:
@ -228,6 +233,8 @@ func (this *generator) generateExpressionLoc (expression entity.Expression) (llv
return this.generateLiteralStructLoc(expression, nil)
// we get nothing from these
case *entity.Assignment:
return this.generateAssignment(expression)
case *entity.Break:
return this.generateBreak(expression)
case *entity.Return:
@ -238,66 +245,3 @@ func (this *generator) generateExpressionLoc (expression entity.Expression) (llv
expression, expression))
}
}
func (this *generator) generateStatement (
statement entity.Statement,
mode ResultMode,
) (
register llvm.Value,
location bool,
err error,
) {
switch mode {
case ResultModeAny:
return this.generateStatementAny(statement)
case ResultModeVal:
val, err := this.generateStatementVal(statement)
return val, false, err
case ResultModeLoc:
loc, err := this.generateStatementLoc(statement)
return loc, true, err
default: panic("unknown ResultMode")
}
}
func (this *generator) generateStatementAny (statement entity.Statement) (register llvm.Value, location bool, err error) {
switch statement := statement.(type) {
case *entity.Assignment:
_, err := this.generateAssignment(statement)
return nil, false, err
case entity.Expression:
return this.generateExpressionAny(statement)
default:
panic(fmt.Sprintf (
"BUG: generator doesnt know about statement %v, ty: %T",
statement, statement))
}
}
func (this *generator) generateStatementVal (statement entity.Statement) (llvm.Value, error) {
switch statement := statement.(type) {
case *entity.Assignment:
_, err := this.generateAssignment(statement)
return nil, err
case entity.Expression:
return this.generateExpressionVal(statement)
default:
panic(fmt.Sprintf (
"BUG: generator doesnt know about value statement %v, ty: %T",
statement, statement))
}
}
func (this *generator) generateStatementLoc (statement entity.Statement) (llvm.Value, error) {
switch statement := statement.(type) {
case *entity.Assignment:
_, err := this.generateAssignment(statement)
return nil, err
case entity.Expression:
return this.generateExpressionLoc(statement)
default:
panic(fmt.Sprintf (
"BUG: generator doesnt know about location statement %v, ty: %T",
statement, statement))
}
}

View File

@ -10,11 +10,11 @@ func (this *generator) generateBlock (block *entity.Block, mode ResultMode) (llv
lastIndex := len(block.Steps) - 1
for _, step := range block.Steps[:lastIndex] {
_, _, err := this.generateStatementAny(step)
_, _, err := this.generateExpressionAny(step)
if err != nil { return nil, false, err }
}
return this.generateStatement(block.Steps[lastIndex], mode)
return this.generateExpression(block.Steps[lastIndex], mode)
}
func (this *generator) generateBreak (brk *entity.Break) (llvm.Value, error) {

View File

@ -151,11 +151,11 @@ declare %Index @puts(ptr %string)
`
[puts string: *Byte]: Index
Greeter: (message: String)
Greeter: (. message: String)
Greeter.[greet] = [puts [@[.this.message 0]]]
[main] = {
greeter: Greeter = (
greeter: Greeter = (.
message: 'hello\0'
)
greeter.[greet]

View File

@ -29,13 +29,13 @@ define void @T.do(ptr %this) {
}
`,
`
Doer: ([do])
Doer: (~ [do])
T: Int
T.[do] = { }
[main] = {
if:Doer = x:T
if.[do]
ifa:Doer = x:T
ifa.[do]
}
`)
}
@ -70,14 +70,14 @@ define i64 @Number.number(ptr %this) {
}
`,
`
Numbered: ([number]: Int)
Numbered: (~ [number]: Int)
Number: Int
Number.[number]: Int = [.this]
[main]: Int = {
num:Number = 5
if:Numbered = num
if.[number]
ifa:Numbered = num
ifa.[number]
}
`)
}
@ -173,7 +173,7 @@ declare %Index @write(%File %fd, ptr %buffer, %Index %count)
`
[write fd:File buffer:*Byte count:Index]: Index
Writer: ([write buffer:*:Byte]: Index)
Writer: (~ [write buffer:*:Byte]: Index)
File: I32
File.[write buffer:*:Byte]:Index = [write [.this] [~*Byte buffer] [#buffer]]
@ -208,13 +208,13 @@ define void @main() {
declare %Index @File.write(ptr %this, { ptr, %Index } %buffer)
`,
`
Writer: ([write buffer:*:Byte]: Index)
A: (output: Writer)
Writer: (~ [write buffer:*:Byte]: Index)
A: (. output: Writer)
File: I32
File.[write buffer:*:Byte]:Index
[main] 'main' = {
a:A = (output: [~File 0])
a:A = (. output: [~File 0])
}
`)
}
@ -241,7 +241,7 @@ define i64 @Impl.x(ptr %this) {
}
`,
`
Face: ([x]:Int)
Face: (~ [x]:Int)
Impl: Int
Impl.[x]:Int = 5
[main] 'main' = {

View File

@ -269,7 +269,7 @@ func (this *generator) generateLiteralStructLoc (literal *entity.LiteralStruct,
}
func (this *generator) generateLiteralBoolean (literal *entity.LiteralBoolean) (llvm.Value, error) {
return llvm.NewConstBool(bool(*literal.Value)), nil
return llvm.NewConstBool(bool(literal.Value)), nil
}
func (this *generator) generateLiteralNil (literal *entity.LiteralNil) (llvm.Value, error) {

View File

@ -284,7 +284,7 @@ testString (test,
`,
`
[main] 'main' = {
ta:(x:Int y:(z:Int a:Int)) = (x: 1 y: (z: 2 a: 3))
ta:(.x:Int y:(.z:Int a:Int)) = (.x: 1 y: (.z: 2 a: 3))
}
`)
}
@ -301,9 +301,9 @@ define void @main() {
}
`,
`
A: (x:Int)
A: (.x:Int)
[main] 'main' = {
a:A = (x: 5)
a:A = (.x: 5)
}
`)
}

View File

@ -172,7 +172,7 @@ declare %Index @write(i32 %file, ptr %buffer, %Index %count)
[print string: String] = loop {
if [< [#string] 1] then [break]
[write 1 [~*Byte string] 1]
string = [\string 1:]
string = [\string 1/]
}
`)
}

View File

@ -20,16 +20,16 @@ testString (test,
declare %AllTypes @x()
`,
`
Point: (x:Int y:Int)
Pegasus: (
Point: (.x:Int y:Int)
Pegasus: (~
[clear clouds:*:Point]
[fly rings:*:Point]
[fall distance:Int]
[complete]:Bool)
Rectangle: (
Rectangle: (.
min:Point
max:Point)
AllInts: (
AllInts: (.
bool:Bool
byte:Byte
index:Index
@ -44,12 +44,12 @@ AllInts: (
u16:U16
u32:U32
u64:U64)
AllFloats: (
AllFloats: (.
f32:F32
f64:F64)
Path: *:Point
Quadrangle: 4:Point
AllTypes: (
AllTypes: (.
string:String
pegasus:Pegasus
rectangle:Rectangle
@ -121,7 +121,7 @@ define void @main() {
}
`,
`
A: (x:Int)
A: (.x:Int)
B: A
[main] = {
b:B

5
go.mod
View File

@ -2,7 +2,4 @@ module git.tebibyte.media/sashakoshka/fspl
go 1.21
require (
github.com/alecthomas/participle/v2 v2.1.0
github.com/mewmew/float v0.0.0-20201204173432-505706aa38fa
)
require github.com/mewmew/float v0.0.0-20201204173432-505706aa38fa

8
go.sum
View File

@ -1,10 +1,2 @@
github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0=
github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
github.com/alecthomas/participle/v2 v2.1.0 h1:z7dElHRrOEEq45F2TG5cbQihMtNTv8vwldytDj7Wrz4=
github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c=
github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk=
github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/mewmew/float v0.0.0-20201204173432-505706aa38fa h1:R27wrYHe8Zik4z/EV8xxfoH3cwMJw3qI4xsI3yYkGDQ=
github.com/mewmew/float v0.0.0-20201204173432-505706aa38fa/go.mod h1:O+xb+8ycBNHzJicFVs7GRWtruD4tVZI0huVnw5TM01E=

View File

@ -167,14 +167,20 @@ func (this *Parser) parse () error {
func commaList[ELEMENT any] (items ...ELEMENT) string {
list := ""
for index, item := range items {
if index > 0 && len(items) > 2 {
list += ", "
if index == len(items) - 1 {
list += " or "
switch {
case len(items) == 1: list = fmt.Sprint(items[0])
case len(items) == 2: list = fmt.Sprint(items[0], " or ", items[1])
default:
for index, item := range items {
if index > 0 {
list += ", "
if index == len(items) - 1 {
list += " or "
}
}
list += fmt.Sprintf("%v", item)
}
list += fmt.Sprintf("%v", item)
}
return list
}