Skip to content

Latest commit

 

History

History
129 lines (94 loc) · 4.03 KB

README.md

File metadata and controls

129 lines (94 loc) · 4.03 KB

Monty Interpreter

Welcome to the Monty Bytecode Interpreter. This interpreter was built in the C language and is compliant with ISO90, ISO99, & ISO11. It reads Monty bytecode files of any extension (preferably .m although it doesn't matter), and interprets the opcodes contained.

Our interpreter can be run as either a stack (LIFO) or queue (FIFO). Mode can be switched mid-script. The interpreter can handle a variety of Monty opcodes, including printing, mathematical operations, and more - all handled opcodes are listed below.

Installing and Using

Clone the repository into a new directory:

$ git clone https://github.com/alaedine07/monty

Compile with the following:

gcc -Wall -Werror -Wextra -pedantic *.c -o monty

Run the interpreter on a file:

./monty file.m

Monty Opcodes

  • push

    • Usage: push <int>
    • Pushes an element to the stack.
    • The parameter <int> must be an integer.
  • pall

    • Prints all values in the stack/queue, starting from the top.
  • pint

    • Prints the top value of the stack/queue.
  • pop

    • Removes the top element of the stack/queue.
  • swap

    • Swaps the top two elements of the stack/queue.
  • nop

    • Does not do anything.
  • add

    • Adds the top two elements of the stack/queue.
    • The result is stored in the second element from the top and the top element is popped.
  • sub

    • Subtracts the top element of the stack/queue from the second element from the top.
    • The result is stored in the second element from the top and the top element is removed.
  • mul

    • Multiplies the top two elements of the stack/queue.
    • The result is stored in the second element from the top and the top element is removed.
  • div

    • Divides the second element from the top of the stack/queue by the top element.
    • The result is stored in the second element from the top and the top element is removed.
  • mod

    • Computes the modulus of the second element from the top of the stack/queue divided by the top element.
    • The result is stored in the second element from the top and the top element is removed.
  • pchar

    • Prints the character value of the top element of the stack/queue.
    • The integer at the top is treated as an ASCII value.
  • pstr

    • Prints the string contained in the stack/queue.
    • Prints characters element by element until the stack/queue is empty, a value is 0, or an error occurs.

Opcodes preceeded by a # are treated as comments and the corresponding line is ignored.

Lines can be empty and can contain any number of spaces before or after an opcode and its argument (only the first opcode and/or argument is taken into account).

Examples

Note, Monty Interpreter runs in the default mode of STACK mode. Meaning it uses a stack. To switch to queue mode, see examples below.

Push values onto the stack and print them all, or the top of the stack/front of queue.

$ cat push_pall_pint.m
push 1
push 2
push 3
pall
pint
$ ./monty push_pall_pint.m
3
2
1
3

Using mathmatical operations to add, multiply, divide, etc. Takes the second from the top and performs the operation on the top: second_from_top / top, second_from_top - top, etc. Then assigns that to the second_from_top and pops the top element off the stack.

$ cat math.m
push 3
push 2
push 1
pall
mul
pall
$ ./monty math.m
1
2
3
1
6

AUTHOR

Atef Mechken : LinkedIn | GitHub | Twitter

AUTHOR DESCRIPTION

Since my early years, I have been pretty active in social activity such as my 2 years as a member of Electronic Tunisian Legends one of the more popular organisation in media and vidéo game community in Tunisia. Also my experience as a Co-Marketing Manager in Hult Prize University of Souse helped me a lot enlarging my knowledge in the marketing field, combined with my computer skills I managed to be the winner team of the Hult Prize 2019 local competition and qualified me to reach the regional of that year.