This is a simplified Bali specification for the Part 2 assignment. Bali is designed to be reasonably simple to compile. The Bali language changes every semester.
We use the following notation throughout this document:
program | int main ( ) : [ declarations ] : statement* end | A program consists of a single function. This function must (1) have return type int (this returned value remains on the stack when the program halts), (2) be called main, and (3) have no parameters. The function body consists of optional declarations (local variables) followed by zero or more statements. |
declarations | type name ( , type name )* | Each declaration is a type followed by a name. |
type | ( int | boolean) | There are predefined types (int, boolean) |
statement | reference = expression ; | An assignment statement. |
if expression then statement* [ else statement*] endif | An if-statement has an optional else part. | |
loop statement* ( while | until ) expression ; statement* endloop | Looping. Note that there are two blocks of statements. The loop works by executing the first block, then checking the condition and possibly exiting the loop, then executing the second block. If the condition causes a loop-exit then the second block is not executed. After executing the second block the loop starts over again with the first block. Either statement-block in a loop can be empty or both blocks be nonempty. (It's also legal for both blocks to be empty, but then it's not clear that the loop would be useful.) | |
return expression ; | Return statement. | |
print expression ( , expression )* ; | Print statement. Multiple expressions can be printed. Ideally, all are printed on a single line with a space between adjacent items, but this isn't currently possible with SaM-code. | |
reference | name | A reference to a local variable. |
expression | [ + | - | not ] term ( binaryOp term )* | An expression is a a sequence of terms separated by binary operators. There can be an optional sign or boolean-negation in front of the first term of an expression; it is applied to the first term. Operators are evaluated left-to-right (i.e., no precedence rules). |
binaryOp | arithmeticOp | comparisonOp | booleanOp | The three kinds of binary operators. |
arithmeticOp | + | - | * | / | % | Operators for arithmetic. |
comparisonOp | < | <= | == | != | > | >= | Comparison operators. |
booleanOp | and | or | Boolean operators (both are short-circuiting). |
term | literal | ( expression ) | inputValue | reference | A term is a literal, a parenthesized expression, an input value, or a reference. |
literal | integer | true | false | Unsigned integers (e.g., 123, 6, 44) and boolean constants. |
inputValue | readInt | This "value" is read from standard input; readInt expects an integer (initial blanks are ignored, an initial + or - is OK). |
keywords |
|
program |
|
main function |
|
declarations |
|
statements |
|
expressions |
|
input |
|
predefined names |
|