[pypy-svn] r45020 - in pypy/dist/pypy/interpreter/pyparser: . test
lac at codespeak.net
lac at codespeak.net
Fri Jul 13 14:53:46 CEST 2007
Author: lac
Date: Fri Jul 13 14:53:45 2007
New Revision: 45020
Added:
pypy/dist/pypy/interpreter/pyparser/test/fakes.py (contents, props changed)
pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder_future.py (contents, props changed)
Modified:
pypy/dist/pypy/interpreter/pyparser/astbuilder.py
pypy/dist/pypy/interpreter/pyparser/grammar.py
pypy/dist/pypy/interpreter/pyparser/test/__init__.py
pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py
pypy/dist/pypy/interpreter/pyparser/test/test_parser.py
Log:
- Refactored FakeSpace helper class to a separate file
- Added a dummy builder for future_import_feature
- Ate some of the trailing whitespace
Justas
Modified: pypy/dist/pypy/interpreter/pyparser/astbuilder.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/astbuilder.py (original)
+++ pypy/dist/pypy/interpreter/pyparser/astbuilder.py Fri Jul 13 14:53:45 2007
@@ -1038,6 +1038,7 @@
'while_stmt' : build_while_stmt,
'import_name' : build_import_name,
'import_from' : build_import_from,
+ 'future_import_feature': None,
'yield_stmt' : build_yield_stmt,
'continue_stmt' : build_continue_stmt,
'del_stmt' : build_del_stmt,
Modified: pypy/dist/pypy/interpreter/pyparser/grammar.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/grammar.py (original)
+++ pypy/dist/pypy/interpreter/pyparser/grammar.py Fri Jul 13 14:53:45 2007
@@ -112,7 +112,8 @@
# This attribute is here for convenience
self.debug = debug
# the parser that represent the grammar used
- assert isinstance( parser, Parser )
+ # Commented the assert: this eases the testing
+ #assert isinstance( parser, Parser )
self.parser = parser
def context(self):
@@ -122,13 +123,13 @@
def restore(self, ctx):
"""Accept an opaque context object"""
pass
-
+
def alternative(self, rule, source):
return False
-
+
def sequence(self, rule, source, elts_number):
return False
-
+
def token(self, name, value, source):
return False
@@ -191,7 +192,7 @@
self.stack.append(SyntaxNode(rule.codename, [], source.current_lineno()))
else:
self.stack.append(TempSyntaxNode(rule.codename, [], source.current_lineno()))
-
+
if self.debug:
self.stack[-1].dumpstr()
return True
@@ -674,11 +675,11 @@
else:
# error unknown or negative integer
"""
- # XXX (adim): this is trunk's keyword management
+ # XXX (adim): this is trunk's keyword management
# if (self.value is not None and builder.keywords is not None
# and self.value not in builder.keywords):
# return 0
-
+
ctx = source.context()
tk = source.next()
if tk.codename == self.codename:
@@ -749,7 +750,7 @@
self.symbols = {} # mapping symbol name -> symbol code
self.tokens = { 'NULLTOKEN' : -1 }
self.EmptyToken = Token( self, -1, None )
- self.tok_name = {}
+ self.tok_name = {}
self.tok_values = {}
self.tok_rvalues = {}
self._ann_sym_count = -10
@@ -795,7 +796,7 @@
self.tok_values[value] = val
# XXX : this reverse mapping seemed only to be used
# because of pycodegen visitAugAssign
- self.tok_rvalues[val] = value
+ self.tok_rvalues[val] = value
return val
return self.tokens[ tok ]
@@ -837,10 +838,10 @@
def build_alternative( self, name_id, args ):
# assert isinstance( name_id, int )
assert isinstance(args, list)
- alt = Alternative( self, name_id, args )
+ alt = Alternative( self, name_id, args )
self.all_rules.append( alt )
return alt
-
+
def Alternative_n(self, name, args ):
# assert isinstance(name, str)
name_id = self.add_symbol( name )
@@ -851,7 +852,7 @@
alt = Sequence( self, name_id, args )
self.all_rules.append( alt )
return alt
-
+
def Sequence_n(self, name, args ):
# assert isinstance(name, str)
name_id = self.add_symbol( name )
@@ -862,7 +863,7 @@
alt = KleeneStar( self, name_id, _min, _max, rule )
self.all_rules.append( alt )
return alt
-
+
def KleeneStar_n(self, name, _min = 0, _max = -1, rule = None ):
# assert isinstance(name, str)
name_id = self.add_symbol( name )
Modified: pypy/dist/pypy/interpreter/pyparser/test/__init__.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/test/__init__.py (original)
+++ pypy/dist/pypy/interpreter/pyparser/test/__init__.py Fri Jul 13 14:53:45 2007
@@ -0,0 +1 @@
+
Added: pypy/dist/pypy/interpreter/pyparser/test/fakes.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/interpreter/pyparser/test/fakes.py Fri Jul 13 14:53:45 2007
@@ -0,0 +1,38 @@
+
+class FakeSpace:
+ w_None = None
+ w_str = str
+ w_basestring = basestring
+ w_int = int
+
+ def wrap(self,obj):
+ return obj
+
+ def isinstance(self, obj, wtype ):
+ return isinstance(obj,wtype)
+
+ def is_true(self, obj):
+ return obj
+
+ def eq_w(self, obj1, obj2):
+ return obj1 == obj2
+
+ def is_w(self, obj1, obj2):
+ return obj1 is obj2
+
+ def type(self, obj):
+ return type(obj)
+
+ def newlist(self, lst):
+ return list(lst)
+
+ def newtuple(self, lst):
+ return tuple(lst)
+
+ def call_method(self, obj, meth, *args):
+ return getattr(obj, meth)(*args)
+
+ def call_function(self, func, *args):
+ return func(*args)
+
+ builtin = dict(int=int, long=long, float=float, complex=complex)
Modified: pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py (original)
+++ pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder.py Fri Jul 13 14:53:45 2007
@@ -13,7 +13,7 @@
from pypy.interpreter.astcompiler import ast
-
+from fakes import FakeSpace
from expressions import TESTS, SINGLE_INPUTS, EXEC_INPUTS
def arglist_equal(left,right):
@@ -49,7 +49,7 @@
left_nodes = list(left.getChildren())
right_nodes = list(right.getChildren())
if len(left_nodes) != len(right_nodes):
- print "Number of children mismatch:", left, right
+ print "Number of children mismatch:", left, right
return False
for left_node, right_node in zip(left_nodes, right_nodes):
if not nodes_equal(left_node, right_node, check_lineno):
@@ -60,7 +60,7 @@
return left==right
if left.__class__.__name__ != right.__class__.__name__:
print "Node type mismatch:", left, right
- return False
+ return False
if isinstance(left,test_ast.Function) and isinstance(right,ast_ast.Function):
left_nodes = list(left.getChildren())
right_nodes = [] # generated ast differ here because argnames is a list of nodes in
@@ -118,7 +118,7 @@
if right.value is None:
right_nodes = (ast_ast.Const(None),)
else:
- right_nodes = right.getChildren()
+ right_nodes = right.getChildren()
elif isinstance(left,test_ast.Subscript):
# test_ast.Subscript is not expressive enough to tell the difference
# between a[x] and a[x,] :-(
@@ -131,14 +131,14 @@
left_nodes = left.getChildren()
right_nodes = right.getChildren()
if len(left_nodes)!=len(right_nodes):
- print "Number of children mismatch:", left, right
+ print "Number of children mismatch:", left, right
return False
for i,j in zip(left_nodes,right_nodes):
if not nodes_equal(i,j, check_lineno):
return False
if check_lineno:
# left is a stablecompiler.ast node which means and stable compiler
- # doesn't set a lineno on each Node.
+ # doesn't set a lineno on each Node.
# (stablecompiler.ast.Expression doesn't have a lineno attribute)
if hasattr(left, 'lineno') and left.lineno is not None and left.lineno != right.lineno:
print "(1) (%s) left: %s, right: %s" % (left, left.lineno, right.lineno)
@@ -175,44 +175,6 @@
}
-class FakeSpace:
- w_None = None
- w_str = str
- w_basestring = basestring
- w_int = int
-
- def wrap(self,obj):
- return obj
-
- def isinstance(self, obj, wtype ):
- return isinstance(obj,wtype)
-
- def is_true(self, obj):
- return obj
-
- def eq_w(self, obj1, obj2):
- return obj1 == obj2
-
- def is_w(self, obj1, obj2):
- return obj1 is obj2
-
- def type(self, obj):
- return type(obj)
-
- def newlist(self, lst):
- return list(lst)
-
- def newtuple(self, lst):
- return tuple(lst)
-
- def call_method(self, obj, meth, *args):
- return getattr(obj, meth)(*args)
-
- def call_function(self, func, *args):
- return func(*args)
-
- builtin = dict(int=int, long=long, float=float, complex=complex)
-
# Create parser from Grammar_stable, not current grammar.
stable_parser = pythonparse.make_pyparser('stable')
python_parser = pythonparse.make_pyparser() # 'native') # 2.5a')
@@ -241,7 +203,7 @@
check_lineno = False
print "-" * 30
print "ORIG :", python_ast
- print
+ print
print "BUILT:", pypy_ast
print "-" * 30
assert nodes_equal(python_ast, pypy_ast, check_lineno), 'failed on %r' % (expr)
@@ -258,12 +220,12 @@
yield check_expression, expr, 'exec'
-NEW_GRAMMAR_SNIPPETS = [
+NEW_GRAMMAR_SNIPPETS = [
'snippet_with_1.py',
'snippet_with_2.py',
]
-SNIPPETS = [
+SNIPPETS = [
'snippet_1.py',
'snippet_several_statements.py',
'snippet_simple_function.py',
Added: pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder_future.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/interpreter/pyparser/test/test_astbuilder_future.py Fri Jul 13 14:53:45 2007
@@ -0,0 +1,37 @@
+from pypy.interpreter.pyparser.astbuilder import AstBuilder
+from pypy.interpreter.pyparser.grammar import Parser
+from pypy.interpreter.pyparser.pytoken import setup_tokens
+from fakes import FakeSpace
+
+
+class ParserStub():
+ def __init__(self):
+ self.tokens = {}
+ self._sym_count = 0
+ self.tok_values = {}
+ self.tok_rvalues = {}
+
+ def add_token( self, tok, value = None ):
+ # assert isinstance( tok, str )
+ if not tok in self.tokens:
+ val = self._sym_count
+ self._sym_count += 1
+ self.tokens[tok] = val
+ #self.tok_name[val] = tok
+ if value is not None:
+ self.tok_values[value] = val
+ self.tok_rvalues[val] = value
+ return val
+ return self.tokens[ tok ]
+
+
+class TestBuilderFuture:
+ def setup_class(self):
+ self.parser = ParserStub()
+ setup_tokens(self.parser)
+
+ def setup_method(self, method):
+ self.builder = AstBuilder(self.parser, space=FakeSpace())
+
+ def test_future_rules(self):
+ assert 'future_import_feature' in self.builder.build_rules
Modified: pypy/dist/pypy/interpreter/pyparser/test/test_parser.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyparser/test/test_parser.py (original)
+++ pypy/dist/pypy/interpreter/pyparser/test/test_parser.py Fri Jul 13 14:53:45 2007
@@ -1,5 +1,7 @@
from pypy.interpreter.pyparser.grammar import Parser
from pypy.interpreter.pyparser import error
+from fakes import FakeSpace
+
def test_symbols():
p = Parser()
@@ -42,47 +44,10 @@
v = p.add_symbol( 'sym3' )
assert v == 9
-class FakeSpace:
- w_None = None
- w_str = str
- w_basestring = basestring
- w_int = int
-
- def wrap(self,obj):
- return obj
-
- def isinstance(self, obj, wtype ):
- return isinstance(obj,wtype)
-
- def is_true(self, obj):
- return obj
-
- def eq_w(self, obj1, obj2):
- return obj1 == obj2
-
- def is_w(self, obj1, obj2):
- return obj1 is obj2
-
- def type(self, obj):
- return type(obj)
-
- def newlist(self, lst):
- return list(lst)
-
- def newtuple(self, lst):
- return tuple(lst)
-
- def call_method(self, obj, meth, *args):
- return getattr(obj, meth)(*args)
-
- def call_function(self, func, *args):
- return func(*args)
-
- builtin = dict(int=int, long=long, float=float, complex=complex)
from pypy.interpreter.pyparser.asthelper import get_atoms
class RuleTracer(dict):
-
+
def __init__(self, *args, **kw):
self.trace = []
@@ -92,7 +57,7 @@
'single_input', 'file_input', 'future_import_list',
'import_from_future', 'future_import_as_names']:
return None
-
+
def record_trace(builder, number):
result = [t.value for t in get_atoms(builder, number)]
self.trace.append((attr, result))
@@ -100,7 +65,7 @@
def get(self, attr, default):
return self.__getitem__(attr)
-
+
from pypy.interpreter.pyparser.astbuilder import AstBuilder
class MockBuilder(AstBuilder):
@@ -110,7 +75,7 @@
class TestFuture(object):
-
+
def setup_class(self):
from pypy.interpreter.pyparser.pythonparse import make_pyparser
self.parser = make_pyparser('2.5a')
@@ -121,18 +86,18 @@
def check_parse_mode(self, tst, expected, mode):
self.parser.parse_source(tst, mode, self.builder)
assert self.builder.build_rules.trace == expected
-
+
def check_parse(self, tst, expected):
self.check_parse_mode(tst, expected, 'exec')
self.builder.build_rules.trace = []
self.check_parse_mode(tst, expected, 'single')
-
+
def test_single_future_import(self):
tst = 'from __future__ import na\n'
expected = [('future_import_feature', ['na'])]
self.check_parse(tst, expected)
-
+
def test_double_future_import(self):
tst = 'from __future__ import na, xx\n'
expected = [('future_import_feature', ['na']),
@@ -160,7 +125,7 @@
tst = 'from __future__ import na as x\n'
expected = [('future_import_feature', ['na', 'as', 'x'])]
self.check_parse(tst, expected)
-
+
def test_single_future_as(self):
tst = 'import sys;from __future__ import na as x\n'
expected = []
@@ -174,4 +139,4 @@
tst = 'import sys'
expected = [('import_name', ['import', 'sys'])]
self.check_parse(tst, expected)
-
+
More information about the Pypy-commit
mailing list