Beispiel #1
0
 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])
Beispiel #2
0
    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')
Beispiel #3
0
 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())
Beispiel #4
0
    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')
Beispiel #5
0
 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
Beispiel #6
0
 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")
Beispiel #7
0
 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")
Beispiel #8
0
    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')
Beispiel #9
0
 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)
Beispiel #10
0
 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)