summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan J. Martínez <jjm@usebox.net>2019-08-07 06:49:29 +0100
committerGitHub <noreply@github.com>2019-08-07 06:49:29 +0100
commitd6c52edb57bbd63169b184f81db6ad56b9434215 (patch)
tree033d7fb7013ac616afb4c5c22ea67e7c8a5b597e
parent09260b3ade51201b99b945cb0d9db7cdcf10d82c (diff)
parentfd9f4e10bf775303d19273feaf327b4f5c52a74a (diff)
downloadz80count-d6c52edb57bbd63169b184f81db6ad56b9434215.tar.gz
z80count-d6c52edb57bbd63169b184f81db6ad56b9434215.zip
Merge pull request #14 from patxoca/issue-11
Fix issue 11
-rw-r--r--tests/test_parser.py23
-rw-r--r--tests/test_z80count.py23
-rw-r--r--z80count/z80count.py11
3 files changed, 56 insertions, 1 deletions
diff --git a/tests/test_parser.py b/tests/test_parser.py
index 3153415..b6ab468 100644
--- a/tests/test_parser.py
+++ b/tests/test_parser.py
@@ -918,6 +918,10 @@ def test_lookup(instruction, cycles, parser_table):
assert entry["cycles"] == cycles, "Failed: {} expected '{}' != found '{}'".format(instruction, cycles, entry["cycles"])
+##########################################################################
+# _extract_mnemonic #
+##########################################################################
+
@pytest.mark.parametrize("line,operator", (
("foo: LD A, 1 ; load accumulator", "LD"),
("foo: CALL 0xABCD", "CALL"),
@@ -935,3 +939,22 @@ def test_extract_mnemonic(line, operator):
def test_extract_mnemonic_normalizes_operator():
assert Parser._extract_mnemonic("call 0xabcd") == "CALL"
+
+
+##########################################################################
+# _remove_label #
+##########################################################################
+
+@pytest.mark.parametrize("line,expected", (
+ ("foo: ld A, 1 ; load accumulator", "ld A, 1 ; load accumulator"),
+ ("foo: CALL 0xABCD", "CALL 0xABCD"),
+ ("foo: EI", "EI"),
+ ("LD A, 1 ; load accumulator", "LD A, 1 ; load accumulator"),
+ ("call 0xABCE", "call 0xABCE"),
+ ("EI", "EI"),
+ ("foo: ; some label", None),
+ ("foo:", None),
+ ("; some comment", None),
+))
+def test_remove_label(line, expected):
+ assert Parser._remove_label(line) == expected
diff --git a/tests/test_z80count.py b/tests/test_z80count.py
new file mode 100644
index 0000000..85a9084
--- /dev/null
+++ b/tests/test_z80count.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+
+import pytest
+
+from z80count.z80count import Parser
+from z80count.z80count import z80count
+
+
+@pytest.mark.parametrize("line,expected", (
+ ("PLY_InterruptionOn: call PLY_Init",
+ "PLY_InterruptionOn: call PLY_Init ; [17]\n"),
+ ("$PLY_Interruption.On: call PLY_Init",
+ "$PLY_Interruption.On: call PLY_Init ; [17]\n"),
+ ("PLY_ReplayFrequency:\tld de,0",
+ "PLY_ReplayFrequency:\tld de,0 ; [10]\n"),
+
+))
+def test_issue_11(line, expected):
+ parser = Parser()
+ output, _ = z80count(line, parser, total=0, subt=False,
+ no_update=True, column=1, use_tabs=False,
+ tab_width=4, debug=False)
+ assert output == expected
diff --git a/z80count/z80count.py b/z80count/z80count.py
index a5b1fce..abfa48f 100644
--- a/z80count/z80count.py
+++ b/z80count/z80count.py
@@ -186,13 +186,14 @@ class Parser(object):
"""Simple parser based on a table of regexes."""
# [label:] OPERATOR [OPERANDS] [; comment]
- _LINE_RE = re.compile(r"^([\w]+:)?\s*(?P<operator>\w+)(\s+.*)?$")
+ _LINE_RE = re.compile(r"^([$.\w]+:)?\s*(?P<operator>\w+)(?P<rest>\s+.*)?$")
def __init__(self):
self._table = self._load_table()
def lookup(self, line):
mnemo = self._extract_mnemonic(line)
+ line = self._remove_label(line)
if mnemo is None or mnemo not in self._table:
return None
for entry in self._table[mnemo]:
@@ -226,6 +227,14 @@ class Parser(object):
return match.group("operator").upper()
return None
+ @classmethod
+ def _remove_label(cls, line):
+ match = cls._LINE_RE.match(line)
+ if match:
+ rest = match.group("rest") or ""
+ return match.group("operator") + rest
+ return None
+
@staticmethod
def _init_entry(entry):
entry["cregex"] = re.compile(r"^\s*" + entry["regex"] + r"\s*(;.*)?$", re.I)