diff --git a/.gitignore b/.gitignore index 18f39cebb..8ab5cf54e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,17 +6,11 @@ .idea/ .python-version .tox/ -/parsetab/parser.out -/parsetab/zxbasmlextab.py -/parsetab/zxbasmtab.py -/parsetab/zxblextab.py -/parsetab/zxbpptab.py -/parsetab/zxbtab.py MANIFEST dist/ examples/*.bin examples/*.tzx scratch/ -.coverage +.coverage/ htmlcov/ build/ diff --git a/arch/zx48k/__init__.py b/arch/zx48k/__init__.py index 5f5aeb583..edbfacaf7 100755 --- a/arch/zx48k/__init__.py +++ b/arch/zx48k/__init__.py @@ -5,8 +5,8 @@ from . import beep from .translator import * # noqa -import api.global_ -from api.constants import TYPE +import src.api.global_ +from src.api.constants import TYPE __all__ = [ @@ -17,10 +17,10 @@ # ----------------------------------------- # Arch initialization setup # ----------------------------------------- -api.global_.PARAM_ALIGN = 2 # Z80 param align -api.global_.BOUND_TYPE = TYPE.uinteger -api.global_.SIZE_TYPE = TYPE.ubyte -api.global_.PTR_TYPE = TYPE.uinteger -api.global_.STR_INDEX_TYPE = TYPE.uinteger -api.global_.MIN_STRSLICE_IDX = 0 # Min. string slicing position -api.global_.MAX_STRSLICE_IDX = 65534 # Max. string slicing position +src.api.global_.PARAM_ALIGN = 2 # Z80 param align +src.api.global_.BOUND_TYPE = TYPE.uinteger +src.api.global_.SIZE_TYPE = TYPE.ubyte +src.api.global_.PTR_TYPE = TYPE.uinteger +src.api.global_.STR_INDEX_TYPE = TYPE.uinteger +src.api.global_.MIN_STRSLICE_IDX = 0 # Min. string slicing position +src.api.global_.MAX_STRSLICE_IDX = 65534 # Max. string slicing position diff --git a/arch/zx48k/backend/__float.py b/arch/zx48k/backend/__float.py index c23389b59..fd7091319 100644 --- a/arch/zx48k/backend/__float.py +++ b/arch/zx48k/backend/__float.py @@ -15,7 +15,7 @@ # ----------------------------------------------------- # Floating Point operators # ----------------------------------------------------- -from api import fp +from src.api import fp def _float(op): diff --git a/arch/zx48k/backend/__init__.py b/arch/zx48k/backend/__init__.py index ef7a89fef..e7be4f410 100644 --- a/arch/zx48k/backend/__init__.py +++ b/arch/zx48k/backend/__init__.py @@ -86,8 +86,8 @@ # External functions from ..optimizer.helpers import HI16, LO16 from arch.zx48k.optimizer.asm import Asm -from api.config import OPTIONS -import api.fp +from src.api.config import OPTIONS +import src.api.fp from arch.zx48k.peephole import engine @@ -488,7 +488,7 @@ def _data(ins): size = "B" q = ['"%s"' % x.replace('"', '""') for x in q] elif t == 'f': - dat_ = [api.fp.immediate_float(float(x)) for x in q] + dat_ = [src.api.fp.immediate_float(float(x)) for x in q] for x in dat_: output.extend(['DEFB %s' % x[0], 'DEFW %s, %s' % (x[1], x[2])]) return output diff --git a/arch/zx48k/backend/__parray.py b/arch/zx48k/backend/__parray.py index 5559dba58..a2ac35d46 100644 --- a/arch/zx48k/backend/__parray.py +++ b/arch/zx48k/backend/__parray.py @@ -9,7 +9,7 @@ # This module contains local array (both parameters and # comparation intermediate-code traductions # -------------------------------------------------------------- -from api import fp +from src.api import fp from .__common import REQUIRES from .__float import _fpush from .__f16 import f16 diff --git a/arch/zx48k/backend/errors.py b/arch/zx48k/backend/errors.py index bd11b63bb..2842a0598 100644 --- a/arch/zx48k/backend/errors.py +++ b/arch/zx48k/backend/errors.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # vim:ts=4:et:sw=4: -from api.errors import Error +from src.api.errors import Error __all__ = ['GenericError', 'InvalidICError', diff --git a/arch/zx48k/optimizer/__init__.py b/arch/zx48k/optimizer/__init__.py index 8b18fe2d9..f22b10c40 100644 --- a/arch/zx48k/optimizer/__init__.py +++ b/arch/zx48k/optimizer/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from api.utils import flatten_list +from src.api.utils import flatten_list from arch.zx48k.peephole import engine from .patterns import RE_PRAGMA, RE_LABEL @@ -9,8 +9,8 @@ from .basicblock import DummyBasicBlock from . import basicblock from .labelinfo import LabelInfo -from api.config import OPTIONS -from api.debug import __DEBUG__ +from src.api.config import OPTIONS +from src.api.debug import __DEBUG__ def init(): diff --git a/arch/zx48k/optimizer/basicblock.py b/arch/zx48k/optimizer/basicblock.py index fa8f6a6cf..6d1cd4640 100644 --- a/arch/zx48k/optimizer/basicblock.py +++ b/arch/zx48k/optimizer/basicblock.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import arch -import api.utils -import api.config +import src.api.utils +import src.api.config -from api.debug import __DEBUG__ -from api.identityset import IdentitySet +from src.api.debug import __DEBUG__ +from src.api.identityset import IdentitySet from .memcell import MemCell from .labelinfo import LabelInfo from .helpers import ALL_REGS, END_PROGRAM_LABEL @@ -389,7 +389,7 @@ def is_used(self, regs, i, top=None): return True - regs = api.utils.flatten_list([helpers.single_registers(x) for x in regs]) # make a copy + regs = src.api.utils.flatten_list([helpers.single_registers(x) for x in regs]) # make a copy for ii in range(i, top): if any(r in regs for r in self.mem[ii].requires): return True @@ -565,7 +565,7 @@ def optimize(self, patterns_list): 'z': str(self.cpu.Z) if self.cpu.Z is not None else helpers.new_tmp_val() }.get(x.lower(), helpers.new_tmp_val()) - if api.config.OPTIONS.optimization > 3: + if src.api.config.OPTIONS.optimization > 3: regs, mems = self.guesses_initial_state_from_origin_blocks() else: regs, mems = {}, {} @@ -591,8 +591,8 @@ def optimize(self, patterns_list): new_code = list(code) matched = new_code[i: i + len(p.patt)] new_code[i: i + len(p.patt)] = p.template.filter(match) - api.errmsg.info('pattern applied [{}:{}]'.format("%03i" % p.flag, p.fname)) - api.debug.__DEBUG__('matched: \n {}'.format('\n '.join(matched)), level=1) + src.api.errmsg.info('pattern applied [{}:{}]'.format("%03i" % p.flag, p.fname)) + src.api.debug.__DEBUG__('matched: \n {}'.format('\n '.join(matched)), level=1) changed = new_code != code if changed: code = new_code diff --git a/arch/zx48k/optimizer/errors.py b/arch/zx48k/optimizer/errors.py index 64a9014f0..0f0d4ba49 100644 --- a/arch/zx48k/optimizer/errors.py +++ b/arch/zx48k/optimizer/errors.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from api.errors import Error +from src.api.errors import Error class DuplicatedLabelError(Error): diff --git a/arch/zx48k/optimizer/labelinfo.py b/arch/zx48k/optimizer/labelinfo.py index 372afe1ac..3ef6f9663 100644 --- a/arch/zx48k/optimizer/labelinfo.py +++ b/arch/zx48k/optimizer/labelinfo.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from api.identityset import IdentitySet +from src.api.identityset import IdentitySet from . import common from . import errors diff --git a/arch/zx48k/optimizer/memcell.py b/arch/zx48k/optimizer/memcell.py index ef7616063..c69232ef7 100644 --- a/arch/zx48k/optimizer/memcell.py +++ b/arch/zx48k/optimizer/memcell.py @@ -5,7 +5,7 @@ from . import helpers from .. import backend from .asm import Asm -from api.utils import flatten_list +from src.api.utils import flatten_list from libzxbasm import asmlex diff --git a/arch/zx48k/peephole/engine.py b/arch/zx48k/peephole/engine.py index ff0e9ed34..32aa32c59 100644 --- a/arch/zx48k/peephole/engine.py +++ b/arch/zx48k/peephole/engine.py @@ -5,7 +5,7 @@ import os from collections import defaultdict, namedtuple -import api +from src import api from arch.zx48k.peephole import evaluator from arch.zx48k.peephole import parser diff --git a/arch/zx48k/peephole/evaluator.py b/arch/zx48k/peephole/evaluator.py index b561f1a9b..f00778412 100644 --- a/arch/zx48k/peephole/evaluator.py +++ b/arch/zx48k/peephole/evaluator.py @@ -2,7 +2,7 @@ import re -from api import utils +from src.api import utils from .template import UnboundVarError from .pattern import RE_SVAR from ..optimizer import helpers diff --git a/arch/zx48k/peephole/parser.py b/arch/zx48k/peephole/parser.py index d04cec856..1e6fa1a5f 100644 --- a/arch/zx48k/peephole/parser.py +++ b/arch/zx48k/peephole/parser.py @@ -4,8 +4,7 @@ import sys import re from collections import defaultdict, namedtuple -import api.errmsg -import api.global_ +import src.api.global_ from . import evaluator from . import pattern @@ -109,11 +108,11 @@ def parse_ifline(if_line, lineno): if tok == ')': paren -= 1 if paren < 0: - api.errmsg.warning(lineno, "Too much closed parenthesis") + src.api.errmsg.warning(lineno, "Too much closed parenthesis") return if expr and expr[-1] == evaluator.OP_COMMA: - api.errmsg.warning(lineno, "missing element in list") + src.api.errmsg.warning(lineno, "missing element in list") return stack[-1].append(expr) @@ -125,7 +124,7 @@ def parse_ifline(if_line, lineno): if tok == evaluator.OP_COMMA: if len(expr) < 2 or expr[-2] == tok: - api.errmsg.warning(lineno, "Unexpected {} in list".format(tok)) + src.api.errmsg.warning(lineno, "Unexpected {} in list".format(tok)) return while len(expr) == 2 and isinstance(expr[-2], str): @@ -139,7 +138,7 @@ def parse_ifline(if_line, lineno): if len(expr) == 3 and expr[1] != evaluator.OP_COMMA: left_, op, right_ = expr if not isinstance(op, str) or op not in IF_OPERATORS: - api.errmsg.warning(lineno, "Unexpected binary operator '{0}'".format(op)) + src.api.errmsg.warning(lineno, "Unexpected binary operator '{0}'".format(op)) return if isinstance(left_, list) and len(left_) == 3 and IF_OPERATORS[left_[-2]] > IF_OPERATORS[op]: expr = [[left_[:-2], left_[-2], [left_[-1], op, right_]]] # Rebalance tree @@ -147,7 +146,7 @@ def parse_ifline(if_line, lineno): expr = [expr] if not error_ and paren: - api.errmsg.warning(lineno, "unclosed parenthesis in IF section") + src.api.errmsg.warning(lineno, "unclosed parenthesis in IF section") return while stack and not error_: @@ -157,16 +156,16 @@ def parse_ifline(if_line, lineno): if len(expr) == 2: op = expr[0] if not isinstance(op, str) or op not in evaluator.UNARY: - api.errmsg.warning(lineno, "unexpected unary operator '{0}'".format(op)) + src.api.errmsg.warning(lineno, "unexpected unary operator '{0}'".format(op)) return elif len(expr) == 3: op = expr[1] if not isinstance(op, str) or op not in evaluator.BINARY: - api.errmsg.warning(lineno, "unexpected binary operator '{0}'".format(op)) + src.api.errmsg.warning(lineno, "unexpected binary operator '{0}'".format(op)) return if error_: - api.errmsg.warning(lineno, "syntax error in IF section") + src.api.errmsg.warning(lineno, "syntax error in IF section") return return flatten(expr) @@ -176,12 +175,12 @@ def parse_define_line(sourceline): """ Given a line $nnn = , returns a tuple the parsed ("$var", [expression]) or None, None if error. """ if '=' not in sourceline.line: - api.errmsg.warning(sourceline.lineno, "assignation '=' not found") + src.api.errmsg.warning(sourceline.lineno, "assignation '=' not found") return None, None result = [x.strip() for x in sourceline.line.split('=', 1)] if not pattern.RE_SVAR.match(result[0]): # Define vars - api.errmsg.warning(sourceline.lineno, "'{0}' not a variable name".format(result[0])) + src.api.errmsg.warning(sourceline.lineno, "'{0}' not a variable name".format(result[0])) return None, None result[1] = parse_ifline(result[1], sourceline.lineno) @@ -210,16 +209,16 @@ def parse_str(spec): def add_entry(key, val): key = key.upper() if key in result: - api.errmsg.warning(line_num, "duplicated definition {0}".format(key)) + src.api.errmsg.warning(line_num, "duplicated definition {0}".format(key)) return False if key not in REGIONS and key not in SCALARS: - api.errmsg.warning(line_num, "unknown definition parameter '{0}'".format(key)) + src.api.errmsg.warning(line_num, "unknown definition parameter '{0}'".format(key)) return False if key in NUMERIC: if not re_int.match(val): - api.errmsg.warning(line_num, "field '{0} must be integer".format(key)) + src.api.errmsg.warning(line_num, "field '{0} must be integer".format(key)) return False val = int(val) @@ -228,7 +227,7 @@ def add_entry(key, val): def check_entry(key): if key not in result: - api.errmsg.warning(line_num, "undefined section {0}".format(key)) + src.api.errmsg.warning(line_num, "undefined section {0}".format(key)) return False return True @@ -265,7 +264,7 @@ def check_entry(key): region_name = None continue - api.errmsg.warning(line_num, "syntax error. Cannot parse file") + src.api.errmsg.warning(line_num, "syntax error. Cannot parse file") is_ok = False break @@ -277,7 +276,7 @@ def check_entry(key): is_ok = False break if var_ in defined_vars: - api.errmsg.warning(source_line.lineno, "duplicated variable '{0}'".format(var_)) + src.api.errmsg.warning(source_line.lineno, "duplicated variable '{0}'".format(var_)) is_ok = False break defines.append([var_, DefineLine(expr=evaluator.Evaluator(expr), lineno=source_line.lineno)]) @@ -297,11 +296,11 @@ def check_entry(key): if is_ok: if not result[REG_REPLACE]: # Empty REPLACE region?? - api.errmsg.warning(line_num, "empty region {0}".format(REG_REPLACE)) + src.api.errmsg.warning(line_num, "empty region {0}".format(REG_REPLACE)) is_ok = False if not is_ok: - api.errmsg.warning(line_num, "this optimizer template will be ignored due to errors") + src.api.errmsg.warning(line_num, "this optimizer template will be ignored due to errors") return return result @@ -310,13 +309,13 @@ def check_entry(key): def parse_file(fname): """ Opens and parse a file given by filename """ - tmp = api.global_.FILENAME - api.global_.FILENAME = fname # set filename so it shows up in error/warning msgs + tmp = src.api.global_.FILENAME + src.api.global_.FILENAME = fname # set filename so it shows up in error/warning msgs with open(fname, 'rt') as f: result = parse_str(f.read()) - api.global_.FILENAME = tmp # restores original filename + src.api.global_.FILENAME = tmp # restores original filename return result diff --git a/arch/zx48k/translator.py b/arch/zx48k/translator.py index a4fad57ce..c14672c91 100644 --- a/arch/zx48k/translator.py +++ b/arch/zx48k/translator.py @@ -3,24 +3,24 @@ from collections import namedtuple -from api.constants import TYPE -from api.constants import SCOPE -from api.constants import CLASS -from api.constants import KIND -from api.constants import CONVENTION - -import api.errmsg -import api.global_ as gl -import api.check as check - -from api.debug import __DEBUG__ -from api.errmsg import error -from api.config import OPTIONS -from api.global_ import optemps -from api.errors import InvalidLoopError -from api.errors import InvalidOperatorError -from api.errors import InvalidBuiltinFunctionError -from api.errors import InternalError +from src.api.constants import TYPE +from src.api.constants import SCOPE +from src.api.constants import CLASS +from src.api.constants import KIND +from src.api.constants import CONVENTION + +import src.api.errmsg +import src.api.global_ as gl +import src.api.check as check + +from src.api.debug import __DEBUG__ +from src.api.errmsg import error +from src.api.config import OPTIONS +from src.api.global_ import optemps +from src.api.errors import InvalidLoopError +from src.api.errors import InvalidOperatorError +from src.api.errors import InvalidBuiltinFunctionError +from src.api.errors import InternalError from libzxbpp import zxbpp from . import backend @@ -436,7 +436,7 @@ def visit_READ(self, node): if isinstance(node.args[0], symbols.ARRAYACCESS): arr = node.args[0] - t = api.global_.optemps.new_t() + t = src.api.global_.optemps.new_t() scope = arr.scope if arr.offset is None: @@ -457,7 +457,7 @@ def visit_READ(self, node): elif scope == SCOPE.local: self.ic_pstore(arr.type_, -(arr.entry.offset - arr.offset), t) else: - self.emit_var_assign(node.args[0], t=api.global_.optemps.new_t()) + self.emit_var_assign(node.args[0], t=src.api.global_.optemps.new_t()) backend.REQUIRES.add('read_restore.asm') # region Control Flow Sentences @@ -1068,7 +1068,7 @@ def visit_LABEL(self, node): def visit_VARDECL(self, node): entry = node.entry if not entry.accessed: - api.errmsg.warning_not_used(entry.lineno, entry.name) + src.api.errmsg.warning_not_used(entry.lineno, entry.name) if self.O_LEVEL > 1: # HINT: Unused vars not compiled return @@ -1093,7 +1093,7 @@ def visit_ARRAYDECL(self, node): assert entry.default_value is None or entry.addr is None, "Cannot use address and default_value at once" if not entry.accessed: - api.errmsg.warning_not_used(entry.lineno, entry.name) + src.api.errmsg.warning_not_used(entry.lineno, entry.name) if self.O_LEVEL > 1: return @@ -1388,7 +1388,7 @@ def visit_FUNCTION(self, node): for local_var in node.local_symbol_table.values(): if not local_var.accessed: # HINT: This should never happens as values() is already filtered - api.errmsg.warning_not_used(local_var.lineno, local_var.name) + src.api.errmsg.warning_not_used(local_var.lineno, local_var.name) # HINT: Cannot optimize local variables now, since the offsets are already calculated # if self.O_LEVEL > 1: # return diff --git a/arch/zx48k/translatorinstvisitor.py b/arch/zx48k/translatorinstvisitor.py index 9448a2a86..cd1c566f7 100644 --- a/arch/zx48k/translatorinstvisitor.py +++ b/arch/zx48k/translatorinstvisitor.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- -from api.constants import TYPE +from src.api.constants import TYPE import symbols from ast_ import NodeVisitor from .backend import Quad, MEMORY -from api.debug import __DEBUG__ +from src.api.debug import __DEBUG__ class TranslatorInstVisitor(NodeVisitor): diff --git a/arch/zx48k/translatorvisitor.py b/arch/zx48k/translatorvisitor.py index f4d509112..a79175750 100644 --- a/arch/zx48k/translatorvisitor.py +++ b/arch/zx48k/translatorvisitor.py @@ -1,15 +1,15 @@ # -*- coding: utf-8 -*- from collections import OrderedDict -from api.errmsg import syntax_error_not_constant -from api.errmsg import syntax_error_cant_convert_to_type -from api.debug import __DEBUG__ +from src.api.errmsg import syntax_error_not_constant +from src.api.errmsg import syntax_error_cant_convert_to_type +from src.api.debug import __DEBUG__ -from api.errors import InvalidCONSTexpr -from api.config import OPTIONS -from api.constants import TYPE -from api.constants import SCOPE -import api.global_ as gl +from src.api.errors import InvalidCONSTexpr +from src.api.config import OPTIONS +from src.api.constants import TYPE +from src.api.constants import SCOPE +import src.api.global_ as gl from symbols.symbol_ import Symbol from symbols.type_ import Type @@ -17,7 +17,7 @@ from . import backend import symbols -from api.errors import InvalidOperatorError +from src.api.errors import InvalidOperatorError from .translatorinstvisitor import TranslatorInstVisitor diff --git a/arch/zxnext/__init__.py b/arch/zxnext/__init__.py index 8ebcf3840..76aaaf70e 100755 --- a/arch/zxnext/__init__.py +++ b/arch/zxnext/__init__.py @@ -8,8 +8,8 @@ from ..zx48k import optimizer # noqa -import api.global_ -from api.constants import TYPE +import src.api.global_ +from src.api.constants import TYPE __all__ = [ @@ -20,10 +20,10 @@ # ----------------------------------------- # Arch initialization setup # ----------------------------------------- -api.global_.PARAM_ALIGN = 2 # Z80 param align -api.global_.BOUND_TYPE = TYPE.uinteger -api.global_.SIZE_TYPE = TYPE.ubyte -api.global_.PTR_TYPE = TYPE.uinteger -api.global_.STR_INDEX_TYPE = TYPE.uinteger -api.global_.MIN_STRSLICE_IDX = 0 # Min. string slicing position -api.global_.MAX_STRSLICE_IDX = 65534 # Max. string slicing position +src.api.global_.PARAM_ALIGN = 2 # Z80 param align +src.api.global_.BOUND_TYPE = TYPE.uinteger +src.api.global_.SIZE_TYPE = TYPE.ubyte +src.api.global_.PTR_TYPE = TYPE.uinteger +src.api.global_.STR_INDEX_TYPE = TYPE.uinteger +src.api.global_.MIN_STRSLICE_IDX = 0 # Min. string slicing position +src.api.global_.MAX_STRSLICE_IDX = 65534 # Max. string slicing position diff --git a/ast_/tree.py b/ast_/tree.py index 059feb3ec..241d40ac3 100644 --- a/ast_/tree.py +++ b/ast_/tree.py @@ -4,7 +4,7 @@ from typing import Optional import collections -from api.errors import Error +from src.api.errors import Error __all__ = ['NotAnAstError', 'Tree'] diff --git a/libzxbasm/asm.py b/libzxbasm/asm.py index 279ee86c7..a882b38ec 100644 --- a/libzxbasm/asm.py +++ b/libzxbasm/asm.py @@ -3,7 +3,7 @@ # vim: ts=4:et:sw=4 from libzxbasm.z80 import Opcode, Z80SET -from api.errors import Error +from src.api.errors import Error import re # Reg. Exp. for counting N args in an asm mnemonic diff --git a/libzxbasm/asmlex.py b/libzxbasm/asmlex.py index a576d8260..c8268fce0 100755 --- a/libzxbasm/asmlex.py +++ b/libzxbasm/asmlex.py @@ -13,8 +13,8 @@ import ply.lex as lex import sys -from api.config import OPTIONS -from api.errmsg import error +from src.api.config import OPTIONS +from src.api.errmsg import error _tokens = ('STRING', 'NEWLINE', 'CO', 'ID', 'COMMA', 'PLUS', 'MINUS', 'LP', 'RP', 'LPP', 'RPP', 'MUL', 'DIV', 'POW', 'MOD', diff --git a/libzxbasm/asmparse.py b/libzxbasm/asmparse.py index 0bc025cc3..40c6b60d9 100755 --- a/libzxbasm/asmparse.py +++ b/libzxbasm/asmparse.py @@ -20,12 +20,12 @@ from .asm import AsmInstruction, Error from ast_ import Ast from ast_.tree import NotAnAstError -from api.debug import __DEBUG__ -from api.config import OPTIONS -from api.errmsg import error as error -from api.errmsg import warning -from api import global_ as gl -import api.utils +from src.api.debug import __DEBUG__ +from src.api.config import OPTIONS +from src.api.errmsg import error +from src.api.errmsg import warning +from src.api import global_ as gl +import src.api.utils from libzxbpp import zxbpp import outfmt @@ -909,7 +909,7 @@ def p_incbin(p): if not fname: p[0] = None return - with api.utils.open_file(fname, 'rb') as f: + with src.api.utils.open_file(fname, 'rb') as f: filecontent = f.read() except IOError: error(p.lineno(2), "cannot read file '%s'" % p[2]) @@ -1522,12 +1522,12 @@ def generate_binary(outputfname, format_, progname='', binary_files=None, headle bin_blocks = [] for fname in binary_files: - with api.utils.open_file(fname) as f: + with src.api.utils.open_file(fname) as f: bin_blocks.append((os.path.basename(fname), f.read())) headless_bin_blocks = [] for fname in headless_binary_files: - with api.utils.open_file(fname) as f: + with src.api.utils.open_file(fname) as f: headless_bin_blocks.append(f.read()) if AUTORUN_ADDR is None: @@ -1582,10 +1582,10 @@ def main(argv): # Z80 only ASM parser -parser = api.utils.get_or_create('asmparse', lambda: yacc.yacc(start="start", debug=True)) +parser = src.api.utils.get_or_create('asmparse', lambda: yacc.yacc(start="start", debug=True)) # needed for ply from .zxnext import * # noqa # ZXNEXT extended Opcodes parser -zxnext_parser = api.utils.get_or_create('zxnext_asmparse', lambda: yacc.yacc(start="start", debug=True)) +zxnext_parser = src.api.utils.get_or_create('zxnext_asmparse', lambda: yacc.yacc(start="start", debug=True)) diff --git a/libzxbasm/basic.py b/libzxbasm/basic.py index a4ea34bd4..860cf0919 100755 --- a/libzxbasm/basic.py +++ b/libzxbasm/basic.py @@ -10,7 +10,7 @@ # This will convert a simple ASCII text to a ZX spectrum BASIC bytes program # ------------------------------------------------------------------------------- -from api import fp +from src.api import fp import outfmt.tzx as tzx ENTER = 0x0D diff --git a/libzxbasm/zxbasm.py b/libzxbasm/zxbasm.py index 38c01c8d4..da7d8d5d7 100755 --- a/libzxbasm/zxbasm.py +++ b/libzxbasm/zxbasm.py @@ -18,9 +18,9 @@ from . import asmparse from libzxbpp import zxbpp -import api.config -from api.config import OPTIONS -from api import global_ +import src.api.config +from src.api.config import OPTIONS +from src.api import global_ # Release version VERSION = '1.13.1' @@ -28,7 +28,7 @@ def main(args=None): # Initializes asm parser state - api.config.init() + src.api.config.init() asmparse.init() zxbpp.init() diff --git a/libzxbc/__init__.py b/libzxbc/__init__.py index b8e80c86a..d1a7c5edc 100644 --- a/libzxbc/__init__.py +++ b/libzxbc/__init__.py @@ -11,4 +11,3 @@ from outfmt import CodeEmitter # noqa from .zxb import main # noqa -import api # noqa \ No newline at end of file diff --git a/libzxbc/zxb.py b/libzxbc/zxb.py index d882c06cd..ff0c0c15f 100755 --- a/libzxbc/zxb.py +++ b/libzxbc/zxb.py @@ -9,10 +9,10 @@ from io import StringIO -import api.debug -import api.config -import api.optimize -from api.utils import open_file +import src.api.debug +import src.api.config +import src.api.optimize +from src.api.utils import open_file from .version import VERSION @@ -20,9 +20,8 @@ from libzxbpp import zxbpp from libzxbasm import asmparse -from api import global_ as gl -from api.config import OPTIONS -from api import debug +from src.api.config import OPTIONS +from src.api import debug, global_ as gl import arch @@ -73,7 +72,7 @@ def main(args=None, emitter=None): You can use zxb.py as a module with import, and this function won't be executed. """ - api.config.init() + src.api.config.init() zxbpp.init() zxbparser.init() arch.target.backend.init() @@ -185,7 +184,7 @@ def main(args=None, emitter=None): arch.set_target_arch(options.arch) backend = arch.target.backend - OPTIONS.org = api.utils.parse_int(options.org) + OPTIONS.org = src.api.utils.parse_int(options.org) if OPTIONS.org is None: parser.error("Invalid --org option '{}'".format(options.org)) @@ -281,7 +280,7 @@ def main(args=None, emitter=None): return 1 # Exit with errors # Optimizations - optimizer = api.optimize.OptimizerVisitor() + optimizer = src.api.optimize.OptimizerVisitor() optimizer.visit(zxbparser.ast) # Emits intermediate code @@ -339,7 +338,7 @@ def main(args=None, emitter=None): backend.MEMORY[:] = [] # This will fill MEMORY with global declared variables - var_checker = api.optimize.VariableVisitor() + var_checker = src.api.optimize.VariableVisitor() var_checker.visit(zxbparser.data_ast) translator = arch.target.VarTranslator() translator.visit(zxbparser.data_ast) diff --git a/libzxbc/zxblex.py b/libzxbc/zxblex.py index 7f40ea8e6..51fb90763 100755 --- a/libzxbc/zxblex.py +++ b/libzxbc/zxblex.py @@ -12,8 +12,8 @@ import sys from ply import lex from .keywords import KEYWORDS as reserved -import api -from api.errmsg import error +from src import api +from src.api.errmsg import error ASM = '' # Set to asm block when commenting diff --git a/libzxbc/zxbparser.py b/libzxbc/zxbparser.py index fb28c76eb..9783702b4 100755 --- a/libzxbc/zxbparser.py +++ b/libzxbc/zxbparser.py @@ -21,32 +21,31 @@ from typing import NamedTuple # Compiler API -import api -from api.debug import __DEBUG__ # analysis:ignore -from api.opcodestemps import OpcodesTemps -from api.errmsg import error -from api.errmsg import warning - -from api.check import check_and_make_label -from api.check import common_type -from api.check import is_dynamic -from api.check import is_null -from api.check import is_number -from api.check import is_numeric -from api.check import is_unsigned -from api.check import is_static -from api.check import is_string - - -from api.constants import CLASS -from api.constants import SCOPE -from api.constants import KIND -from api.constants import CONVENTION - -import api.errmsg -import api.symboltable -import api.config -import api.utils +from src.api.debug import __DEBUG__ # analysis:ignore +from src.api.opcodestemps import OpcodesTemps +from src.api.errmsg import error +from src.api.errmsg import warning + +from src.api.check import check_and_make_label +from src.api.check import common_type +from src.api.check import is_dynamic +from src.api.check import is_null +from src.api.check import is_number +from src.api.check import is_numeric +from src.api.check import is_unsigned +from src.api.check import is_static +from src.api.check import is_string + + +from src.api.constants import CLASS +from src.api.constants import SCOPE +from src.api.constants import KIND +from src.api.constants import CONVENTION + +import src.api.errmsg +import src.api.symboltable +import src.api.config +import src.api.utils # Symbol Classes import symbols @@ -54,20 +53,19 @@ from symbols.symbol_ import Symbol # Global containers -from api import global_ as gl +from src.api import global_ as gl # Lexers and parsers, etc import ply.yacc as yacc from . import zxblex from libzxbpp import zxbpp import arch -from .zxblex import tokens # analysis:ignore -- Needed for PLY. Do not remove. # noqa # ---------------------------------------------------------------------- # Global configuration. Must be refreshed with init() i # if api.config.init() is called # ---------------------------------------------------------------------- -OPTIONS = api.config.OPTIONS +OPTIONS = src.api.config.OPTIONS # ---------------------------------------------------------------------- # Function level entry ID in which scope we are into. If the list @@ -89,7 +87,7 @@ # ---------------------------------------------------------------------- # Global Symbol Table # ---------------------------------------------------------------------- -SYMBOL_TABLE = gl.SYMBOL_TABLE = api.symboltable.SymbolTable() +SYMBOL_TABLE = gl.SYMBOL_TABLE = src.api.symboltable.SymbolTable() # ---------------------------------------------------------------------- # Defined user labels. They all are prepended _label_. Line numbers 10, @@ -152,15 +150,15 @@ def init(): del gl.FUNCTION_CALLS[:] del gl.FUNCTION_LEVEL[:] del gl.FUNCTIONS[:] - SYMBOL_TABLE = gl.SYMBOL_TABLE = api.symboltable.SymbolTable() - OPTIONS = api.config.OPTIONS + SYMBOL_TABLE = gl.SYMBOL_TABLE = src.api.symboltable.SymbolTable() + OPTIONS = src.api.config.OPTIONS # DATAs info gl.DATA_LABELS_REQUIRED.clear() gl.DATA_LABELS.clear() gl.DATA_IS_USED = False del gl.DATAS[:] - gl.DATA_PTR_CURRENT = api.utils.current_data_label() + gl.DATA_PTR_CURRENT = src.api.utils.current_data_label() gl.DATA_FUNCTIONS = [] gl.error_msg_cache.clear() @@ -314,7 +312,7 @@ def make_array_access(id_, lineno, arglist): This is an RVALUE (Read the element) """ for i, arg in enumerate(arglist): - arg.value = make_typecast(TYPE.by_name(api.constants.TYPE.to_string(gl.BOUND_TYPE)), arg.value, arg.lineno) + arg.value = make_typecast(TYPE.by_name(src.api.constants.TYPE.to_string(gl.BOUND_TYPE)), arg.value, arg.lineno) return symbols.ARRAYACCESS.make_node(id_, arglist, lineno) @@ -391,7 +389,7 @@ def make_call(id_, lineno, args): if entry.class_ == CLASS.var: # An already declared/used string var if len(args) > 1: - api.errmsg.syntax_error_not_array_nor_func(lineno, id_) + src.api.errmsg.syntax_error_not_array_nor_func(lineno, id_) return None entry = SYMBOL_TABLE.access_var(id_, lineno) @@ -525,11 +523,11 @@ def p_start(p): return __DEBUG__('Checking pending labels', 1) - if not api.check.check_pending_labels(ast): + if not src.api.check.check_pending_labels(ast): return __DEBUG__('Checking pending calls', 1) - if not api.check.check_pending_calls(): + if not src.api.check.check_pending_calls(): return data_ast = make_sentence('BLOCK') @@ -688,7 +686,7 @@ def p_var_decl_at(p): entry.addr = tmp elif not is_number(p[5]): - api.errmsg.syntax_error_address_must_be_constant(p.lineno(4)) + src.api.errmsg.syntax_error_address_must_be_constant(p.lineno(4)) return else: entry.addr = make_typecast(_TYPE(gl.PTR_TYPE), p[5], p.lineno(4)) @@ -776,7 +774,7 @@ def p_arr_decl_attr(p): error(p.lineno(3), 'Only addresses of identifiers are allowed') return elif not is_number(expr): - api.errmsg.syntax_error_address_must_be_constant(p.lineno(3)) + src.api.errmsg.syntax_error_address_must_be_constant(p.lineno(3)) return arr_entry = SYMBOL_TABLE.access_array(arr_decl[0], arr_decl[1]) @@ -882,7 +880,7 @@ def p_const_vector_elem_list(p): if isinstance(p[1], symbols.UNARY): tmp = make_constexpr(p.lineno(1), p[1]) else: - api.errmsg.syntax_error_not_constant(p.lexer.lineno) + src.api.errmsg.syntax_error_not_constant(p.lexer.lineno) p[0] = None return else: @@ -901,7 +899,7 @@ def p_const_vector_elem_list_list(p): if isinstance(p[3], symbols.UNARY): tmp = make_constexpr(p.lineno(2), p[3]) else: - api.errmsg.syntax_error_not_constant(p.lineno(2)) + src.api.errmsg.syntax_error_not_constant(p.lineno(2)) p[0] = None return else: @@ -1083,7 +1081,7 @@ def p_assignment(p): variable.class_ = CLASS.var if variable.class_ not in (CLASS.var, CLASS.array): - api.errmsg.syntax_error_cannot_assign_not_a_var(p.lineno(i), variable.name) + src.api.errmsg.syntax_error_cannot_assign_not_a_var(p.lineno(i), variable.name) return if variable.class_ == CLASS.var and q1class_ == CLASS.array: @@ -1206,7 +1204,7 @@ def p_substr_assignment_no_let(p): entry.class_ = CLASS.var if p[6].type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(5), p[6].type_) + src.api.errmsg.syntax_error_expected_string(p.lineno(5), p[6].type_) lineno = p.lineno(2) base = make_number(OPTIONS.string_base, lineno, _TYPE(gl.STR_INDEX_TYPE)) @@ -1232,15 +1230,15 @@ def p_substr_assignment(p): entry.class_ = CLASS.var if entry.class_ != CLASS.var: - api.errmsg.syntax_error_cannot_assign_not_a_var(p.lineno(2), p[2]) + src.api.errmsg.syntax_error_cannot_assign_not_a_var(p.lineno(2), p[2]) return if entry.type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(2), entry.type_) + src.api.errmsg.syntax_error_expected_string(p.lineno(2), entry.type_) return if p[5].type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(4), p[5].type_) + src.api.errmsg.syntax_error_expected_string(p.lineno(4), p[5].type_) return if len(p[3]) > 1: @@ -1289,7 +1287,7 @@ def p_str_assign(p): return if r.type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(lineno, r.type_) + src.api.errmsg.syntax_error_expected_string(lineno, r.type_) entry = SYMBOL_TABLE.access_var(q, lineno, default_type=TYPE.string) if entry is None: @@ -1478,7 +1476,7 @@ def p_else_part_label(p): def p_if_then_part(p): """ if_then_part : IF expr then """ if is_number(p[2]): - api.errmsg.warning_condition_is_always(p.lineno(1), bool(p[2].value)) + src.api.errmsg.warning_condition_is_always(p.lineno(1), bool(p[2].value)) p[0] = p[2] @@ -1539,7 +1537,7 @@ def p_next1(p): p3 = p[3] if p3 != gl.LOOPS[-1][1]: - api.errmsg.syntax_error_wrong_for_var(p.lineno(2), gl.LOOPS[-1][1], p3) + src.api.errmsg.syntax_error_wrong_for_var(p.lineno(2), gl.LOOPS[-1][1], p3) p[0] = make_nop() return @@ -1671,9 +1669,9 @@ def p_do_loop_until(p): gl.LOOPS.pop() if is_number(r): - api.errmsg.warning_condition_is_always(p.lineno(3), bool(r.value)) + src.api.errmsg.warning_condition_is_always(p.lineno(3), bool(r.value)) if q is None: - api.errmsg.warning_empty_loop(p.lineno(3)) + src.api.errmsg.warning_empty_loop(p.lineno(3)) def p_data(p): @@ -1710,8 +1708,8 @@ def p_data(p): datas_.append(entry) funcs.append(entry) - gl.DATAS.append(api.utils.DataRef(label_, datas_)) - id_ = api.utils.current_data_label() + gl.DATAS.append(src.api.utils.DataRef(label_, datas_)) + id_ = src.api.utils.current_data_label() gl.DATA_PTR_CURRENT = id_ @@ -1745,20 +1743,20 @@ def p_read(p): return if isinstance(entry, symbols.VARARRAY): - api.errmsg.error(p.lineno(1), "Cannot read '%s'. It's an array" % entry.name) + src.api.errmsg.error(p.lineno(1), "Cannot read '%s'. It's an array" % entry.name) p[0] = None return if isinstance(entry, symbols.VAR): if entry.class_ != CLASS.var: - api.errmsg.syntax_error_cannot_assign_not_a_var(p.lineno(2), entry.name) + src.api.errmsg.syntax_error_cannot_assign_not_a_var(p.lineno(2), entry.name) p[0] = None return entry.accessed = True if entry.type_ == TYPE.auto: entry.type_ = _TYPE(gl.DEFAULT_TYPE) - api.errmsg.warning_implicit_type(p.lineno(2), p[2], entry.type_) + src.api.errmsg.warning_implicit_type(p.lineno(2), p[2], entry.type_) reads.append(make_sentence('READ', entry)) continue @@ -1767,7 +1765,7 @@ def p_read(p): reads.append(make_sentence('READ', symbols.ARRAYACCESS(entry.entry, entry.args, entry.lineno))) continue - api.errmsg.error(p.lineno(1), "Syntax error. Can only read a variable or an array element") + src.api.errmsg.error(p.lineno(1), "Syntax error. Can only read a variable or an array element") p[0] = None return @@ -1793,9 +1791,9 @@ def p_do_loop_while(p): gl.LOOPS.pop() if is_number(r): - api.errmsg.warning_condition_is_always(p.lineno(3), bool(r.value)) + src.api.errmsg.warning_condition_is_always(p.lineno(3), bool(r.value)) if q is None: - api.errmsg.warning_empty_loop(p.lineno(3)) + src.api.errmsg.warning_empty_loop(p.lineno(3)) def p_do_while_loop(p): @@ -1812,7 +1810,7 @@ def p_do_while_loop(p): gl.LOOPS.pop() if is_number(r): - api.errmsg.warning_condition_is_always(p.lineno(2), bool(r.value)) + src.api.errmsg.warning_condition_is_always(p.lineno(2), bool(r.value)) def p_do_until_loop(p): @@ -1829,7 +1827,7 @@ def p_do_until_loop(p): gl.LOOPS.pop() if is_number(r): - api.errmsg.warning_condition_is_always(p.lineno(2), bool(r.value)) + src.api.errmsg.warning_condition_is_always(p.lineno(2), bool(r.value)) def p_do_while_start(p): @@ -1887,7 +1885,7 @@ def p_while_start(p): p[0] = p[2] gl.LOOPS.append(('WHILE',)) if is_number(p[2]) and not p[2].value: - api.errmsg.warning_condition_is_always(p.lineno(1)) + src.api.errmsg.warning_condition_is_always(p.lineno(1)) def p_exit(p): @@ -2168,7 +2166,7 @@ def p_save_code(p): """ expr = p[2] if expr.type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(1), expr.type_) + src.api.errmsg.syntax_error_expected_string(p.lineno(1), expr.type_) if len(p) == 4: if p[3].upper() not in ('SCREEN', 'SCREEN$'): @@ -2192,7 +2190,7 @@ def p_save_data(p): | SAVE expr DATA ID LP RP """ if p[2].type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(1), p[2].type_) + src.api.errmsg.syntax_error_expected_string(p.lineno(1), p[2].type_) if len(p) != 4: entry = SYMBOL_TABLE.access_id(p[4], p.lineno(4)) @@ -2232,7 +2230,7 @@ def p_load_code(p): | load_or_verify expr CODE expr COMMA expr """ if p[2].type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(3), p[2].type_) + src.api.errmsg.syntax_error_expected_string(p.lineno(3), p[2].type_) if len(p) == 4: if p[3].upper() not in ('SCREEN', 'SCREEN$', 'CODE'): @@ -2262,7 +2260,7 @@ def p_load_data(p): | load_or_verify expr DATA ID LP RP """ if p[2].type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(1), p[2].type_) + src.api.errmsg.syntax_error_expected_string(p.lineno(1), p[2].type_) if len(p) != 4: entry = SYMBOL_TABLE.access_id(p[4], p.lineno(4)) @@ -2607,7 +2605,7 @@ def p_id_expr(p): entry.accessed = True if entry.type_ == TYPE.auto: entry.type_ = _TYPE(gl.DEFAULT_TYPE) - api.errmsg.warning_implicit_type(p.lineno(1), p[1], entry.type_) + src.api.errmsg.warning_implicit_type(p.lineno(1), p[1], entry.type_) p[0] = entry @@ -2618,7 +2616,7 @@ def p_id_expr(p): elif entry.kind == KIND.function: # Function call with 0 args p[0] = make_call(p[1], p.lineno(1), make_arg_list(None)) elif entry.kind == KIND.sub: # Forbidden for subs - api.errmsg.syntax_error_is_a_sub_not_a_func(p.lineno(1), p[1]) + src.api.errmsg.syntax_error_is_a_sub_not_a_func(p.lineno(1), p[1]) p[0] = None @@ -2916,10 +2914,10 @@ def p_function_header_pre(p): if not p[3].implicit or p[0].entry.type_ is None or p[0].entry.type_ == TYPE.unknown: p[0].type_ = p[3] if p[3].implicit and p[0].entry.kind == KIND.function: - api.errmsg.warning_implicit_type(p[3].lineno, p[0].entry.name, p[0].type_) + src.api.errmsg.warning_implicit_type(p[3].lineno, p[0].entry.name, p[0].type_) if forwarded and previoustype_ != p[0].type_: - api.errmsg.syntax_error_func_type_mismatch(lineno, p[0].entry) + src.api.errmsg.syntax_error_func_type_mismatch(lineno, p[0].entry) p[0] = None return @@ -2928,7 +2926,7 @@ def p_function_header_pre(p): p2 = p[2].children if len(p1) != len(p2): - api.errmsg.syntax_error_parameter_mismatch(lineno, p[0].entry) + src.api.errmsg.syntax_error_parameter_mismatch(lineno, p[0].entry) p[0] = None return @@ -2938,7 +2936,7 @@ def p_function_header_pre(p): (a.name, p[0].name, b.name)) if a.type_ != b.type_ or a.byref != b.byref: - api.errmsg.syntax_error_parameter_mismatch(lineno, p[0].entry) + src.api.errmsg.syntax_error_parameter_mismatch(lineno, p[0].entry) p[0] = None return @@ -2950,7 +2948,7 @@ def p_function_header_pre(p): return if FUNCTION_LEVEL[-1].kind == KIND.function: - api.check.check_type_is_explicit(p[0].lineno, p[0].entry.name, p[3]) + src.api.check.check_type_is_explicit(p[0].lineno, p[0].entry.name, p[3]) if p[0].entry.convention == CONVENTION.fastcall and len(p[2]) > 1: kind = 'SUB' if FUNCTION_LEVEL[-1].kind == KIND.sub else 'FUNCTION' @@ -3040,7 +3038,7 @@ def p_param_byval_definition(p): if p[0] is not None: if param_def.class_ == CLASS.array: - api.errmsg.syntax_error_cannot_pass_array_by_value(p.lineno(1), param_def.name) + src.api.errmsg.syntax_error_cannot_pass_array_by_value(p.lineno(1), param_def.name) p[0] = None return param_def.byref = False @@ -3069,7 +3067,7 @@ def p_param_def_array(p): lineno = p[1].lineno id_ = p[1].name - api.check.check_type_is_explicit(lineno, id_, typeref) + src.api.check.check_type_is_explicit(lineno, id_, typeref) p[0] = make_param_decl(id_, lineno, typeref, is_array=True) @@ -3079,7 +3077,7 @@ def p_param_def_type(p): id_: Id = p[1] typedef = p[2] if typedef is not None: - api.check.check_type_is_explicit(id_.lineno, id_.name, typedef) + src.api.check.check_type_is_explicit(id_.lineno, id_.name, typedef) p[0] = make_param_decl(id_.name, id_.lineno, typedef) @@ -3310,7 +3308,7 @@ def p_len(p): elif isinstance(arg, symbols.VAR) and arg.class_ == CLASS.array: p[0] = make_number(len(arg.bounds), lineno=p.lineno(1)) # Do constant folding elif arg.type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(1), TYPE.to_string(arg.type_)) + src.api.errmsg.syntax_error_expected_string(p.lineno(1), TYPE.to_string(arg.type_)) p[0] = None elif is_string(arg): # Constant string? p[0] = make_number(len(arg.value), lineno=p.lineno(1)) # Do constant folding @@ -3383,7 +3381,7 @@ def val(s): return x if p[2].type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(1), TYPE.to_string(p[2].type_)) + src.api.errmsg.syntax_error_expected_string(p.lineno(1), TYPE.to_string(p[2].type_)) p[0] = None else: p[0] = make_builtin(p.lineno(1), 'VAL', p[2], lambda x: val(x), type_=TYPE.float_) @@ -3404,7 +3402,7 @@ def asc(x): return if p[2].type_ != TYPE.string: - api.errmsg.syntax_error_expected_string(p.lineno(1), TYPE.to_string(p[2].type_)) + src.api.errmsg.syntax_error_expected_string(p.lineno(1), TYPE.to_string(p[2].type_)) p[0] = None else: p[0] = make_builtin(p.lineno(1), 'CODE', p[2], lambda x: asc(x), type_=TYPE.ubyte) @@ -3503,7 +3501,7 @@ def p_error(p): # ---------------------------------------- # Initialization # ---------------------------------------- -parser = api.utils.get_or_create('zxbparser', lambda: yacc.yacc(debug=True)) +parser = src.api.utils.get_or_create('zxbparser', lambda: yacc.yacc(debug=True)) ast = None data_ast = None # Global Variables AST diff --git a/libzxbpp/prepro/id_.py b/libzxbpp/prepro/id_.py index e7d768329..bdc5a2879 100644 --- a/libzxbpp/prepro/id_.py +++ b/libzxbpp/prepro/id_.py @@ -10,7 +10,7 @@ import copy from .macrocall import MacroCall -from api.debug import __DEBUG__ +from src.api.debug import __DEBUG__ from .output import CURRENT_FILE DEBUG_LEVEL = 3 # Which -d level is required to show debug info diff --git a/libzxbpp/prepro/macrocall.py b/libzxbpp/prepro/macrocall.py index 72c8bc094..d0db0bfc7 100644 --- a/libzxbpp/prepro/macrocall.py +++ b/libzxbpp/prepro/macrocall.py @@ -4,7 +4,7 @@ import copy from .exceptions import PreprocError -from api.debug import __DEBUG__ +from src.api.debug import __DEBUG__ DEBUG_LEVEL = 3 # Which -d level is required to show debug info diff --git a/libzxbpp/prepro/output.py b/libzxbpp/prepro/output.py index c6fba965e..3c19ffda0 100644 --- a/libzxbpp/prepro/output.py +++ b/libzxbpp/prepro/output.py @@ -6,14 +6,14 @@ Need the global OPTION object """ -import api.errmsg +import src.api.errmsg CURRENT_FILE = [] # The current file being processed def error(lineno, str_): - api.errmsg.error(lineno, str_) + src.api.errmsg.error(lineno, str_) def warning(lineno, str_): - api.errmsg.warning(lineno, str_) + src.api.errmsg.warning(lineno, str_) diff --git a/libzxbpp/zxbasmpplex.py b/libzxbpp/zxbasmpplex.py index b835e6baf..bd794ccd1 100755 --- a/libzxbpp/zxbasmpplex.py +++ b/libzxbpp/zxbasmpplex.py @@ -13,7 +13,7 @@ import os import sys from ply import lex -import api.utils +import src.api.utils from libzxbpp.prepro.output import warning, error EOL = '\n' @@ -314,7 +314,7 @@ def include(self, filename): if filename == STDIN: self.input_data = sys.stdin.read() else: - self.input_data = api.utils.read_txt_file(filename) + self.input_data = src.api.utils.read_txt_file(filename) if len(self.input_data) and self.input_data[-1] != EOL: self.input_data += EOL diff --git a/libzxbpp/zxbpp.py b/libzxbpp/zxbpp.py index dbc4711b4..15abcbbfb 100755 --- a/libzxbpp/zxbpp.py +++ b/libzxbpp/zxbpp.py @@ -21,11 +21,12 @@ from . import zxbpplex, zxbasmpplex from ply import yacc -import api -from api.config import OPTIONS -from api import global_ -import api.utils -from .prepro.output import warning, error, CURRENT_FILE +from src.api.config import OPTIONS +from src.api import global_ +import src.api.utils +from .prepro.output import warning +from .prepro.output import error +from .prepro.output import CURRENT_FILE from .prepro import DefinesTable, ID, MacroCall, Arg, ArgList from .prepro.exceptions import PreprocError @@ -125,7 +126,7 @@ def search_filename(fname, lineno, local_first): If local_first is true, it will try first in the current directory of the file being analyzed. """ - fname = api.utils.sanitize_filename(fname) + fname = src.api.utils.sanitize_filename(fname) i_path = [CURRENT_DIR] + INCLUDEPATH if local_first else list(INCLUDEPATH) i_path.extend(OPTIONS.include_path.split(':') if OPTIONS.include_path else []) if os.path.isabs(fname): @@ -133,7 +134,7 @@ def search_filename(fname, lineno, local_first): return fname else: for dir_ in i_path: - path = api.utils.sanitize_filename(os.path.join(dir_, fname)) + path = src.api.utils.sanitize_filename(os.path.join(dir_, fname)) if os.path.exists(path): return path @@ -151,6 +152,8 @@ def include_file(filename, lineno, local_first): This is used when doing a #include "filename". """ global CURRENT_DIR + global CURRENT_FILE + filename = search_filename(filename, lineno, local_first) if filename not in INCLUDED.keys(): INCLUDED[filename] = [] @@ -373,7 +376,7 @@ def p_line_file(p): def p_require_file(p): """ require : REQUIRE STRING NEWLINE """ - p[0] = ['#%s "%s"\n' % (p[1], api.utils.sanitize_filename(p[2]))] + p[0] = ['#%s "%s"\n' % (p[1], src.api.utils.sanitize_filename(p[2]))] def p_init(p): @@ -801,7 +804,7 @@ def main(argv): return global_.has_errors -parser = api.utils.get_or_create('zxbppparse', lambda: yacc.yacc()) +parser = src.api.utils.get_or_create('zxbppparse', lambda: yacc.yacc()) parser.defaulted_states = {} ID_TABLE = DefinesTable() @@ -812,7 +815,7 @@ def entry_point(args=None): if args is None: args = sys.argv[1:] - api.config.init() + src.api.config.init() init() setMode('BASIC') @@ -840,12 +843,12 @@ def entry_point(args=None): if options.stderr: OPTIONS.StdErrFileName = options.stderr - OPTIONS.stderr = api.utils.open_file(OPTIONS.StdErrFileName, 'wt', 'utf-8') + OPTIONS.stderr = src.api.utils.open_file(OPTIONS.StdErrFileName, 'wt', 'utf-8') result = main([options.input_file] if options.input_file else []) if not global_.has_errors: # ok? if options.output_file: - with api.utils.open_file(options.output_file, 'wt', 'utf-8') as output_file: + with src.api.utils.open_file(options.output_file, 'wt', 'utf-8') as output_file: output_file.write(OUTPUT) else: OPTIONS.stdout.write(OUTPUT) diff --git a/libzxbpp/zxbpplex.py b/libzxbpp/zxbpplex.py index a8d5de789..2ac76d23a 100755 --- a/libzxbpp/zxbpplex.py +++ b/libzxbpp/zxbpplex.py @@ -13,7 +13,7 @@ import sys from ply import lex from libzxbpp.prepro.output import warning, error -import api.utils +import src.api.utils EOL = '\n' @@ -410,7 +410,7 @@ def include(self, filename): if filename == STDIN: self.input_data = sys.stdin.read() else: - self.input_data = api.utils.read_txt_file(filename) + self.input_data = src.api.utils.read_txt_file(filename) if len(self.input_data) and self.input_data[-1] != EOL: self.input_data += EOL except IOError: diff --git a/pyproject.toml b/pyproject.toml index efa081c05..a061b0290 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,11 +32,10 @@ classifiers = [ keywords = ['compiler', 'zxspectrum', 'BASIC', 'z80'] # arbitrary keywords packages = [ - { include = "api" }, + { include = "src/**/*" }, { include = "arch/**/*"}, { include = "ast_" }, { include = "outfmt" }, - { include = "parsetab" }, { include = "ply" }, { include = "symbols" }, { include = "libzxbc" }, diff --git a/setup.py b/setup.py index 65db61454..ab914ea9d 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup packages = [ - 'api', + 'src', 'arch', 'arch.zx48k', 'arch.zx48k.backend', @@ -15,7 +15,6 @@ 'libzxbpp', 'libzxbpp.prepro', 'outfmt', - 'parsetab', 'ply', 'symbols' ] diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/api/__init__.py b/src/api/__init__.py similarity index 100% rename from api/__init__.py rename to src/api/__init__.py diff --git a/api/check.py b/src/api/check.py similarity index 98% rename from api/check.py rename to src/api/check.py index 007e0af2b..760a31d93 100644 --- a/api/check.py +++ b/src/api/check.py @@ -13,12 +13,13 @@ from . import global_ from .constants import CLASS from .constants import SCOPE -import api.errmsg +import src.api.errmsg from .errmsg import error __all__ = ['check_type', 'check_is_declared_explicit', + 'check_and_make_label', 'check_type_is_explicit', 'check_call_arguments', 'check_pending_calls', @@ -81,7 +82,7 @@ def check_type_is_explicit(lineno: int, id_: str, type_): assert isinstance(type_, SymbolTYPE) if type_.implicit: if config.OPTIONS.strict: - api.errmsg.syntax_error_undeclared_type(lineno, id_) + src.api.errmsg.syntax_error_undeclared_type(lineno, id_) def check_call_arguments(lineno, id_, args): diff --git a/api/config.py b/src/api/config.py similarity index 100% rename from api/config.py rename to src/api/config.py diff --git a/api/constants.py b/src/api/constants.py similarity index 100% rename from api/constants.py rename to src/api/constants.py diff --git a/api/debug.py b/src/api/debug.py similarity index 100% rename from api/debug.py rename to src/api/debug.py diff --git a/api/decorator.py b/src/api/decorator.py similarity index 100% rename from api/decorator.py rename to src/api/decorator.py diff --git a/api/errmsg.py b/src/api/errmsg.py similarity index 100% rename from api/errmsg.py rename to src/api/errmsg.py diff --git a/api/errors.py b/src/api/errors.py similarity index 89% rename from api/errors.py rename to src/api/errors.py index 8977b0701..a565cf2f1 100644 --- a/api/errors.py +++ b/src/api/errors.py @@ -12,7 +12,14 @@ # ------------------------- ERROR exception classes --------------------------- -__all__ = ['Error'] +__all__ = [ + 'Error', + 'InvalidOperatorError', + 'InvalidLoopError', + 'InvalidCONSTexpr', + 'InvalidBuiltinFunctionError', + 'InternalError' +] class Error(Exception): diff --git a/api/fp.py b/src/api/fp.py similarity index 100% rename from api/fp.py rename to src/api/fp.py diff --git a/api/global_.py b/src/api/global_.py similarity index 100% rename from api/global_.py rename to src/api/global_.py diff --git a/api/identityset.py b/src/api/identityset.py similarity index 100% rename from api/identityset.py rename to src/api/identityset.py diff --git a/api/opcodestemps.py b/src/api/opcodestemps.py similarity index 100% rename from api/opcodestemps.py rename to src/api/opcodestemps.py diff --git a/api/optimize.py b/src/api/optimize.py similarity index 93% rename from api/optimize.py rename to src/api/optimize.py index de11d389b..5249455f5 100644 --- a/api/optimize.py +++ b/src/api/optimize.py @@ -4,17 +4,16 @@ from typing import NamedTuple from ast_ import NodeVisitor from .config import OPTIONS -import api.errmsg -from api.errmsg import warning -import api.check as chk -from api.constants import TYPE, SCOPE, CLASS -import api.global_ as gl +from src.api.errmsg import warning +import src.api.check as chk +from src.api.constants import TYPE, SCOPE, CLASS +import src.api.global_ as gl import symbols import types -from api.debug import __DEBUG__ -from api.errmsg import warning_not_used -import api.utils -import api.symboltable +from src.api.debug import __DEBUG__ +from src.api.errmsg import warning_not_used +import src.api.utils +import src.api.symboltable class ToVisit(object): @@ -118,7 +117,7 @@ def visit_CHR(self, node): if all(chk.is_static(arg.value) for arg in node.operand): yield symbols.STRING(''.join( - chr(api.utils.get_final_value(x.value) & 0xFF) for x in node.operand), node.lineno) + chr(src.api.utils.get_final_value(x.value) & 0xFF) for x in node.operand), node.lineno) else: yield node @@ -203,7 +202,7 @@ def visit_IF(self, node): if self.O_LEVEL >= 1: if chk.is_null(then_, else_): - api.errmsg.warning_empty_if(node.lineno) + src.api.errmsg.warning_empty_if(node.lineno) yield self.NOP return @@ -296,7 +295,7 @@ def _update_bound_status(self, arg: symbols.VARARRAY): return if arg.scope == SCOPE.local and not arg.byref: - arg.scopeRef.owner.locals_size = api.symboltable.SymbolTable.compute_offsets(arg.scopeRef) + arg.scopeRef.owner.locals_size = src.api.symboltable.SymbolTable.compute_offsets(arg.scopeRef) class VarDependency(NamedTuple): @@ -319,9 +318,10 @@ def generic_visit(node): def has_circular_dependency(self, var_dependency: VarDependency) -> bool: if var_dependency.dependency == VariableVisitor._original_variable: - api.errmsg.error(VariableVisitor._original_variable.lineno, - "Circular dependency between '{}' and '{}'".format( - VariableVisitor._original_variable.name, var_dependency.parent)) + src.api.errmsg.error( + VariableVisitor._original_variable.lineno, + "Circular dependency between '{}' and '{}'".format(VariableVisitor._original_variable.name, + var_dependency.parent)) return True return False diff --git a/api/options.py b/src/api/options.py similarity index 100% rename from api/options.py rename to src/api/options.py diff --git a/api/symboltable.py b/src/api/symboltable.py similarity index 100% rename from api/symboltable.py rename to src/api/symboltable.py diff --git a/api/utils.py b/src/api/utils.py similarity index 100% rename from api/utils.py rename to src/api/utils.py diff --git a/parsetab/__init__.py b/src/parsetab/__init__.py similarity index 95% rename from parsetab/__init__.py rename to src/parsetab/__init__.py index 586a5fd94..faa18be5b 100644 --- a/parsetab/__init__.py +++ b/src/parsetab/__init__.py @@ -1,4 +1,2 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- - - diff --git a/parsetab/tabs.dbm.bak b/src/parsetab/tabs.dbm.bak similarity index 100% rename from parsetab/tabs.dbm.bak rename to src/parsetab/tabs.dbm.bak diff --git a/parsetab/tabs.dbm.dat b/src/parsetab/tabs.dbm.dat similarity index 100% rename from parsetab/tabs.dbm.dat rename to src/parsetab/tabs.dbm.dat diff --git a/parsetab/tabs.dbm.dir b/src/parsetab/tabs.dbm.dir similarity index 100% rename from parsetab/tabs.dbm.dir rename to src/parsetab/tabs.dbm.dir diff --git a/symbols/argument.py b/symbols/argument.py index 7239d0ae6..1de2c02f4 100644 --- a/symbols/argument.py +++ b/symbols/argument.py @@ -13,9 +13,9 @@ from .symbol_ import Symbol from .typecast import SymbolTYPECAST from .var import SymbolVAR -from api.config import OPTIONS -from api.constants import SCOPE -from api.constants import CLASS +from src.api.config import OPTIONS +from src.api.constants import SCOPE +from src.api.constants import CLASS class SymbolARGUMENT(Symbol): diff --git a/symbols/arrayaccess.py b/symbols/arrayaccess.py index 9e56431b8..4e5a3869d 100644 --- a/symbols/arrayaccess.py +++ b/symbols/arrayaccess.py @@ -9,12 +9,12 @@ # the GNU General License # ---------------------------------------------------------------------- -import api.global_ as gl -from api.errmsg import error -from api.errmsg import warning -from api.check import is_number -from api.check import is_const -from api.constants import SCOPE +import src.api.global_ as gl +from src.api.errmsg import error +from src.api.errmsg import warning +from src.api.check import is_number +from src.api.check import is_const +from src.api.constants import SCOPE from .call import SymbolCALL from .number import SymbolNUMBER as NUMBER diff --git a/symbols/binary.py b/symbols/binary.py index a7b158632..7c848a7d7 100644 --- a/symbols/binary.py +++ b/symbols/binary.py @@ -16,13 +16,13 @@ from .typecast import SymbolTYPECAST from .type_ import Type as TYPE -from api.check import common_type -from api.check import is_const -from api.check import is_number -from api.check import is_static -from api.check import is_numeric -from api.check import is_string -from api.errmsg import error +from src.api.check import common_type +from src.api.check import is_const +from src.api.check import is_number +from src.api.check import is_static +from src.api.check import is_numeric +from src.api.check import is_string +from src.api.errmsg import error class SymbolBINARY(Symbol): diff --git a/symbols/block.py b/symbols/block.py index 35fa6d4b6..e66f81e64 100644 --- a/symbols/block.py +++ b/symbols/block.py @@ -9,7 +9,7 @@ # the GNU General License v3 # ---------------------------------------------------------------------- -from api.check import is_null +from src.api.check import is_null from .symbol_ import Symbol diff --git a/symbols/bound.py b/symbols/bound.py index 9b329ae09..d9dafcc1a 100644 --- a/symbols/bound.py +++ b/symbols/bound.py @@ -12,8 +12,8 @@ from .symbol_ import Symbol from .number import SymbolNUMBER from .var import SymbolVAR -from api.check import is_static -from api.errmsg import error +from src.api.check import is_static +from src.api.errmsg import error class SymbolBOUND(Symbol): diff --git a/symbols/builtin.py b/symbols/builtin.py index ad6094ef9..51cc6d7a8 100644 --- a/symbols/builtin.py +++ b/symbols/builtin.py @@ -13,8 +13,8 @@ from .number import SymbolNUMBER from .type_ import SymbolTYPE -from api.check import is_number -from api.check import is_string +from src.api.check import is_number +from src.api.check import is_string class SymbolBUILTIN(Symbol): diff --git a/symbols/call.py b/symbols/call.py index 49a0666be..72cc770b2 100644 --- a/symbols/call.py +++ b/symbols/call.py @@ -11,10 +11,10 @@ from typing import Iterable -import api.global_ as gl -from api.check import check_call_arguments -from api.constants import CLASS -import api.errmsg as errmsg +import src.api.global_ as gl +from src.api.check import check_call_arguments +from src.api.constants import CLASS +from src import api as errmsg from .symbol_ import Symbol from .function import SymbolFUNCTION diff --git a/symbols/const.py b/symbols/const.py index f8786c281..f8f7df023 100644 --- a/symbols/const.py +++ b/symbols/const.py @@ -9,7 +9,7 @@ # the GNU General License # ---------------------------------------------------------------------- -import api.global_ as gl +import src.api.global_ as gl from .symbol_ import Symbol # ---------------------------------------------------------------------- diff --git a/symbols/funcdecl.py b/symbols/funcdecl.py index 07e04a792..6f20a6304 100644 --- a/symbols/funcdecl.py +++ b/symbols/funcdecl.py @@ -9,8 +9,8 @@ # the GNU General License # ---------------------------------------------------------------------- -from api import global_ -import api.symboltable +from src.api import global_ +import src.api.symboltable from .symbol_ import Symbol from .function import SymbolFUNCTION @@ -50,7 +50,7 @@ def local_symbol_table(self): @local_symbol_table.setter def local_symbol_table(self, value): - assert isinstance(value, api.symboltable.SymbolTable.Scope) + assert isinstance(value, src.api.symboltable.SymbolTable.Scope) self.entry.local_symbol_table = value @property diff --git a/symbols/function.py b/symbols/function.py index 15e7e2890..3e8a20ecf 100644 --- a/symbols/function.py +++ b/symbols/function.py @@ -10,9 +10,9 @@ # ---------------------------------------------------------------------- from typing import Optional -from api.constants import CLASS -from api.constants import KIND -import api.errmsg +from src.api.constants import CLASS +from src.api.constants import KIND +import src.api.errmsg from .var import SymbolVAR from .paramlist import SymbolPARAMLIST from .block import SymbolBLOCK @@ -48,8 +48,8 @@ def set_kind(self, value, lineno): if self.__kind != KIND.unknown and self.__kind != value: q = KIND.to_string(KIND.sub) if self.__kind == KIND.function else KIND.to_string(KIND.function) - api.errmsg.error(lineno, "'%s' is a %s, not a %s" % - (self.name, KIND.to_string(self.__kind).upper(), q.upper())) + src.api.errmsg.error(lineno, "'%s' is a %s, not a %s" % + (self.name, KIND.to_string(self.__kind).upper(), q.upper())) self.__kind = value @property diff --git a/symbols/label.py b/symbols/label.py index d05758944..53cb6eea7 100644 --- a/symbols/label.py +++ b/symbols/label.py @@ -9,7 +9,7 @@ # the GNU General License # ---------------------------------------------------------------------- -from api.constants import CLASS +from src.api.constants import CLASS from .var import SymbolVAR from .symbol_ import Symbol diff --git a/symbols/number.py b/symbols/number.py index 1aad2c586..35963bf03 100644 --- a/symbols/number.py +++ b/symbols/number.py @@ -11,7 +11,7 @@ import numbers -from api.constants import CLASS +from src.api.constants import CLASS from .symbol_ import Symbol from .type_ import SymbolTYPE from .type_ import Type as TYPE diff --git a/symbols/paramdecl.py b/symbols/paramdecl.py index 75c5f3c31..6f1bfe2e7 100644 --- a/symbols/paramdecl.py +++ b/symbols/paramdecl.py @@ -9,10 +9,10 @@ # the GNU General License # ---------------------------------------------------------------------- -from api.constants import CLASS -from api.constants import SCOPE -from api.config import OPTIONS -import api.global_ as gl +from src.api.constants import CLASS +from src.api.constants import SCOPE +from src.api.config import OPTIONS +import src.api.global_ as gl from .type_ import SymbolBASICTYPE as BasicType from .var import SymbolVAR diff --git a/symbols/string_.py b/symbols/string_.py index 96a9e7978..f4511ac13 100644 --- a/symbols/string_.py +++ b/symbols/string_.py @@ -9,7 +9,7 @@ # the GNU General License # ---------------------------------------------------------------------- -from api.constants import CLASS +from src.api.constants import CLASS from .symbol_ import Symbol from .type_ import Type diff --git a/symbols/strslice.py b/symbols/strslice.py index 831c6e874..351461369 100644 --- a/symbols/strslice.py +++ b/symbols/strslice.py @@ -16,11 +16,11 @@ from .string_ import SymbolSTRING as STRING from .type_ import Type -import api.config -from api.check import check_type -from api.check import is_number +import src.api.config +from src.api.check import check_type +from src.api.check import is_number -import api.global_ as gl +import src.api.global_ as gl class SymbolSTRSLICE(Symbol): @@ -80,7 +80,7 @@ def make_node(cls, lineno, s, lower, upper): return None lo = up = None - base = NUMBER(api.config.OPTIONS.string_base, lineno=lineno) + base = NUMBER(src.api.config.OPTIONS.string_base, lineno=lineno) lower = TYPECAST.make_node(gl.SYMBOL_TABLE.basic_types[gl.STR_INDEX_TYPE], BINARY.make_node('MINUS', lower, base, lineno=lineno, func=lambda x, y: x - y), lineno) diff --git a/symbols/symbol_.py b/symbols/symbol_.py index 527bb08ca..aa3b19218 100644 --- a/symbols/symbol_.py +++ b/symbols/symbol_.py @@ -13,7 +13,7 @@ from collections import Counter from ast_ import Ast -import api.global_ +import src.api.global_ class Symbol(Ast): @@ -72,7 +72,7 @@ def __repr__(self): @property def t(self): if self._t is None: - self._t = api.global_.optemps.new_t() + self._t = src.api.global_.optemps.new_t() return self._t diff --git a/symbols/type_.py b/symbols/type_.py index d49b4113d..869675692 100644 --- a/symbols/type_.py +++ b/symbols/type_.py @@ -9,10 +9,10 @@ # the GNU General License # ---------------------------------------------------------------------- -from api.constants import TYPE -from api.constants import CLASS -from api.config import OPTIONS -from api.decorator import classproperty +from src.api.constants import TYPE +from src.api.constants import CLASS +from src.api.config import OPTIONS +from src.api.decorator import classproperty from .symbol_ import Symbol diff --git a/symbols/typecast.py b/symbols/typecast.py index 5fca2df45..db156b913 100644 --- a/symbols/typecast.py +++ b/symbols/typecast.py @@ -15,11 +15,11 @@ from .number import SymbolNUMBER from .vararray import SymbolVARARRAY -from api.errmsg import error -from api import errmsg -from api.check import is_number -from api.check import is_CONST -from api.check import is_const +from src.api.errmsg import error +from src.api import errmsg +from src.api.check import is_number +from src.api.check import is_CONST +from src.api.check import is_const class SymbolTYPECAST(Symbol): diff --git a/symbols/unary.py b/symbols/unary.py index cf0595cd7..1f9434070 100644 --- a/symbols/unary.py +++ b/symbols/unary.py @@ -16,8 +16,8 @@ from .type_ import SymbolTYPE from .type_ import Type as TYPE -from api.check import is_number -from api.check import is_string +from src.api.check import is_number +from src.api.check import is_string class SymbolUNARY(Symbol): diff --git a/symbols/var.py b/symbols/var.py index 8f88b71c6..9188e67af 100644 --- a/symbols/var.py +++ b/symbols/var.py @@ -9,11 +9,11 @@ # the GNU General License # ---------------------------------------------------------------------- -from api import global_ -from api.config import OPTIONS -from api.constants import SCOPE -from api.constants import KIND -from api.constants import CLASS +from src.api import global_ +from src.api.config import OPTIONS +from src.api.constants import SCOPE +from src.api.constants import KIND +from src.api.constants import CLASS from .symbol_ import Symbol from .type_ import SymbolTYPE diff --git a/symbols/vararray.py b/symbols/vararray.py index 6e3262f7e..ede353397 100644 --- a/symbols/vararray.py +++ b/symbols/vararray.py @@ -11,10 +11,10 @@ import functools -import api.global_ as gl -from api.constants import TYPE -from api.constants import CLASS -from api.constants import SCOPE +import src.api.global_ as gl +from src.api.constants import TYPE +from src.api.constants import CLASS +from src.api.constants import SCOPE from .var import SymbolVAR from .boundlist import SymbolBOUNDLIST diff --git a/tests/api/test_config.py b/tests/api/test_config.py index 185134daf..a62729add 100644 --- a/tests/api/test_config.py +++ b/tests/api/test_config.py @@ -3,8 +3,7 @@ import unittest import sys -from api import config -from api import global_ +from src.api import config, global_ class TestConfig(unittest.TestCase): diff --git a/tests/api/test_symbolTable.py b/tests/api/test_symbolTable.py index 5d2948c84..010daff80 100644 --- a/tests/api/test_symbolTable.py +++ b/tests/api/test_symbolTable.py @@ -5,13 +5,13 @@ from unittest import TestCase from six import StringIO -from api.symboltable import SymbolTable -from api.constants import TYPE -from api.constants import SCOPE -from api.constants import CLASS -from api.constants import DEPRECATED_SUFFIXES -from api.config import OPTIONS -import api.global_ as gl_ +from src.api.symboltable import SymbolTable +from src.api.constants import TYPE +from src.api.constants import SCOPE +from src.api.constants import CLASS +from src.api.constants import DEPRECATED_SUFFIXES +from src.api.config import OPTIONS +import src.api.global_ as gl_ import symbols diff --git a/tests/functional/test.py b/tests/functional/test.py index 59b8f26b0..2fc8f0f15 100755 --- a/tests/functional/test.py +++ b/tests/functional/test.py @@ -30,7 +30,7 @@ sys.path.append(ZXBASIC_ROOT) # TODO: consider moving test.py to another place to avoid this # Now we can import the modules from the root -import api.utils # noqa +import src.api.utils # noqa import libzxbc # noqa import libzxbasm # noqa import libzxbpp # noqa @@ -109,7 +109,7 @@ def get_file_lines(filename, ignore_regexp=None, replace_regexp=None, """ Opens source file and load its lines, discarding those not important for comparison. """ - from api.utils import open_file + from src.api.utils import open_file with open_file(filename, 'rt', 'utf-8') as f: lines = [x for x in f] @@ -237,11 +237,11 @@ def updateTest(tfname, pattern_): lines = get_file_lines(tfname, replace_regexp=pattern_, replace_what=ZXBASIC_ROOT, replace_with=_original_root) - with libzxbc.api.utils.open_file(tfname, 'wt', encoding='utf-8') as f: + with src.api.utils.open_file(tfname, 'wt', encoding='utf-8') as f: f.write(''.join(lines)) -@api.utils.timeout(TIMEOUT) +@src.api.utils.timeout(TIMEOUT) def testPREPRO(fname, pattern_=None, inline=None, cmdline_args=None): """ Test preprocessing file. Test is done by preprocessing the file and then comparing the output against an expected one. The output file can optionally be filtered @@ -300,7 +300,7 @@ def testPREPRO(fname, pattern_=None, inline=None, cmdline_args=None): return result -@api.utils.timeout(TIMEOUT) +@src.api.utils.timeout(TIMEOUT) def testASM(fname, inline=None, cmdline_args=None): """ Test assembling an ASM (.asm) file. Test is done by assembling the source code into a binary and then comparing the output file against an expected binary output. @@ -343,7 +343,7 @@ def testASM(fname, inline=None, cmdline_args=None): return result -@api.utils.timeout(TIMEOUT) +@src.api.utils.timeout(TIMEOUT) def testBAS(fname, filter_=None, inline=None, cmdline_args=None): """ Test compiling a BASIC (.bas) file. Test is done by compiling the source code into asm and then comparing the output asm against an expected asm output. The output asm file can optionally be filtered diff --git a/tests/symbols/test_symbolARRAYACCESS.py b/tests/symbols/test_symbolARRAYACCESS.py index a8bdef490..220b072a2 100644 --- a/tests/symbols/test_symbolARRAYACCESS.py +++ b/tests/symbols/test_symbolARRAYACCESS.py @@ -6,9 +6,9 @@ import arch.zx48k # noqa initializes arch import symbols -import api.global_ as gl -import api.config as config -from api.symboltable import SymbolTable +import src.api.global_ as gl +import src.api.config as config +from src.api.symboltable import SymbolTable from symbols.type_ import Type from libzxbpp import zxbpp diff --git a/tests/symbols/test_symbolBASICTYPE.py b/tests/symbols/test_symbolBASICTYPE.py index 0b459836d..0108ffb9b 100644 --- a/tests/symbols/test_symbolBASICTYPE.py +++ b/tests/symbols/test_symbolBASICTYPE.py @@ -5,7 +5,7 @@ from unittest import TestCase -from api.constants import TYPE +from src.api.constants import TYPE from symbols.type_ import SymbolBASICTYPE from symbols.type_ import Type diff --git a/tests/symbols/test_symbolBINARY.py b/tests/symbols/test_symbolBINARY.py index 511b50d98..23b20d7cf 100644 --- a/tests/symbols/test_symbolBINARY.py +++ b/tests/symbols/test_symbolBINARY.py @@ -4,7 +4,7 @@ from unittest import TestCase from six import StringIO -from api.config import OPTIONS +from src.api.config import OPTIONS import symbols from symbols.type_ import Type from libzxbpp import zxbpp diff --git a/tests/symbols/test_symbolBOUND.py b/tests/symbols/test_symbolBOUND.py index 1751cf19c..83de9a164 100644 --- a/tests/symbols/test_symbolBOUND.py +++ b/tests/symbols/test_symbolBOUND.py @@ -5,7 +5,7 @@ from unittest import TestCase from six import StringIO -from api.config import OPTIONS +from src.api.config import OPTIONS import symbols from libzxbpp import zxbpp diff --git a/tests/symbols/test_symbolFUNCDECL.py b/tests/symbols/test_symbolFUNCDECL.py index 12f5af324..802bf3c41 100644 --- a/tests/symbols/test_symbolFUNCDECL.py +++ b/tests/symbols/test_symbolFUNCDECL.py @@ -3,8 +3,8 @@ import unittest from unittest import TestCase -import api.global_ as gl -import api.symboltable +import src.api.global_ as gl +import src.api.symboltable from symbols import FUNCDECL from symbols.type_ import Type @@ -12,7 +12,7 @@ class TestSymbolFUNCDECL(TestCase): def setUp(self): - api.global_.SYMBOL_TABLE = api.symboltable.SymbolTable() + src.api.global_.SYMBOL_TABLE = src.api.symboltable.SymbolTable() self.f = gl.SYMBOL_TABLE.declare_func('f', 1, type_=Type.ubyte) self.s = FUNCDECL(self.f, 1) diff --git a/tests/symbols/test_symbolFUNCTION.py b/tests/symbols/test_symbolFUNCTION.py index 9d24dd548..09048db8b 100644 --- a/tests/symbols/test_symbolFUNCTION.py +++ b/tests/symbols/test_symbolFUNCTION.py @@ -5,7 +5,7 @@ from unittest import TestCase import symbols -from api.constants import CLASS +from src.api.constants import CLASS class TestSymbolFUNCTION(TestCase): diff --git a/tests/symbols/test_symbolNUMBER.py b/tests/symbols/test_symbolNUMBER.py index 3778fcd92..dc10ce48a 100644 --- a/tests/symbols/test_symbolNUMBER.py +++ b/tests/symbols/test_symbolNUMBER.py @@ -4,7 +4,7 @@ import unittest from unittest import TestCase -from api.constants import TYPE +from src.api.constants import TYPE from symbols import NUMBER from symbols import BASICTYPE from symbols import CONST diff --git a/tests/symbols/test_symbolSTRSLICE.py b/tests/symbols/test_symbolSTRSLICE.py index 232162143..e1a425539 100644 --- a/tests/symbols/test_symbolSTRSLICE.py +++ b/tests/symbols/test_symbolSTRSLICE.py @@ -5,7 +5,7 @@ from unittest import TestCase import symbols -import api.global_ as gl +import src.api.global_ as gl class TestSymbolSTRSLICE(TestCase): diff --git a/tests/symbols/test_symbolTYPE.py b/tests/symbols/test_symbolTYPE.py index e23b58eeb..b39183c51 100644 --- a/tests/symbols/test_symbolTYPE.py +++ b/tests/symbols/test_symbolTYPE.py @@ -4,7 +4,7 @@ import unittest from unittest import TestCase -from api.constants import TYPE +from src.api.constants import TYPE from symbols.type_ import SymbolTYPE from symbols.type_ import SymbolBASICTYPE from symbols.type_ import SymbolTYPEREF diff --git a/tests/symbols/test_symbolTYPEALIAS.py b/tests/symbols/test_symbolTYPEALIAS.py index 43d9ace06..4b08e087a 100644 --- a/tests/symbols/test_symbolTYPEALIAS.py +++ b/tests/symbols/test_symbolTYPEALIAS.py @@ -4,7 +4,7 @@ import unittest from unittest import TestCase -from api.constants import TYPE +from src.api.constants import TYPE from symbols.type_ import SymbolBASICTYPE from symbols.type_ import SymbolTYPEALIAS diff --git a/tests/symbols/test_symbolTYPECAST.py b/tests/symbols/test_symbolTYPECAST.py index 6a922ce74..39eafab9c 100644 --- a/tests/symbols/test_symbolTYPECAST.py +++ b/tests/symbols/test_symbolTYPECAST.py @@ -6,9 +6,9 @@ from symbols import NUMBER from symbols import VAR from symbols.type_ import Type -from api.config import OPTIONS +from src.api.config import OPTIONS from six import StringIO -from api.constants import CLASS +from src.api.constants import CLASS from libzxbpp import zxbpp __autor__ = 'boriel' diff --git a/tests/symbols/test_symbolVAR.py b/tests/symbols/test_symbolVAR.py index 620b50800..3b5412e24 100644 --- a/tests/symbols/test_symbolVAR.py +++ b/tests/symbols/test_symbolVAR.py @@ -6,9 +6,9 @@ import symbols from symbols.type_ import Type -from api.constants import SCOPE -from api.constants import KIND -from api.constants import CLASS +from src.api.constants import SCOPE +from src.api.constants import KIND +from src.api.constants import CLASS class TestSymbolVAR(TestCase): diff --git a/tests/symbols/test_symbolVARARRAY.py b/tests/symbols/test_symbolVARARRAY.py index cd97ca212..82cd29e5f 100644 --- a/tests/symbols/test_symbolVARARRAY.py +++ b/tests/symbols/test_symbolVARARRAY.py @@ -3,9 +3,9 @@ from unittest import TestCase -import api.global_ as gl -from api.constants import TYPE -from api.constants import CLASS +import src.api.global_ as gl +from src.api.constants import TYPE +from src.api.constants import CLASS from symbols.type_ import Type import symbols import functools