Author: Juergen Boemmels <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit