diff --git a/operand-const.go b/operand-const.go index 5a59674..3d5d423 100644 --- a/operand-const.go +++ b/operand-const.go @@ -27,6 +27,7 @@ func init() { registerTermConstructor(SymString, newConstTerm) registerTermConstructor(SymInteger, newConstTerm) registerTermConstructor(SymFloat, newConstTerm) + registerTermConstructor(SymFraction, newConstTerm) registerTermConstructor(SymBool, newConstTerm) registerTermConstructor(SymKwNil, newConstTerm) } diff --git a/scanner.go b/scanner.go index bc6d8ef..c56fc9f 100644 --- a/scanner.go +++ b/scanner.go @@ -385,20 +385,35 @@ func (self *scanner) parseNumber(firstCh byte) (tk *Token) { } } } - if err == nil && (ch == 'e' || ch == 'E') { - sym = SymFloat - sb.WriteByte(ch) - if ch, err = self.readChar(); err == nil { - if ch == '+' || ch == '-' { - sb.WriteByte(ch) - ch, err = self.readChar() - } - if ch >= '0' && ch <= '9' { - for ; err == nil && (ch >= '0' && ch <= '9'); ch, err = self.readChar() { + if err == nil { + if ch == 'e' || ch == 'E' { + sym = SymFloat + sb.WriteByte(ch) + if ch, err = self.readChar(); err == nil { + if ch == '+' || ch == '-' { sb.WriteByte(ch) + ch, err = self.readChar() + } + if ch >= '0' && ch <= '9' { + for ; err == nil && (ch >= '0' && ch <= '9'); ch, err = self.readChar() { + sb.WriteByte(ch) + } + } else { + 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() } - } else { - err = errors.New("expected integer exponent") } } } @@ -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) } diff --git a/symbol.go b/symbol.go index 7c930a5..7087031 100644 --- a/symbol.go +++ b/symbol.go @@ -73,6 +73,7 @@ const ( SymBool SymInteger SymFloat + SymFraction SymString SymIterator SymOr