Filter out unused words from output assembly text

This commit is contained in:
Piotr Wiszowaty 2014-07-21 22:08:29 +02:00 committed by Piotr Wiszowaty
parent 0f8b469881
commit 6c4dd5ee2c

52
foco65
View File

@ -157,22 +157,32 @@ class Word:
self.name = name self.name = name
self.section = section self.section = section
self.thread = ["enter"] self.thread = ["enter"]
self.names = []
self.code = code self.code = code
if label: if label:
self.label = label self.label = label
else: else:
self.label = name self.label = name
self.recursive = False self.recursive = False
self.used = False
def __str__(self): def __str__(self):
if self.code: if self.used:
return "%s\n dta a(*+2)\n%s" % (self.label, self.code) if self.code:
return "%s\n dta a(*+2)\n%s\n" % (self.label, self.code)
else:
s = "\n".join(map(lambda l: " dta a(%s)" % l, self.thread))
return "%s\n%s\n\n" % (self.label, s)
else: else:
s = "\n".join(map(lambda l: " dta a(%s)" % l, self.thread)) return ""
return "%s\n%s\n" % (self.label, s)
def add(self, label): def __iter__(self):
return iter(self.names)
def add(self, label, name=None):
self.thread.append(label) self.thread.append(label)
if name is not None:
self.names.append(name)
def ip(self): def ip(self):
return len(self.thread) return len(self.thread)
@ -185,9 +195,16 @@ class Constant:
self.label = label self.label = label
self.value = value self.value = value
self.section = section self.section = section
self.used = False
def __str__(self): def __str__(self):
return "%s\n dta a(const),a(%s)\n" % (self.label, self.value) if self.used:
return "%s\n dta a(const),a(%s)\n" % (self.label, self.value)
else:
return ""
def __iter__(self):
return iter([])
##### #####
@ -412,7 +429,7 @@ class Forth:
target = self.pop(token) target = self.pop(token)
target.update(word.ip()) target.update(word.ip())
elif token == "while": elif token == "while":
word.add("while") word.add("while", "while")
target = BranchTarget(word.ip()) target = BranchTarget(word.ip())
word.add(target) word.add(target)
self.push(target) self.push(target)
@ -427,11 +444,11 @@ class Forth:
elif token == "[": elif token == "[":
self.set_state("interpret") self.set_state("interpret")
elif token == "do": elif token == "do":
word.add("do") word.add("do", "do")
self.push(word.ip()) self.push(word.ip())
self.push_do_loop() self.push_do_loop()
elif token == "loop" or token == "+loop": elif token == "loop" or token == "+loop":
word.add(token.text.replace("+", "plus_")) word.add(token.text.replace("+", "plus_"), token.text)
do_ip = self.pop(token) do_ip = self.pop(token)
target = BranchTarget(word.ip()) target = BranchTarget(word.ip())
target.update(do_ip) target.update(do_ip)
@ -439,7 +456,7 @@ class Forth:
for leave in self.pop_do_loop(token): for leave in self.pop_do_loop(token):
leave.update(word.ip()) leave.update(word.ip())
elif token == "leave": elif token == "leave":
word.add("unloop") word.add("unloop", "unloop")
word.add("branch") word.add("branch")
target = BranchTarget(word.ip()) target = BranchTarget(word.ip())
word.add(target) word.add(target)
@ -447,14 +464,14 @@ class Forth:
elif token == "lit": elif token == "lit":
word.add("lit") word.add("lit")
token = self.next() token = self.next()
word.add(token.text) word.add(token.text, token.text)
else: else:
if word.recursive and token == word.name: if word.recursive and token == word.name:
subword = word subword = word
else: else:
subword = self.words.find(token.text) subword = self.words.find(token.text)
if subword is not None: if subword is not None:
word.add(subword.label) word.add(subword.label, subword.name)
else: else:
if self.isnumber(token): if self.isnumber(token):
word.add("lit") word.add("lit")
@ -547,14 +564,23 @@ class Forth:
self.items.append(item) self.items.append(item)
break break
def filter_used_words(self, name):
word = self.words.find(name)
if word is not None:
if not word.used:
word.used = True
for name in word:
self.filter_used_words(name)
def generate_output(self): def generate_output(self):
self.filter_used_words("main")
if self.stack: if self.stack:
raise StackNotEmpty(self.input.line, self.input.column) raise StackNotEmpty(self.input.line, self.input.column)
section_outputs = [] section_outputs = []
for section in self.sections: for section in self.sections:
item_outputs = map(str, filter(lambda i: i.section == section, self.items)) item_outputs = map(str, filter(lambda i: i.section == section, self.items))
section_outputs.append("; section %s\n" % section) section_outputs.append("; section %s\n" % section)
section_outputs.append("\n".join(item_outputs)) section_outputs.append("".join(item_outputs))
return "\n".join(section_outputs) return "\n".join(section_outputs)
##### #####