Pārlūkot izejas kodu

Debugged parser and writer to successfully process slalom.s

Taddeüs Kroes 14 gadi atpakaļ
vecāks
revīzija
1be2cbfffa
3 mainītis faili ar 41 papildinājumiem un 10 dzēšanām
  1. 4 4
      src/optimize.py
  2. 14 3
      src/parser.py
  3. 23 3
      src/writer.py

+ 4 - 4
src/optimize.py

@@ -17,14 +17,14 @@ if __name__ == '__main__':
     statement_no = 1
 
     for i, block in enumerate(blocks):
-        print 'basic block %d:' % i
+        #print 'basic block %d:' % i
 
         for statement in block:
-            print statement_no, statement
+            #print statement_no, statement
             statement_no += 1
 
-    print '\nOut:'
-    print out
+    #print '\nOut:'
+    #print out
 
     if len(argv) > 2:
         f = open(argv[2], 'w+')

+ 14 - 3
src/parser.py

@@ -29,13 +29,23 @@ def t_DIRECTIVE(t):
     r'\..*'
     return t
 
+def t_hex_word(t):
+    r'0x[0-9a-fA-F]{8}'
+    t.type = 'WORD'
+    return t
+
 def t_offset_address(t):
-    r'[0-9]+(\([a-zA-Z0-9$_.]+\))?'
+    r'[0-9]+\([a-zA-Z0-9$_.]+\)'
+    t.type = 'WORD'
+    return t
+
+def t_int(t):
+    r'-?[0-9]+'
     t.type = 'WORD'
     return t
 
 def t_WORD(t):
-    r'[a-zA-Z0-9$_.]+'
+    r'[a-zA-Z0-9$_.+()]+'
     return t
 
 # Ignore whitespaces
@@ -83,7 +93,8 @@ def p_instruction_label(p):
 def p_command(p):
     '''command : WORD WORD COMMA WORD COMMA WORD
                | WORD WORD COMMA WORD
-               | WORD WORD'''
+               | WORD WORD
+               | WORD'''
     statements.append(('command', p[1], {'args': list(p)[2::2]}))
 
 def p_error(p):

+ 23 - 3
src/writer.py

@@ -1,6 +1,10 @@
+from math import ceil
+
 def write_statements(statements):
     '''Write a list of statements to valid assembly code.'''
-    s = '';
+    s = ''
+    indent_level = 0
+    prevline = ''
 
     for i, statement in enumerate(statements):
         statement_type, name, args = statement
@@ -8,19 +12,35 @@ def write_statements(statements):
 
         if statement_type == 'label':
             line = name + ':'
+            indent_level = 1
         elif statement_type == 'comment':
             line = '#' + name
 
             if args['inline']:
-                newline = '  '
+                l = len(prevline.expandtabs(4))
+                tabs = int(ceil((24 - l) / 4.)) + 1
+                newline = '\t' * tabs
+            else:
+                line = '\t' * indent_level + line
         elif statement_type == 'directive':
             line = '\t' + name
         elif statement_type == 'command':
-            line = '\t' + name + '\t' + ','.join(args['args'])
+            line = '\t' + name
+
+            if len(args['args']):
+                l = len(name)
+
+                if l < 8:
+                    line += '\t'
+                else:
+                    line += ' '
+
+                line += ','.join(args['args'])
         else:
             raise Exception('Unsupported statement type "%s"' % statement_type)
 
         s += newline + line
+        prevline = line
 
     return s