This is a simple interpreter for Monty Bytecode files written in C. It can read a Monty Bytecode file, interpret its instructions and execute them.
The project is organized as follows:
.
├── monty
├── monty.h
├── execute.c
├── main.c
├── operations:
| ├── op_push.c
| ├── op_pall.c
| ├── op_pint.c
| ├── op_pop.c
| ├── op_swap.c
| ├── op_add.c
| ├── op_sub.c
| ├── op_div.c
| ├── op_mul.c
| ├── op_mod.c
| ├── op_pchar.c
| ├── op_pstr.c
| └── op_nop.c
├── free_stack.c
└── bytecodes
├── 00.m
├── 01.m
├── ....
├── ....
├── ....
└── 12.m
monty: the compiled executable file.
monty.h: the header file containing function prototypes, definitions and struct declarations.
execute.c: the file containing the execute_opcode() function that determines the opcode to be executed.
main.c: the file containing the main() function that reads the bytecode file and executes the opcodes.
operations: these are files containing the functions for each opcode (push(), pint(), pop(), swap(), add(), nop()).
stack.c: the file containing the stack functions (stack_len(), push_stack(), pop_stack(), free_stack()).
bytecodes: a folder containing the bytecode files to be executed by the monty program.
To install and run the Monty Interpreter, follow these steps:
-
Clone this repository:
git clone https://github.com/FourtyThree43/monty -
Change into the monty directory:
cd monty -
Compile the interpreter:
gcc -Wall -Werror -Wextra -pedantic *.c -o monty -
Run the interpreter:
./monty <filename>.m- Replace
<filename>with the name of the file containing the Monty code to execute.
- Replace
The Monty Interpreter takes a single argument, which is the path to a Monty Bytecode file. The file should contain instructions for the interpreter to execute, one per line.
The following opcodes are supported by the interpreter:
-
push:pushes an integer onto the stack -
pop:removes the top element of the stack -
swap:swaps the top two elements of the stack -
add:adds the top two elements of the stack. -
sub:subtracts the top element of the stack from the second top element. -
div:divides the second top element of the stack by the top element. -
mul:multiplies the second top element of the stack with the top element. -
mod:computes the modulus of the second top element of the stack with the top element of the stack. -
pall:prints all the values on the stack -
pint:prints the value at the top of the stack -
pchar:prints the character at the top of the stack -
pstr:prints the string starting at the top of the stack -
nop:does nothing.
For more information on how to use the Monty Interpreter see below.
Example 1
push 1
push 2
push 3
pall
pop
pall
pop
pall
pop
pall
Output
3
2
1
2
1
1
Example 2
push 1
push 2
push 3
add
pall
Output
5
This program was written by FourtyThree43.
This project is licensed under the MIT License - see the LICENSE file for details.