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:
commit
05bf1be5ba
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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' = {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
|
|
@ -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/]
|
||||
}
|
||||
`)
|
||||
}
|
||||
|
|
|
@ -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
5
go.mod
|
@ -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
8
go.sum
|
@ -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=
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue