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: 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: 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: Array bounds must be constants\n')
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_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) aa = symbols.ARRAYACCESS.make_node('test', self.arg, lineno=2) self.assertIsNotNone(aa) 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)) aa = symbols.ARRAYACCESS.make_node('test', self.arg, lineno=2) self.assertIsNone(aa) self.assertEqual(self.OUTPUT, "(stdin):2: 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 config.OPTIONS.remove_option('stderr') config.OPTIONS.add_option('stderr', None, StringIO()) config.OPTIONS.add_option_if_not_defined('explicit', None, False)
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 OPTIONS.has_option('stderr'): OPTIONS.remove_option('stderr') OPTIONS.add_option('stderr', type_=None, default_value=StringIO())
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. Calculate offset 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_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)
def setUp(self): self.VALUE = 5 self.value = symbols.NUMBER(self.VALUE, 1) self.a = symbols.ARGLIST( symbols.ARGUMENT(symbols.NUMBER(self.VALUE, 1), 1))
def test_make_node_single2(self): b = symbols.ARGLIST.make_node( None, symbols.ARGUMENT(symbols.NUMBER(self.VALUE, 1), 1)) self.assertIsInstance(b, symbols.ARGLIST) self.assertEqual(len(b), 1) self.assertEqual(b[0], self.value)
def test_args_setter(self): self.a[0] = symbols.ARGUMENT(symbols.NUMBER(self.VALUE + 1, 1), 1) self.assertEqual(self.a[0], self.value + 1)
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)