0x19. C - Stacks, Queues - LIFO, FIFO
The Monty language
Monty 0.98 is a scripting language that is first compiled into Monty byte codes (Just like Python). It relies on a unique stack, with specific instructions to manipulate it. The goal of this project is to create an interpreter for Monty ByteCodes files.
The monty program
- Usage:
monty file
:
./monty bytecode.m
- where
file
is the path to the file containing Monty byte code - If the user does not give any file or more than one argument to your program, print the error message
USAGE: monty file
, followed by a new line, and exit with the statusEXIT_FAILURE
- If, for any reason, its not possible to open the file, print the error message
Error: Can't open file <file>
, followed by a new line, and exit with the statusEXIT_FAILURE
- where
<file>
is the name of the file
- where
- If the file contains an invalid instruction, print the error message
L<line_number>: unknown instruction <opcode>
, followed by a new line, and exit with the statusEXIT_FAILURE
- where
<line_number>
is the line number where the instruction appears. - Line numbers always start at 1
- where
- The monty program runs the bytecodes line by line and stop if either:
- it executed properly every line of the file
- it finds an error in the file
- an error occured
- If you cant malloc anymore, print the error message
Error: malloc failed
, followed by a new line, and exit with statusEXIT_FAILURE
- You have to use
malloc
andfree
and are not allowed to use any other function fromman malloc
(realloc, calloc, )
Example of bytecode
- There is not more than one instruction per line. There can be any number of spaces before or after the opcode and its argument
$ cat -e bytecodes/000.m
push 0$
push 1$
push 2$
push 3$
pall $
push 4$
push 5 $
push 6 $
pall$
$
- Monty byte code files can contain blank lines (empty or made of spaces only, and any additional text after the opcode or its required argument is not taken into account
$ cat -e bytecodes/001.m
push 0 Push 0 onto the stack$
push 1 Push 1 onto the stack$
$
push 2$
push 3$
pall $
$
$
$
push 4$
$
push 5 $
push 6 $
$
pall This is the end of our program. Monty is awesome!$
$
Usage
The code is compiled this way:
$ gcc -Wall -Werror -Wextra -pedantic *.c -o monty
- Any output is printed on
stdout
- Any error message is printed on
stderr
Operation codes :
Opcode | Description |
---|---|
push | Pushes an element to the stack |
pall | Prints all the values on the stack, starting from the top of the stack |
pint | Prints the value at the top of 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 of the stack |
mul | Multiplies the second top element of the stack with the top element of the stack |
div | Divides the second top element of the stack by the top element of the stack |
mod | Computes the rest of the division of the second top element of the stack by the top element of the stack |
pchar | Prints the char at the top of the stack, followed by a new line |
pstr | Prints the string starting at the top of the stack, followed by a new line |
rotr | Rotates the stack to the bottom |
rotl | Rotates the stack to the top |
nop | Doesnt do anything |
stack | (Default) LIFO |
queue | Set to FIFO |
Learning Objectives
- What do LIFO and FIFO mean
- What is a stack, and when to use it
- What is a queue, and when to use it
- What are the common implementations of stacks and queues
- What are the most common use cases of stacks and queues
- What is the proper way to use global variables