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