annotate ide/compiler/compiler.py @ 1:92df07bc2081

Initial import of compiler
author windel
date Sun, 18 Sep 2011 19:00:29 +0200
parents
children 818f80afa78b
rev   line source
1
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
1 import hashlib
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
2 # Import compiler components:
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
3 from . import lexer
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
4 from . import parser
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
5 from .codegenerator import CodeGenerator
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
6 from .nodes import ExportedSymbol
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
7
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
8 class Compiler:
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
9 versie = '0.9.3'
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
10
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
11 def __repr__(self):
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
12 return 'LCFOS compiler {0}'.format(self.versie)
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
13
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
14 def generateSignature(self, src):
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
15 return hashlib.md5(bytes(src,encoding='ascii')).hexdigest()
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
16
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
17 def compilesource(self, src):
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
18 """ Front end that handles the stages: """
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
19 tokens = lexer.tokenize(src) # Lexical stage
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
20 ast = parser.Parser(tokens).parseModule() # Parse a module
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
21 CodeGenerator().generatecode(ast)
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
22 # Attach a signature:
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
23 ast.signature = self.generateSignature(src)
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
24 # Generate exported symbols:
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
25 ast.exports = []
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
26 for proc in ast.procs:
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
27 if proc.public:
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
28 sym = ExportedSymbol(proc.name, proc.typ)
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
29 sym.imageoffset = proc.entrypoint
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
30 ast.exports.append(sym)
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
31
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
32 return ast
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
33