mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 08:56:07 +00:00
96 lines
2.1 KiB
Go
96 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math/big"
|
|
"strings"
|
|
)
|
|
|
|
type translateNumber struct {
|
|
number number
|
|
code string
|
|
line int
|
|
}
|
|
|
|
var numberCompile = makeRegex("( *)(-)?((([0-9]+(\\.[0-9]+)?)|(\\.[0-9]+))(e((\\-|\\+)?([0-9]+(\\.[0-9]+)?)))?)( *)")
|
|
var binaryCompile = makeRegex("( *)(-)?(0b[10]+(.\\[10]+)?(e((\\-|\\+)?([0-9]+(\\.[0-9]+)?)))?)( *)")
|
|
var hexCompile = makeRegex("( *)(-)?(0x[a-fA-F0-9]+(\\.[a-fA-F0-9]+)?)( *)")
|
|
var octalCompile = makeRegex("( *)(-)?(0o[0-7]+(\\.[0-7]+)?(e((\\-|\\+)?([0-9]+(\\.[0-9]+)?)))?)( *)")
|
|
|
|
// a number type
|
|
type number = *big.Rat
|
|
|
|
// create a new number type
|
|
func newNumber() *big.Rat {
|
|
return new(big.Rat)
|
|
}
|
|
|
|
func isNumber(code UNPARSEcode) bool {
|
|
return numberCompile.MatchString(code.code) || binaryCompile.MatchString(code.code) || hexCompile.MatchString(code.code) || octalCompile.MatchString(code.code)
|
|
}
|
|
|
|
func isAnyNumber(x any) bool {
|
|
_, ok := x.(number)
|
|
return ok
|
|
}
|
|
|
|
// converts a number type to a string
|
|
func numberToString(num number, fraction int) string {
|
|
if fraction != 0 {
|
|
str := num.RatString()
|
|
if fraction == 1 {
|
|
return str
|
|
}
|
|
split := strings.SplitN(str, "/", 2)
|
|
if len(str) == 1 {
|
|
return split[0]
|
|
}
|
|
numerator := split[0]
|
|
denominator := split[1]
|
|
|
|
super := []string{}
|
|
for i := 0; i <= len(numerator); i++ {
|
|
super = append(super, superscript[numerator[i]])
|
|
}
|
|
sub := []string{}
|
|
for i := 0; i < len(denominator); i++ {
|
|
sub = append(sub, subscript[denominator[i]])
|
|
}
|
|
return strings.Join(super, "") + "/" + strings.Join(sub, "")
|
|
}
|
|
x, _ := num.Float64()
|
|
return fmt.Sprint(x)
|
|
}
|
|
|
|
var superscript = map[byte]string{
|
|
'0': "⁰",
|
|
'1': "¹",
|
|
'2': "²",
|
|
'3': "³",
|
|
'4': "⁴",
|
|
'5': "⁵",
|
|
'6': "⁶",
|
|
'7': "⁷",
|
|
'8': "⁸",
|
|
'9': "⁹",
|
|
}
|
|
|
|
var subscript = map[byte]string{
|
|
'0': "₀",
|
|
'1': "₁",
|
|
'2': "₂",
|
|
'3': "₃",
|
|
'4': "₄",
|
|
'5': "₅",
|
|
'6': "₆",
|
|
'7': "₇",
|
|
'8': "₈",
|
|
'9': "₉",
|
|
}
|
|
|
|
// returns translateNumber, success, error
|
|
func parseNumber(code UNPARSEcode) (number, bool, ArErr, int) {
|
|
output, _ := newNumber().SetString(strings.TrimSpace(code.code))
|
|
return output, true, ArErr{}, 1
|
|
}
|