diff --git a/lang/compile.py b/lang/compile.py index 3b18a16..6166b8f 100755 --- a/lang/compile.py +++ b/lang/compile.py @@ -125,6 +125,13 @@ return 'ASTFunction(public=%s, class="%s", name="%s", args="%s", statements=%s)' % \ (self.public, self.class_, self.name, self.args, self.statements) +class ASTClass(): + def __init__(self, name): + self.name = name + + def __repr__(self): + return 'ASTClass(name=%s)' % (self.name) + ## Parser def tokenize(code): @@ -354,6 +361,23 @@ metadata = ASTMetadata(id, module, use_list) return (metadata, lines) +def parse_class(lines): + line = lines[0] + lines = lines[1:] + if len(line) != 2 or line[0] != "Class": + print("not a class? line: %s" % (' '.join(line))) + return (None, []) + name = line[1] + fields = [] + while len(lines) != 0: + first_word = lines[0][0] + if first_word == "EndClass": + lines = lines[1:] + break + return (None, []) + class_ = ASTClass(name) + return (class_, lines) + def parse_toplevel(lines, id): ast = [] (metadata, lines) = parse_metadata(lines, id) @@ -361,11 +385,15 @@ return None ast.append(metadata) while len(lines) != 0: - (func, lines) = parse_function(lines) - if func is None: + node = None + if lines[0][0] in ["Public", "Private"]: + (node, lines) = parse_function(lines) + elif lines[0][0] == "Class": + (node, lines) = parse_class(lines) + if node is None: return None else: - ast.append(func) + ast.append(node) return ast ## IR @@ -668,6 +696,10 @@ def generate_ir_metadata(ast): return IRMetadata(ast.id, ast.name, ast.uses, []) +def generate_ir_class(ast): + name = ast.name + return IRClass(name, []) + def generate_ir(ast): ir = [] for node in ast: @@ -676,6 +708,8 @@ sub_ir = generate_ir_metadata(node) elif isinstance(node, ASTFunction): sub_ir = generate_ir_function(node) + elif isinstance(node, ASTClass): + sub_ir = generate_ir_class(node) if sub_ir is None: print("Unknown ast node: %s" % (node)) return None @@ -739,6 +773,13 @@ ir.append(sub_ir) return ir +def find_classes(old_ir): + classes_ = [] + for node in old_ir: + if isinstance(node, IRClass): + classes_.append(node) + return classes_ + def assign_classes(ir): grouped = group_functions(ir) if grouped is None: @@ -746,8 +787,8 @@ module_class = make_module_class(ir) if module_class is None: return None - old_ir = ir + [module_class] - classes = [module_class] + old_ir = [module_class] + ir + classes = find_classes(old_ir) mapped_classes = map_class_functions(grouped, classes) if mapped_classes is None: return None diff --git a/lang/modules/main.txt b/lang/modules/main.txt index a6a333a..aef6c5c 100644 --- a/lang/modules/main.txt +++ b/lang/modules/main.txt @@ -47,7 +47,10 @@ Jump Self CountDown 10000 EndFunction -Public Class Main Function MakeNumberReal +Class MakeNumberClass +EndClass + +Public Class MakeNumberClass Function DoIt Set Halfish To Another GetHalfish 620 Set Double To Halfish Add Halfish Set Final To Double Subtract 2 @@ -55,6 +58,6 @@ EndFunction Public Class Main Function MakeNumber - Set NewMain To Create Main - Jump NewMain MakeNumberReal + Set Maker To Create MakeNumberClass + Jump Maker DoIt EndFunction