program: scope statement: , /* empty */ variable '<' '-' expression , 'if' expression 'then' statement [ 'else' statement ] 'end' , 'while' expression 'do' statement 'end' , 'loop' statement 'end' , 'exit' , 'return' [ '(' expression ')' ] 'put' output , 'get' input , scope , procedurename [ '(' arguments ')' ] , statement statement scope: 'begin' [declaration] statement 'end' expression: integer , '-' expression , expression '+' expression , expression '-' expression , expression '*' expression , expression '/' expression , expression '^' expression , 'true' , 'false' , 'not' expression , expression 'and' expression , expression 'or' expression , expression '=' expression , expression 'not' '=' expression , expression '<' expression , expression '<' '=' expression , expression '>' expression , expression '>' '=' expression , '(' expression ')' , '{' [ declaration ] statement 'yields' expression '}' variable , functionname [ '(' arguments ')' ] , parametername declaration: type ':' identifier , type ':' identifier '[' expression ']' , type 'function' identifier [ '(' parameters ')' ] scope , 'procedure' identifier [ '(' parameters ')' ] scope , declaration declaration output: expression , text , 'skip' , output ',' output input: variable , input ',' input type: 'integer' , 'boolean' arguments: expression , expression ',' arguments parameters: type ':' identifier , parameters ',' type ':' identifier variable: variablename , arrayname '[' expression ']' variablename: identifier arrayname: identifier functionname: identifier procedurename: identifier parametername: identifier
identifier examples: am al a_B integer examples: 0 32767 text examples: "aB )'$" "He said ""hello""." comment example: /* comments are bracketed by * and / */
Tokens may be separated by blanks, comments, or line boundaries. An identifier or keyword must be separated from a following identifier, keyword, integer, or newline token; in all other cases, tokens need not be separated. No token or comment can be continued across a line boundary.
Each identifier must be declared before it is used. There are no type conversions. The precedence and associativity of operators is:
0. unary- 1. ^ Right-associative 2. * / Left-associative 3. + binary- Left-associative 4. = not= < <= > >= 5. not 6. and 7. or
Unless otherwise specified, operators do not associate. So, a=b=c is illegal. Array indexes start at 1.