LPSpp is an interpreter for the simple assembly-like programming language LPS, written in C++1x.
You can either open the solution in Visual Studio 2019 or build using Cmake.
Instructions must be written in capital letters. Instructions are separated by a new line and the arguments are separated by spaces.
White spaces are allowed and do not count as instructions. x denotes a integer literal, @x refers to the x-th register starting from 0
and : denotes an integer label (only allowed in JMP instruction), denoting the number of instructions that will be skipped.
Comments are preceded by ;.
Each instruction has a type and a class, so that the interpreter can distinguish between valid and invalid operations and allow overloading.
An instruction belongs to at least one of the following classes:
| Class | Semantic |
|---|---|
STACK |
The instruction involves the stack |
REGISTER |
The instruction involves the registers |
SPECIAL |
The instruction does special operations which are neither on the stack nor on the registers |
IMMEDIATE |
The instruction involves a literal |
JUMP |
The instruction allows for relative jumps |
COMPARISON |
The instruction executes a comparison |
Note that SPECIAL cannot be combined with any other class.
A type is a possible instruction. Currently there are 9 valid instructions:
| Type | Classes | Semantic |
|---|---|---|
PUSH (x | @x) |
STACK | IMMEDIATE |
Pushes x or @x onto the stack |
POP @x |
STACK | REGISTER |
Pops the top of the stack into @x |
PRINT @x |
REGISTER |
Prints the content of @x |
HLT |
SPECIAL |
Terminates the execution of the program |
ADD,SUB,MUL,DIV (x | @x) @y |
REGISTER | IMMEDIATE |
Executes the arithmetic operation and saves the result into @y |
MOVE (x | @x) @y |
REGISTER | IMMEDIATE |
Copies the content of the @x, or x, into @y |
GEQ, LEQ, GT, LT (x | @x) @y |
REGISTER | IMMEDIATE |
Executes a comparison between x (or @x) and @y, and sets @8 to 1 if true |
JMP (:x | :@x) |
STACK | REGISTER | JUMP |
Jumps to the x or @x-th instruction |