feat/schema: additional literal types
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user