feat/schema: additional literal types

This commit is contained in:
mae
2026-01-28 02:08:12 -06:00
parent 11fcbeb31a
commit dc87bef1c2
11 changed files with 7007 additions and 1484 deletions

View File

@@ -2,6 +2,7 @@ package ast
import (
"azalea/schema/token"
"azalea/schema/util"
"strconv"
"strings"
)
@@ -15,26 +16,41 @@ type Expr struct {
}
type ValList []Val
type Val struct {
string string
number string
name string
string *string
rune *rune
int *int64
float *float64
imaginary *complex128
name *string
*Expr
}
func NewExprList(expr any) (ExprList, error) {
return ExprList{expr.(Expr)}, nil
}
func NewStringVal(val *token.Token) (Val, error) {
return Val{string: string(val.Lit)}, nil
s, err := strconv.Unquote(string(val.Lit))
return Val{string: &s}, err
}
func NewRuneVal(val *token.Token) (Val, error) {
r := util.RuneValue(val.Lit)
return Val{rune: &r}, nil
}
func NewIntVal(val *token.Token) (Val, error) {
i, err := strconv.ParseInt(string(val.Lit), 0, 64)
return Val{int: &i}, err
}
func NewNumberVal(val *token.Token) (Val, error) {
return Val{number: string(val.Lit)}, nil
func NewFloatVal(val *token.Token) (Val, error) {
f, err := strconv.ParseFloat(string(val.Lit), 64)
return Val{float: &f}, err
}
func NewComplexVal(val *token.Token) (Val, error) {
c, err := strconv.ParseComplex(string(val.Lit), 128)
return Val{imaginary: &c}, err
}
func NewNameVal(val *token.Token) (Val, error) {
return Val{name: string(val.Lit)}, nil
name := string(val.Lit)
return Val{name: &name}, nil
}
func NewExprVal(val any) (Val, error) {
@@ -42,6 +58,10 @@ func NewExprVal(val any) (Val, error) {
return Val{Expr: &expr}, nil
}
func NewExprList(expr any) (ExprList, error) {
return ExprList{expr.(Expr)}, nil
}
func AppendExpr(exprList, expr any) (ExprList, error) {
return append(exprList.(ExprList), expr.(Expr)), nil
}
@@ -100,15 +120,23 @@ func (e Expr) String() string {
return sb.String()
}
func (v *Val) String() string {
if v.string != "" {
return v.string
if v.string != nil {
return *v.string
}
if v.number != "" {
num, _ := strconv.ParseInt(v.number, 0, 64)
return strconv.FormatInt(num, 10)
if v.rune != nil {
return string(*v.rune)
}
if v.name != "" {
return v.name
if v.int != nil {
return strconv.FormatInt(*v.int, 10)
}
if v.float != nil {
return strconv.FormatFloat(*v.float, 'g', -1, 64)
}
if v.imaginary != nil {
return strconv.FormatComplex(*v.imaginary, 'g', -1, 128)
}
if v.name != nil {
return *v.name
}
if v.Expr != nil {
return v.Expr.String()