Added nil (zero initializer) literals
This commit is contained in:
parent
a9ff511496
commit
cd688c91af
|
@ -61,6 +61,8 @@ func (this *Tree) analyzeExpression (
|
|||
return this.analyzeLiteralStruct(into, mode, expression)
|
||||
case *entity.LiteralBoolean:
|
||||
return this.analyzeLiteralBoolean(into, mode, expression)
|
||||
case *entity.LiteralNil:
|
||||
return this.analyzeLiteralNil(into, mode, expression)
|
||||
default:
|
||||
panic(fmt.Sprintf (
|
||||
"BUG: analyzer doesnt know about expression %v, ty: %T",
|
||||
|
|
|
@ -242,6 +242,18 @@ func (this *Tree) analyzeLiteralBoolean (
|
|||
return literal, nil
|
||||
}
|
||||
|
||||
func (this *Tree) analyzeLiteralNil (
|
||||
into entity.Type,
|
||||
mode strictness,
|
||||
literal *entity.LiteralNil,
|
||||
) (
|
||||
entity.Expression,
|
||||
error,
|
||||
) {
|
||||
literal.Ty = into
|
||||
return literal, nil
|
||||
}
|
||||
|
||||
func (this *Tree) assembleStructLiteralMap (
|
||||
literal *entity.LiteralStruct,
|
||||
) (
|
||||
|
|
|
@ -170,3 +170,15 @@ func (this *Boolean) Capture (values []string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
type LiteralNil struct {
|
||||
// Syntax
|
||||
Pos lexer.Position
|
||||
Value string `parser:" @'nil' "`
|
||||
|
||||
// Semantics
|
||||
Ty Type
|
||||
}
|
||||
func (*LiteralNil) expression(){}
|
||||
func (*LiteralNil) statement(){}
|
||||
func (this *LiteralNil) Type () Type { return this.Ty }
|
||||
func (this *LiteralNil) String () string { return this.Value }
|
||||
|
|
|
@ -69,6 +69,8 @@ func (this *generator) generateExpression (expression entity.Expression) (llvm.V
|
|||
return this.generateLiteralFloat(expression)
|
||||
case *entity.LiteralBoolean:
|
||||
return this.generateLiteralBoolean(expression)
|
||||
case *entity.LiteralNil:
|
||||
return this.generateLiteralNil(expression)
|
||||
default:
|
||||
panic(fmt.Sprintf (
|
||||
"BUG: generator doesnt know about expression %v, ty: %T",
|
||||
|
@ -93,7 +95,8 @@ func (this *generator) generateExpressionLoc (expression entity.Expression) (llv
|
|||
*entity.Operation,
|
||||
*entity.LiteralInt,
|
||||
*entity.LiteralFloat,
|
||||
*entity.LiteralBoolean:
|
||||
*entity.LiteralBoolean,
|
||||
*entity.LiteralNil:
|
||||
|
||||
value, err := this.generateExpression(expression)
|
||||
if err != nil { return nil, err }
|
||||
|
|
|
@ -220,3 +220,9 @@ func (this *generator) generateLiteralStructLoc (literal *entity.LiteralStruct)
|
|||
func (this *generator) generateLiteralBoolean (literal *entity.LiteralBoolean) (llvm.Value, error) {
|
||||
return llvm.NewConstBool(bool(*literal.Value)), nil
|
||||
}
|
||||
|
||||
func (this *generator) generateLiteralNil (literal *entity.LiteralNil) (llvm.Value, error) {
|
||||
ty, err := this.generateType(literal.Type())
|
||||
if err != nil { return nil, err }
|
||||
return llvm.NewConstZeroInitializer(ty), nil
|
||||
}
|
||||
|
|
|
@ -513,6 +513,11 @@ func (this *ConstVector) Identifier () string {
|
|||
type ConstZeroInitializer struct {
|
||||
Ty Type
|
||||
}
|
||||
func NewConstZeroInitializer (ty Type) *ConstZeroInitializer {
|
||||
return &ConstZeroInitializer {
|
||||
Ty: ty,
|
||||
}
|
||||
}
|
||||
func (*ConstZeroInitializer) IsConstant () { }
|
||||
func (this *ConstZeroInitializer) Type () Type { return this.Ty }
|
||||
func (this *ConstZeroInitializer) String () string {
|
||||
|
|
|
@ -26,6 +26,7 @@ var parser = participle.MustBuild[Tree] (
|
|||
new(entity.LiteralArray),
|
||||
new(entity.LiteralStruct),
|
||||
new(entity.LiteralBoolean),
|
||||
new(entity.LiteralNil),
|
||||
new(entity.Break),
|
||||
new(entity.Return),
|
||||
new(entity.IfElse),
|
||||
|
@ -50,6 +51,7 @@ var parser = participle.MustBuild[Tree] (
|
|||
new(entity.LiteralArray),
|
||||
new(entity.LiteralStruct),
|
||||
new(entity.LiteralBoolean),
|
||||
new(entity.LiteralNil),
|
||||
new(entity.Break),
|
||||
new(entity.Return),
|
||||
new(entity.Assignment),
|
||||
|
|
Loading…
Reference in New Issue