remove "skippable_macros" from preprocessor

The preprocessor no longer has the concept of skippable_macros and now
always skips any line that starts with "db" or "dw" because neither of
these should be treated as macros.

fixes #178
This commit is contained in:
Bryan Bishop 2013-08-30 18:26:07 -05:00
parent 8fe7f4c3a5
commit 69adf48a54
1 changed files with 17 additions and 24 deletions

View File

@ -39,9 +39,6 @@ show_original_lines = False
# helpful for debugging macros # helpful for debugging macros
do_macro_sanity_check = False do_macro_sanity_check = False
class SkippableMacro(object):
macro_name = "db"
chars = { chars = {
"": 0x05, "": 0x05,
"": 0x06, "": 0x06,
@ -418,11 +415,14 @@ def macro_test(asm, macro_table):
""" """
# macros are determined by the first symbol on the line # macros are determined by the first symbol on the line
token = extract_token(asm) token = extract_token(asm)
# check against all names
if token in macro_table: # skip db and dw since rgbasm handles those and they aren't macros
return (macro_table[token], token) if token not in ["db", "dw"]:
else: # check against all names
return (None, None) if token in macro_table:
return (macro_table[token], token)
return (None, None)
def is_based_on(something, base): def is_based_on(something, base):
""" """
@ -436,7 +436,7 @@ def is_based_on(something, base):
options += [something.__name__] options += [something.__name__]
return (base in options) return (base in options)
def macro_translator(macro, token, line, skippable_macros): def macro_translator(macro, token, line):
""" """
Converts a line with a macro into a rgbasm-compatible line. Converts a line with a macro into a rgbasm-compatible line.
""" """
@ -475,10 +475,9 @@ def macro_translator(macro, token, line, skippable_macros):
if show_original_lines: if show_original_lines:
sys.stdout.write("; original_line: " + original_line) sys.stdout.write("; original_line: " + original_line)
# "db" is a macro because of SkippableMacro # rgbasm can handle "db" so no preprocessing is required, plus this wont be
# rgbasm can handle "db" so no preprocessing is required # reached because of earlier checks in macro_test.
# (don't check its param count) if macro.macro_name in ["db", "dw"]:
if macro.__name__ in skippable_macros or (macro.macro_name == "db" and macro in skippable_macros):
sys.stdout.write(original_line) sys.stdout.write(original_line)
return return
@ -584,7 +583,7 @@ def macro_translator(macro, token, line, skippable_macros):
sys.stdout.write(output) sys.stdout.write(output)
def read_line(l, skippable_macros, macro_table): def read_line(l, macro_table):
"""Preprocesses a given line of asm.""" """Preprocesses a given line of asm."""
# strip comments from asm # strip comments from asm
@ -612,21 +611,15 @@ def read_line(l, skippable_macros, macro_table):
else: else:
macro, token = macro_test(asm, macro_table) macro, token = macro_test(asm, macro_table)
if macro: if macro:
macro_translator(macro, token, asm, skippable_macros) macro_translator(macro, token, asm)
else: else:
sys.stdout.write(asm) sys.stdout.write(asm)
if comment: sys.stdout.write(comment) if comment: sys.stdout.write(comment)
def preprocess(macros, skippable_macros=None, lines=None): def preprocess(macros, lines=None):
"""Main entry point for the preprocessor.""" """Main entry point for the preprocessor."""
if skippable_macros == None: macro_table = make_macro_table(macros)
skippable_macros = [SkippableMacro]
macro_table = make_macro_table(list(set(macros + skippable_macros)))
# HACK for pokecrystal. Must be after make_macro_table call.
skippable_macros += ["TextEndingCommand", "ItemFragment"]
if not lines: if not lines:
# read each line from stdin # read each line from stdin
@ -636,7 +629,7 @@ def preprocess(macros, skippable_macros=None, lines=None):
lines = lines.split("\n") lines = lines.split("\n")
for l in lines: for l in lines:
read_line(l, skippable_macros, macro_table) read_line(l, macro_table)
# only run against stdin when not included as a module # only run against stdin when not included as a module
if __name__ == "__main__": if __name__ == "__main__":