def setUp(self): STR = "ZXBASIC" self.str_ = symbols.STRING(STR, 1) self.lower = symbols.NUMBER( 1, 1, type_=gl.SYMBOL_TABLE.basic_types[gl.STR_INDEX_TYPE]) self.upper = symbols.NUMBER( 2, 1, type_=gl.SYMBOL_TABLE.basic_types[gl.STR_INDEX_TYPE])
def test_make_node(self): self.clearOutput() l = symbols.NUMBER(2, lineno=1) u = symbols.NUMBER(3, lineno=2) symbols.BOUND.make_node(l, u, 3) self.assertEqual(self.stderr, '') l = symbols.NUMBER(4, lineno=1) symbols.BOUND.make_node(l, u, 3) self.assertEqual( self.stderr, '(stdin):3: error: Lower array bound must be less or equal to upper one\n' ) self.clearOutput() l = symbols.NUMBER(-4, lineno=1) symbols.BOUND.make_node(l, u, 3) self.assertEqual( self.stderr, '(stdin):3: error: Array bounds must be greater than 0\n') self.clearOutput() l = symbols.VAR('a', 10) symbols.BOUND.make_node(l, u, 3) self.assertEqual(self.stderr, '(stdin):3: error: Array bounds must be constants\n')
def setUp(self): zxbpp.init() self.l = symbols.VAR('a', lineno=1, type_=Type.ubyte) self.r = symbols.NUMBER(3, lineno=2) self.b = symbols.BINARY('PLUS', self.l, self.r, lineno=3) self.st = symbols.STRING("ZXBASIC", lineno=1) if 'stderr' in OPTIONS: del OPTIONS.stderr OPTIONS(Action.ADD, name='stderr', default=StringIO())
def setUp(self): zxbpp.init() l1 = 1 l2 = 2 l3 = 3 l4 = 4 b = symbols.BOUND(l1, l2) c = symbols.BOUND(l3, l4) self.bounds = symbols.BOUNDLIST.make_node(None, b, c) self.arr = symbols.VARARRAY('test', self.bounds, 1, type_=Type.ubyte) self.arg = symbols.ARGLIST( symbols.ARGUMENT(symbols.NUMBER(2, 1, type_=Type.uinteger), 1), symbols.ARGUMENT(symbols.NUMBER(3, 1, type_=Type.uinteger), 1)) gl.SYMBOL_TABLE = SymbolTable() # Clears stderr and prepares for capturing it del config.OPTIONS.stderr config.OPTIONS.add_option('stderr', None, StringIO()) config.OPTIONS.add_option_if_not_defined('explicit', None, False) self.aa1 = symbols.ARRAYACCESS(self.arr, self.arg, 2, 'fake-filename')
def visit_ADDRESS(self, node): if node.operand.token != 'ARRAYACCESS': if not chk.is_dynamic(node.operand): node = symbols.CONST(node, node.lineno) elif node.operand.offset is not None: # A constant access if node.operand.scope == SCOPE.global_: # Calculate offset if global variable node = symbols.BINARY.make_node( 'PLUS', symbols.UNARY('ADDRESS', node.operand.entry, node.lineno, type_=self.TYPE(gl.PTR_TYPE)), symbols.NUMBER(node.operand.offset, lineno=node.operand.lineno, type_=self.TYPE(gl.PTR_TYPE)), lineno=node.lineno, func=lambda x, y: x + y ) yield node
def test_make_node_warn(self): gl.SYMBOL_TABLE.declare_array('test', 1, symbols.TYPEREF(self.arr.type_, 1), bounds=self.bounds) self.arg[1] = symbols.ARGUMENT(symbols.NUMBER(9, 1), 1) self.aa2 = symbols.ARRAYACCESS.make_node('test', self.arg, lineno=2, filename='fake-filename') self.assertIsNotNone(self.aa2) self.assertEqual( self.OUTPUT, "(stdin):2: warning: Array 'test' subscript out of range\n")
def test_make_node_fail(self): gl.SYMBOL_TABLE.declare_array('test', 1, symbols.TYPEREF(self.arr.type_, 1), bounds=self.bounds) self.arg = symbols.ARGLIST(symbols.ARGUMENT(symbols.NUMBER(2, 1), 1)) self.aa2 = symbols.ARRAYACCESS.make_node('test', self.arg, lineno=2, filename='fake-filename') self.assertIsNone(self.aa2) self.assertEqual( self.OUTPUT, "(stdin):2: error: Array 'test' has 2 dimensions, not 1\n")
def setUp(self): zxbpp.init() l1 = 1 l2 = 2 l3 = 3 l4 = 4 b = symbols.BOUND(l1, l2) c = symbols.BOUND(l3, l4) self.bounds = symbols.BOUNDLIST.make_node(None, b, c) self.arr = symbols.VARARRAY('test', self.bounds, 1, type_=Type.ubyte) self.arg = symbols.ARGLIST( symbols.ARGUMENT(symbols.NUMBER(2, 1, type_=Type.uinteger), 1), symbols.ARGUMENT(symbols.NUMBER(3, 1, type_=Type.uinteger), 1)) gl.SYMBOL_TABLE = SymbolTable() # Clears stderr and prepares for capturing it del config.OPTIONS.stderr config.OPTIONS(config.Action.ADD, name='stderr', default=StringIO()) config.OPTIONS(config.Action.ADD_IF_NOT_DEFINED, name='explicit', type=bool, default=False) self.aa1 = symbols.ARRAYACCESS(self.arr, self.arg, 2, 'fake-filename')
def test_body_setter(self): body = symbols.BLOCK(symbols.NUMBER(0, lineno=1)) self.f.body = body self.assertEqual(len(self.f.body), len(body)) self.assertEqual(self.f.body, body)
def test_upper__setter(self): s = symbols.STRSLICE(self.str_, self.lower, self.upper, 1) s.upper = symbols.NUMBER( 44, 1, type_=gl.SYMBOL_TABLE.basic_types[gl.STR_INDEX_TYPE]) self.assertEqual(s.upper, 44)