| 12345678910111213141516171819202122232425262728293031323334353637 |
- #!/usr/bin/python
- argmap ={'REG': 'WORD'}
- def command(name, args):
- """Generate grammar code to be pasted in grammar.y for a sinle MIPS
- command."""
- argc = len(args)
- mapped_args = [argmap[arg] if arg in argmap else arg for arg in args]
- code = '"%s" %s {\n' % (name, ' COMMA '.join(mapped_args))
- code += '\t\tchar **argv = (char **)malloc(%d * sizeof(char *));\n' % argc
- code += '\t\tint *argt = (int *)malloc(%d * sizeof(int));\n' % argc
- for i, argtype in enumerate(args):
- code += '\t\targv[%d] = $%d;\n' % (i, i * 2 + 2)
- code += '\t\targt[%d] = ARG_%s;\n' % (i, argtype)
- code += '\t\tadd_line(TYPE_CMD, %s, %d, argv, argt);\n' % (name, argc)
- code += '\t}\n'
- return code
- # Define commands
- commands = [ \
- (['add', 'sub'], ['REG'] * 3), \
- (['addi', 'subi'], ['REG', 'REG', 'INT']), \
- ]
- # Generate 'command' grammar
- cmd = []
- for names, args in commands:
- for name in names:
- cmd.append(command(name, args))
- code = 'commands:\n\t%s\t;\n' % '\t| '.join(cmd)
- print code
|