summaryrefslogtreecommitdiff
path: root/AsmParser.py
diff options
context:
space:
mode:
Diffstat (limited to 'AsmParser.py')
-rw-r--r--AsmParser.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/AsmParser.py b/AsmParser.py
index 24755f6..c3354dd 100644
--- a/AsmParser.py
+++ b/AsmParser.py
@@ -24,6 +24,7 @@ import re
class AsmParser(object):
def __init__(self, filename, parent=None):
+ self.filename = filename
if parent:
self.parent = parent
self.defined_names = parent.defined_names
@@ -45,11 +46,21 @@ class AsmParser(object):
self.re_whitespace = re.compile("\s+")
file = open(filename, "rU")
+ line_no = 0
+ buffered_line = ""
while True:
+ line_no += 1
line = file.readline()
# line is empty if EoF, otherwise a string including newline
if line:
- self.parseLine(line.split(";", 1)[0].strip())
+ # strip comments and leading/trailing whitespace
+ line = line.split(";")[0].strip()
+ # assume that lines ending with ":" are incomplete and that
+ # the instruction contains on a next line
+ buffered_line += line
+ if buffered_line and not buffered_line.endswith(":"):
+ self.parseLine(buffered_line, line_no)
+ buffered_line = ""
else:
break
file.close()
@@ -58,7 +69,7 @@ class AsmParser(object):
if name in self.defined_names:
self.defined_names[name].rename(value)
del self.defined_names[name]
- def parseLine(self, line):
+ def parseLine(self, line, line_no):
"""Processes the a line from assembly"""
if line.startswith("@"):
cmd, opts = re.split("\s+", line + " ", 1)
@@ -107,7 +118,11 @@ class AsmParser(object):
if self.in_section == "DATA":
raise RuntimeError("Found non-definition data in @DATA, "
"namely: " + line)
- lineobj = AsmLine(line, id_dict=self.defined_names)
+ try:
+ lineobj = AsmLine(line, id_dict=self.defined_names)
+ except RuntimeError as errmsg:
+ raise RuntimeError("{} on line {} in {}"
+ .format(errmsg, line_no, self.filename))
if lineobj.label:
self.labels.append(lineobj.label)
self.addCode(lineobj)
@@ -119,7 +134,7 @@ class AsmParser(object):
"""
if name in self.constants:
raise RuntimeError("Redefinition of constant '{}'".format(name))
- self.constants[name] = self.evaluateConstant(data)
+ self.constants[name] = self.evaluateConstant(value)
def addCode(self, line):
"""Add a line to the @CODE section"""
if self.parent: