A python script for generating enums with opcode constants based on YAML file definition. It may be useful for virtual machine developers. Defining opcodes in external file instead of direct C++/Rust enum has some advantages:
- It is easier to read. Definition file contains only relevant information, no C++ code.
- You can automate a documentation building.
- Opcode definition is isolated from your virtual machine implementation, so you can use it in non-C++ implementation (of course you'll have to modify this script a little bit).
Written on Python 3.
Execute the following command to install dependencies:
pip install -r requirements.txt
Copy the opcodes.example.yaml
file to your application's folder, define all the opcodes you need in this file.
Then run the script with the following arguments:
python main.py <opcode-list> <language> [--output path/to/file]
where opcode-list
is a path to file with opcodes (.yaml file); language
is one of the following options: c
,
cpp
, rust
; --output
specified the output file path. If the output
option is not provided then result will
be printed to the standard output.
The result may look like this:
enum _GeneratedOpCodes {
OPCODE_NOP = 0x00,
OPCODE_B = 0xA0,
OPCODE_BZ = 0xA1,
OPCODE_B_FALSE = 0xA1 /* alias for BZ */,
OPCODE_B_ZERO = 0xA1 /* alias for BZ */,
OPCODE_B_NULL = 0xA1 /* alias for BZ */,
OPCODE_BNZ = 0xA2,
OPCODE_B_TRUE = 0xA2 /* alias for BNZ */,
OPCODE_B_NOT_ZERO = 0xA2 /* alias for BNZ */,
OPCODE_B_NOT_NULL = 0xA2 /* alias for BNZ */
};