literals of rational number, e.g. 1.2(3), are now supported and are evaluated as fractions

This commit is contained in:
Celestino Amoroso 2024-05-14 04:55:16 +02:00
parent f028485caa
commit 4151f3f5e2
3 changed files with 31 additions and 12 deletions

View File

@ -27,6 +27,7 @@ func init() {
registerTermConstructor(SymString, newConstTerm)
registerTermConstructor(SymInteger, newConstTerm)
registerTermConstructor(SymFloat, newConstTerm)
registerTermConstructor(SymFraction, newConstTerm)
registerTermConstructor(SymBool, newConstTerm)
registerTermConstructor(SymKwNil, newConstTerm)
}

View File

@ -385,7 +385,8 @@ func (self *scanner) parseNumber(firstCh byte) (tk *Token) {
}
}
}
if err == nil && (ch == 'e' || ch == 'E') {
if err == nil {
if ch == 'e' || ch == 'E' {
sym = SymFloat
sb.WriteByte(ch)
if ch, err = self.readChar(); err == nil {
@ -398,7 +399,21 @@ func (self *scanner) parseNumber(firstCh byte) (tk *Token) {
sb.WriteByte(ch)
}
} else {
err = errors.New("expected integer exponent")
err = fmt.Errorf("[%d:%d] expected integer exponent, got %c", self.row, self.column, ch)
}
}
} else if ch == '(' {
sym = SymFraction
ch, err = self.readChar()
for ; err == nil && (ch >= '0' && ch <= '9'); ch, err = self.readChar() {
sb.WriteByte(ch)
}
if err == nil {
if ch != ')' {
err = fmt.Errorf("[%d:%d] expected ')', got '%c'", self.row, self.column, ch)
} else {
_, err = self.readChar()
}
}
}
}
@ -412,6 +427,8 @@ func (self *scanner) parseNumber(firstCh byte) (tk *Token) {
txt := sb.String()
if sym == SymFloat {
value, err = strconv.ParseFloat(txt, 64)
} else if sym == SymFraction {
value, err = makeGeneratingFraction(txt)
} else {
value, err = strconv.ParseInt(txt, numBase, 64)
}

View File

@ -73,6 +73,7 @@ const (
SymBool
SymInteger
SymFloat
SymFraction
SymString
SymIterator
SymOr