program ::= class;+
class ::= class TYPE [inherits
TYPE] is feature;*
end
feature ::= ID(formal,*) : TYPE is expr end
|
ID : TYPE [ <- expr ]
formal ::= ID : TYPE
expr ::= ID <- expr
| expr[@TYPE].ID(expr,+)
| ID(expr,+)
| if expr then expr else expr fi
| while expr loop expr pool
| begin expr;+
end
| let {ID : TYPE [
<- expr ],}+ in expr end
| case expr of {ID : TYPE => expr;}+
esac
| new TYPE
| isvoid expr
| expr + expr
| expr - expr
| expr * expr
| expr / expr
| ~expr
| expr < expr
| expr <= expr
| expr = expr
| not expr
| (expr)
| ID
| integer
| string
| true
| false
A legerősebbtől leggyengébbig a következő a műveletek precedenciája:
.
@
~
isvoid
* /
+ -
<= < =
not
<-
Minden bináris művelet bal-asszociatív kivéve az értékadást, ami jobb-asszociatív, és a 4 összehasonlító műveletet, amelyek nem asszociatívak.