annotate python/libasm.py @ 195:37ac6c016e0f

Expanded asm subsystem
author Windel Bouwman
date Fri, 31 May 2013 21:06:44 +0200
parents b01429a5d695
children ec2b423cdbea
rev   line source
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
1 import re
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
2 import pyyacc
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
3 from ppci import Token, CompilerError, SourceLocation
159
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
4
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
5 # Different instruction sets:
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
6 class InstructionSet:
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
7 pass
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
8
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
9 class X86(InstructionSet):
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
10 pass
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
11
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
12 # Generic assembler:
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
13 keywords = ['global', 'db']
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
14
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
15 def tokenize(s):
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
16 """
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
17 Tokenizer, generates an iterator that
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
18 returns tokens!
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
19
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
20 This GREAT example was taken from python re doc page!
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
21 """
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
22 tok_spec = [
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
23 ('REAL', r'\d+\.\d+'),
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
24 ('HEXNUMBER', r'0x[\da-fA-F]+'),
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
25 ('NUMBER', r'\d+'),
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
26 ('ID', r'[A-Za-z][A-Za-z\d_]*'),
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
27 ('SKIP', r'[ \t]'),
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
28 ('LEESTEKEN', r':=|[\.,=:\-+*\[\]/\(\)]|>=|<=|<>|>|<'),
159
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
29 ('STRING', r"'.*?'")
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
30 ]
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
31 tok_re = '|'.join('(?P<%s>%s)' % pair for pair in tok_spec)
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
32 gettok = re.compile(tok_re).match
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
33 line = 1
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
34 pos = line_start = 0
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
35 mo = gettok(s)
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
36 while mo is not None:
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
37 typ = mo.lastgroup
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
38 val = mo.group(typ)
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
39 if typ == 'NEWLINE':
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
40 line_start = pos
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
41 line += 1
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
42 elif typ == 'COMMENTS':
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
43 pass
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
44 elif typ != 'SKIP':
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
45 if typ == 'ID':
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
46 if val in keywords:
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
47 typ = val
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
48 elif typ == 'LEESTEKEN':
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
49 typ = val
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
50 elif typ == 'NUMBER':
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
51 val = int(val)
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
52 elif typ == 'HEXNUMBER':
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
53 val = int(val[2:], 16)
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
54 typ = 'NUMBER'
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
55 elif typ == 'REAL':
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
56 val = float(val)
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
57 elif typ == 'STRING':
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
58 val = val[1:-1]
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
59 col = mo.start() - line_start
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
60 loc = SourceLocation(line, col, 0) # TODO retrieve length?
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
61 yield Token(typ, val, loc)
159
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
62 pos = mo.end()
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
63 mo = gettok(s, pos)
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
64 if pos != len(s):
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
65 col = pos - line_start
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
66 loc = SourceLocation(line, col, 0)
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
67 raise CompilerError('Unexpected character {0}'.format(s[pos]), loc)
159
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
68
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
69 class Lexer:
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
70 def __init__(self, src):
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
71 self.tokens = tokenize(src)
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
72 self.curTok = self.tokens.__next__()
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
73 def eat(self):
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
74 t = self.curTok
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
75 self.curTok = self.tokens.__next__()
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
76 return t
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
77 @property
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
78 def Peak(self):
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
79 return self.curTok
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
80
195
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
81 class ANode:
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
82 def __eq__(self, other):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
83 return self.__repr__() == other.__repr__()
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
84
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
85 class ALabel(ANode):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
86 def __init__(self, name):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
87 self.name = name
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
88 def __repr__(self):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
89 return '{0}:'.format(self.name)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
90
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
91 class AInstruction(ANode):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
92 def __init__(self, opcode, operands):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
93 self.opcode = opcode
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
94 self.operands = operands
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
95 def __repr__(self):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
96 ops = ', '.join(map(str, self.operands))
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
97 return '{0} {1}'.format(self.opcode, ops)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
98
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
99 class AExpression(ANode):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
100 def __add__(self, other):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
101 return ABinop('+', self, other)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
102 def __mul__(self, other):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
103 return ABinop('*', self, other)
194
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
104
195
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
105 class ABinop(AExpression):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
106 def __init__(self, op, arg1, arg2):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
107 self.op = op
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
108 self.arg1 = arg1
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
109 self.arg2 = arg2
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
110 def __repr__(self):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
111 return '{0} {1} {2}'.format(self.op, self.arg1, self.arg2)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
112
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
113 class AUnop(AExpression):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
114 def __init__(self, op, arg):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
115 self.op = op
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
116 self.arg = arg
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
117 def __repr__(self):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
118 return '{0} {1}'.format(self.op, self.arg)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
119
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
120 class ASymbol(AExpression):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
121 def __init__(self, name):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
122 self.name = name
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
123 def __repr__(self):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
124 return self.name
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
125
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
126 class ANumber(AExpression):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
127 def __init__(self, n):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
128 self.n = n
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
129 def __repr__(self):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
130 return '{0}'.format(self.n)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
131
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
132 class Assembler:
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
133 def __init__(self):
195
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
134 self.output = []
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
135 # Construct a parser given a grammar:
195
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
136 ident = lambda x: x # Identity helper function
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
137 g = pyyacc.Grammar(['ID', 'NUMBER', ',', '[', ']', ':', '+', '-', '*', pyyacc.EPS])
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
138 g.add_production('asmline', ['label', 'instruction'])
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
139 g.add_production('asmline', ['instruction'])
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
140 g.add_production('asmline', ['label'])
194
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
141 g.add_production('label', ['ID', ':'], self.p_label)
195
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
142 g.add_production('instruction', ['opcode', 'operands'], self.p_ins_1)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
143 g.add_production('instruction', ['opcode'], self.p_ins_2)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
144 g.add_production('opcode', ['ID'], ident)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
145 g.add_production('operands', ['operand'], self.p_operands_1)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
146 g.add_production('operands', ['operands', ',', 'operand'], self.p_operands_2)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
147 g.add_production('operand', ['expression'], ident)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
148 g.add_production('operand', ['[', 'expression', ']'], self.p_mem_op)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
149 g.add_production('expression', ['term'], ident)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
150 g.add_production('expression', ['expression', 'addop', 'term'], self.p_binop)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
151 g.add_production('addop', ['-'], ident)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
152 g.add_production('addop', ['+'], ident)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
153 g.add_production('mulop', ['*'], ident)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
154 g.add_production('term', ['factor'], ident)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
155 g.add_production('term', ['term', 'mulop', 'factor'], self.p_binop)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
156 g.add_production('factor', ['ID'], self.p_symbol)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
157 g.add_production('factor', ['NUMBER'], self.p_number)
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
158 g.start_symbol = 'asmline'
195
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
159 self.p = g.genParser()
159
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
160
195
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
161 # Parser handlers:
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
162 def p_ins_1(self, opc, ops):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
163 ins = AInstruction(opc, ops)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
164 self.emit(ins)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
165 def p_ins_2(self, opc):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
166 self.p_ins_1(opc, [])
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
167 def p_operands_1(self, op1):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
168 return [op1]
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
169 def p_operands_2(self, ops, comma, op2):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
170 assert type(ops) is list
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
171 ops.append(op2)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
172 return ops
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
173 def p_mem_op(self, brace_open, exp, brace_close):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
174 return AUnop('[]', exp)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
175 def handle_ins(self, id0, operands):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
176 ins = AInstruction(id0)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
177 self.emit(ins)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
178 def p_label(self, lname, cn):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
179 lab = ALabel(lname)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
180 self.emit(lab)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
181 def p_binop(self, exp1, op, exp2):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
182 return ABinop(op, exp1, exp2)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
183 def p_symbol(self, name):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
184 return ASymbol(name)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
185 def p_number(self, n):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
186 n = int(n)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
187 return ANumber(n)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
188
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
189 # Top level:
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
190 def emit(self, a):
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
191 self.output.append(a)
37ac6c016e0f Expanded asm subsystem
Windel Bouwman
parents: 194
diff changeset
192
194
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
193 def parse_line(self, line):
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
194 """ Parse line into asm AST """
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
195 tokens = tokenize(line)
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
196 self.p.parse(tokens)
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
197 aast = 1 # TODO
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
198 return aast
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
199
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
200 def assemble(self, asmsrc):
194
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
201 lxr = Lexer(asmsrc)
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
202 prsr = Parser(lxr)
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
203 instructions = prsr.parse()
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
204 return instructions
159
5e1dd04cb61c Added attempt to assembler
Windel Bouwman
parents:
diff changeset
205
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
206 def assembleLine(self, line):
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
207 """
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
208 Assemble a single source line.
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
209 Do not take newlines into account
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
210 """
194
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
211 aast = self.parseLine(line)
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
212 self.assemble_aast(aast)
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
213
194
b01429a5d695 Fixed test
Windel Bouwman
parents: 193
diff changeset
214 def assemble_aast(self, at):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
215 """ Assemble a parsed asm line """
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
216 pass
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
217
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 159
diff changeset
218