SPL

TL;DR

SPL is a very simple structured programming language designed to be used in exercises for the compiler construction course at the University of Bern (Spring 2023). It is also used as a case study for PetitParser. See PetitParser SPL case study.

Language features

SPL is a minimal language supporting only simple simple expressions, variable declarations, if and while control statements, blocks, and print statements.

There is no input to programs, aside from variable declarations, and no functions, so no run-time stack.

SPL supports as basic data types Booleans, strings and numbers (integers and floats).

Expressions include basic arithmetic operators, comparison, logical and and or, and Boolean and integer negation.

Example program

In this example we can see comments, variable declarations, initialization, arithmetic and Boolean expressions, a while statement, and a print statement.

        
// Factorial in SPL -- computes the factorial of arg
var arg=5;
var x=arg;
var fact=1;
while (x>0) {
	fact = fact * x;
	x = x - 1;
}
print fact;
        
      

Grammar

What follows is a complete specification of the grammar of SPL (but without the specification of comments and tokens).

        
program        := declaration* EOF ;
declaration    := varDecl
               | statement ;
varDecl        := "var" IDENTIFIER ( "=" expression )? ";" ;
statement      := exprStmt
               | ifStmt
               | printStmt
               | whileStmt
               | block ;
exprStmt       := expression ";" ;
ifStmt         := "if" "(" expression ")" statement ( "else" statement )? ;
printStmt      := "print" expression ";" ;
whileStmt      := "while" "(" expression ")" statement ;
block          := "{" declaration* "}" ;
expression     := assignment ;
assignment     := IDENTIFIER "=" assignment
               | logic_or ;
logic_or       := logic_and ( "or" logic_and )* ;
logic_and      := equality ( "and" equality )* ;
equality       := comparison ( ( "!=" | "==" ) comparison )* ;
comparison     := term ( ( ">" | ">=" | "<" | "<=" ) term )* ;
term           := factor ( ( "-" | "+" ) factor )* ;
factor         := unary ( ( "/" | "*" ) unary )* ;
unary          := ( "!" | "-" ) unary
               | primary ;
primary        := "true" | "false" | NUMBER | STRING
               | "(" expression ")"
               | IDENTIFIER ;
        
      

Semantics

SPL programs take no input aside from the program source, and produce only the output from the use of print statements.

Some aspects are left unspecified, for example:

- Is there a flat environment of variables, or do blocks introduce nested environments?

- What is the value of a variable that is declared, but not initialized or assigned?

- What should happen on error? (Access to undeclared or uninitialized variable. Type rrors in expressions. Non-terminating programs.)

- Should erroneous programs be rejected, aborted at run time, or continue executing?

For the interpreter, we will assume (1) a flat environment of variables, (2) declared variables initially have a nil value, (3) errors are detected at run time, and raise a run-timer error in the interpreter.