generate_grammar.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. #!/usr/bin/python
  2. argmap ={'REG': 'WORD'}
  3. def command(name, args):
  4. """Generate grammar code to be pasted in grammar.y for a sinle MIPS
  5. command."""
  6. argc = len(args)
  7. mapped_args = [argmap[arg] if arg in argmap else arg for arg in args]
  8. code = '"%s" %s {\n' % (name, ' COMMA '.join(mapped_args))
  9. code += '\t\tchar **argv = (char **)malloc(%d * sizeof(char *));\n' % argc
  10. code += '\t\tint *argt = (int *)malloc(%d * sizeof(int));\n' % argc
  11. for i, argtype in enumerate(args):
  12. code += '\t\targv[%d] = $%d;\n' % (i, i * 2 + 2)
  13. code += '\t\targt[%d] = ARG_%s;\n' % (i, argtype)
  14. code += '\t\tadd_line(TYPE_CMD, %s, %d, argv, argt);\n' % (name, argc)
  15. code += '\t}\n'
  16. return code
  17. # Define commands
  18. commands = [ \
  19. (['add', 'sub'], ['REG'] * 3), \
  20. (['addi', 'subi'], ['REG', 'REG', 'INT']), \
  21. ]
  22. # Generate 'command' grammar
  23. cmd = []
  24. for names, args in commands:
  25. for name in names:
  26. cmd.append(command(name, args))
  27. code = 'commands:\n\t%s\t;\n' % '\t| '.join(cmd)
  28. print code