Mercurial > lcfOS
view python/testc3.py @ 158:9683a4cd848f
Added some functions for code generation
author | Windel Bouwman |
---|---|
date | Fri, 08 Mar 2013 16:52:44 +0100 |
parents | 8f3924b6076e |
children | 10330be89bc2 |
line wrap: on
line source
import c3 import time, ppci, x86, ir testsrc = """ package test; var u32 c, d; function void test1() { var u32 b; var int a = 10; b = 20; var int buf; var int i; i = 2; var int zero = i - 2; if (i > 1) { buf = b + 22 * i - 13 + (55 * 2 *9-2) / 44 - 1; } else { ;;; } t2(2, 3); } function int t2(u32 a, u32 b) { if (a > 0) { a = 2 + t2(a - 1); } return a + b; } var int hahaa = 23 * 2; """ def printAst(ast, indent=''): print(indent + str(ast)) if isinstance(ast, c3.astnodes.Package): for s in ast.scope: printAst(s, indent + ' ') if isinstance(ast, c3.astnodes.Function): for s in ast.scope: printAst(s, indent + ' ') for c in ast.getChildren(): printAst(c, indent + ' ') def c3compile(src, diag): print('[0] source:') #print(src) print('[1] parsing') sema = c3.Semantics(diag) p = c3.Parser(sema, diag) tc = c3.TypeChecker(diag) al = c3.Analyzer(diag) cg = c3.CodeGenerator() x86gen = x86.X86CodeGen(diag) p.parseSource(src) tc.checkPackage(sema.mod) print('{0} errors'.format(len(diag.diags))) for d in diag.diags: print('ERROR:') ppci.printError(testsrc, d) print('[2] ast:') #printAst(sema.mod) ok = len(diag.diags) == 0 if ok: print('Generating ir-code') i = cg.gencode(sema.mod) #ir.printIr(i) print('generating x86 code') x86gen.genBin(i) with open('dummydummy.asm', 'w') as f: f.write('bits 64\n') for a in x86gen.asm: f.write(str(a) + '\n') else: print('Not generating code') def do(): diag = ppci.DiagnosticsManager() c3compile(testsrc, diag) do()