fspl/generator/expression-multiplex.go

70 lines
2.6 KiB
Go

package generator
import "fmt"
import "github.com/llir/llvm/ir/value"
import "git.tebibyte.media/sashakoshka/fspl/entity"
func (this *generator) generateExpression (expression entity.Expression) (value.Value, error) {
switch expression.(type) {
case *entity.Variable:
return this.generateVariable(expression.(*entity.Variable))
case *entity.Call:
return this.generateCall(expression.(*entity.Call))
case *entity.MethodCall:
return this.generateMethodCall(expression.(*entity.MethodCall))
// case *entity.Subscript:
// return this.generateSubscript(expression.(*entity.Subscript))
// case *entity.Slice:
// return this.generateSlice(expression.(*entity.Slice))
// case *entity.Dereference:
// return this.generateDereference(expression.(*entity.Dereference))
// case *entity.Reference:
// return this.generateReference(expression.(*entity.Reference))
// case *entity.ValueCast:
// return this.generateValueCast(expression.(*entity.ValueCast))
// case *entity.BitCast:
// return this.generateBitCast(expression.(*entity.BitCast))
// case *entity.Operation:
// return this.generateOperation(expression.(*entity.Operation))
case *entity.Block:
return this.generateBlock(expression.(*entity.Block))
// case *entity.MemberAccess:
// return this.generateMemberAccess(expression.(*entity.MemberAccess))
// case *entity.IfElse:
// return this.generateIfElse(expression.(*entity.IfElse))
// case *entity.Loop:
// return this.generateLoop(expression.(*entity.Loop))
// case *entity.Break:
// return this.generateBreak(expression.(*entity.Break))
// case *entity.Return:
// return this.generateReturn(expression.(*entity.Return))
case *entity.LiteralInt:
return this.generateLiteralInt(expression.(*entity.LiteralInt))
case *entity.LiteralFloat:
return this.generateLiteralFloat(expression.(*entity.LiteralFloat))
case *entity.LiteralArray:
return this.generateLiteralArray(expression.(*entity.LiteralArray))
// case *entity.LiteralStruct:
// return this.generateLiteralStruct(expression.(*entity.LiteralStruct))
case *entity.LiteralBoolean:
return this.generateLiteralBoolean(expression.(*entity.LiteralBoolean))
default:
panic(fmt.Sprint (
"BUG: generator doesnt know about expression ",
expression))
}
}
func (this *generator) generateStatement (statement entity.Statement) (value.Value, error) {
/*if assignment, ok := statement.(*entity.Assignment); ok {
return this.generateAssignment(assignment)
} else*/ if expression, ok := statement.(entity.Expression); ok {
return this.generateExpression(expression)
} else {
panic(fmt.Sprint (
"BUG: generator doesnt know about statement ",
statement))
}
}