mirror of
https://github.com/piotr-wiszowaty/foco65.git
synced 2025-03-07 10:29:53 +00:00
Filter out unused words from output assembly text
This commit is contained in:
parent
0f8b469881
commit
6c4dd5ee2c
52
foco65
52
foco65
@ -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)
|
||||||
|
|
||||||
#####
|
#####
|
||||||
|
Loading…
x
Reference in New Issue
Block a user