Added nil (zero initializer) literals

This commit is contained in:
Sasha Koshka 2023-12-21 23:33:38 -05:00
parent a9ff511496
commit cd688c91af
7 changed files with 43 additions and 1 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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