From 70a28abeabc14ff9f219c73852fa6e4fdb607a4e Mon Sep 17 00:00:00 2001
From: James Cash <james.nvc@gmail.com>
Date: Wed, 14 May 2008 02:19:21 -0400
Subject: [PATCH] Adding support of rational numbers to parser

---
 extra/lisp/parser/parser-tests.factor | 8 ++++++++
 extra/lisp/parser/parser.factor       | 8 +++++---
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/extra/lisp/parser/parser-tests.factor b/extra/lisp/parser/parser-tests.factor
index 9e6b54ab0c..98a6d2a6ba 100644
--- a/extra/lisp/parser/parser-tests.factor
+++ b/extra/lisp/parser/parser-tests.factor
@@ -8,6 +8,14 @@ IN: lisp.parser.tests
   "1234" "atom" \ lisp-expr rule parse parse-result-ast
 ] unit-test
 
+{ -42  }  [
+  "-42" "atom" \ lisp-expr rule parse parse-result-ast
+] unit-test
+
+{ 37/52 } [
+  "37/52" "atom" \ lisp-expr rule parse parse-result-ast
+] unit-test
+
 { 123.98 } [
   "123.98" "atom" \ lisp-expr rule parse parse-result-ast
 ] unit-test
diff --git a/extra/lisp/parser/parser.factor b/extra/lisp/parser/parser.factor
index 65ad01aa6f..32886f9367 100644
--- a/extra/lisp/parser/parser.factor
+++ b/extra/lisp/parser/parser.factor
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 James Cash
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel peg.ebnf peg.expr math.parser sequences arrays strings
-combinators.lib ;
+combinators.lib math ;
 
 IN: lisp.parser
 
@@ -18,9 +18,11 @@ RPAREN       = ")"
 dquote       = '"'
 squote       = "'"
 digit        = [0-9]
-integer      = (digit)+                            => [[ string>number ]]
-float        = (digit)+ "." (digit)*               => [[ first3 >string [ >string ] dipd 3append string>number ]]
+integer      = ("-")? (digit)+                           => [[ first2 append string>number ]]
+float        = integer "." (digit)*                      => [[ first3 >string [ number>string ] dipd 3append string>number ]]
+rational     = integer "/" (digit)+                      => [[ first3 nip string>number / ]]
 number       = float
+              | rational
               | integer
 id-specials  = "!" | "$" | "%" | "&" | "*" | "/" | ":" | "<"
               | " =" | ">" | "?" | "^" | "_" | "~" | "+" | "-" | "." | "@"