Author: Juergen Boemmels <boemm...@web.de>
Branch: 
Changeset: r9:5c3fc0d3dfb0
Date: 2011-09-08 23:33 +0200
http://bitbucket.org/pypy/lang-scheme/changeset/5c3fc0d3dfb0/

Log:    Stub a character class, parses and implements simple characters

diff --git a/scheme/object.py b/scheme/object.py
--- a/scheme/object.py
+++ b/scheme/object.py
@@ -129,6 +129,16 @@
     def __repr__(self):
         return "<W_String \"" + self.strval + "\">"
 
+class W_Character(W_Root):
+    def __init__(self, val):
+        self.chrval = val
+
+    def to_string(self):
+        return self.chrval
+
+    def __repr__(self):
+        return "<W_Character #\\" + self.chrval + ">"
+
 class W_Real(W_Root):
     def __init__(self, val):
         self.exact = False
diff --git a/scheme/ssparser.py b/scheme/ssparser.py
--- a/scheme/ssparser.py
+++ b/scheme/ssparser.py
@@ -2,7 +2,7 @@
 from pypy.rlib.parsing.makepackrat import BacktrackException, Status
 from scheme.object import W_Pair, W_Integer, W_String, symbol, \
         w_nil, W_Boolean, W_Real, quote, qq, unquote, unquote_splicing, \
-        w_ellipsis, SchemeSyntaxError
+        w_ellipsis, W_Character, SchemeSyntaxError
 
 def str_unquote(s):
     str_lst = []
@@ -31,6 +31,11 @@
         IGNORE*
         return {W_String(str_unquote(c))};
 
+    CHARACTER:
+        c = `#\\.`
+        IGNORE*
+        return {W_Character(c[2])};
+
     SYMBOL:
         c = `[\+\-\*\^\?a-zA-Z!<=>_~/$%&:][\+\-\*\^\?a-zA-Z0-9!<=>_~/$%&:]*`
         IGNORE*
@@ -100,6 +105,7 @@
       | FIXNUM
       | BOOLEAN
       | SYMBOL
+      | CHARACTER
       | STRING;
 
     list:
diff --git a/scheme/test/test_parser.py b/scheme/test/test_parser.py
--- a/scheme/test/test_parser.py
+++ b/scheme/test/test_parser.py
@@ -1,7 +1,7 @@
 import py
 from scheme.ssparser import parse
 from scheme.object import W_Boolean, W_Real, W_Integer, W_String
-from scheme.object import W_Pair, W_Nil, W_Symbol, W_Symbol
+from scheme.object import W_Pair, W_Nil, W_Symbol, W_Character
 from pypy.rlib.parsing.makepackrat import BacktrackException
 
 def parse_sexpr(expr):
@@ -17,8 +17,8 @@
         return w_obj.strval
     elif isinstance(w_obj, W_Symbol):
         return w_obj.name
-    elif isinstance(w_obj, W_Symbol):
-        return w_obj.name
+    elif isinstance(w_obj, W_Character):
+        return w_obj.chrval
     elif isinstance(w_obj, W_Boolean):
         return w_obj.boolval
     elif isinstance(w_obj, W_Pair):
@@ -39,6 +39,9 @@
     w_fixnum = parse_sexpr('1123')
     assert unwrap(w_fixnum) == 1123
     assert isinstance(w_fixnum, W_Integer)
+    w_char = parse_sexpr('#\\a')
+    assert isinstance(w_char, W_Character)
+    assert unwrap(w_char) == 'a'
 
 def test_symbol():
     w_sym = parse_sexpr('abfa__')
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to