PLAN Grammar*for PLAN version 3.1

PLAN Grammar*
for PLAN version 3.1

Jonathan T. Moore with Pankaj Kakkar






This is intended to be a human-readable form of the grammar; it is not intended to indicate precedence or associativity of operators. Terminals are specified in bold, non-terminals in italics. e denotes the empty expression (reduction on no input).

program ::= def-list
def-list ::= def | def def-list
def ::= fundef | exndef | valdef | svcdef
fundef ::= fun var ( paramlist ) opt-type-expr = expr
  | fun var ( ) opt-type-expr = expr
param ::= var opt-type-expr
paramlist ::= param | param paramlist
exndef ::= exception var
valdef ::= val var opt-type-expr = expr
svcdef ::= svc var : type-expr
opt-type-expr ::= type-expr | e
type-expr ::= void -> type-expr
  | ( type-params ) -> type-expr
  | type-expr -> type-expr
  | tuple-type
type-params ::= type-expr , type-params
  | type-expr , type-expr
list-type ::= type-atom
  | list-type list
  | list-type chunk
tuple-type ::= list-type
  | list-type * tuple-type
type-atom ::= base-type | ' var | ( type-expr )
base-type ::= unit | int | char | string | bool | host | port
  | key | blob | exn | dev
expr ::= value
  | op-expr
  | if expr then expr else expr
  | raise id
  | try expr handle id => expr
  | let def-list in expr end
  | ( expr-list )
  | ( arg-list )
  | |id| ( arg-list )
  | |id| ( )
arg-list ::= expr | expr , arg-list
expr-list ::= expr | expr ; expr-list
value ::= var | true | false | () | [] | [ expr-list ]
  | int-literal | char-literal | string-literal
op-expr ::= id ( ) | id ( arg-list )
  | unary-op expr
  | expr binary-op expr
  | nary-op-expr
unary-op ::= ~ | not | hd | tl | fst | snd | # int-literal | noti
  | explode | implode | ord | chr
binary-op ::= / | % | * | + | -- | and | or | < | <= | > | >= | = | <> | :: | ^
  | << | >> | xori | andi | ori
nary-op-expr ::= OnRemote ( expr , expr , expr , expr )
  | OnNeighbor ( expr , expr , expr )
  | RetransOnRemote ( expr , expr , expr , expr , expr , expr )
  | foldr ( expr , expr , expr )
  | foldl ( expr , expr , expr )
int-literal ::= digit | nonzero-digit digit-string
digit-string ::= digit | digit digit-string
nonzero-digit ::= [1 - 9]
digit ::= [0 - 9]
char-literal ::= ' character '
character ::= ~[', \] | \\ | \n | \t | \b | \r | \' | \"
string-literal ::= "" | " strchar-list "
strchar-list ::= strchar | strchar strchar-list
strchar ::= ~[", \] | \\ | \n | \t | \b | \r | \' | \"
id ::= var | var . id
var ::= varstartchar | varstartchar varchar-list
varstartchar ::= [ a - z, A - Z ]
varchar ::= [ a - z, A - Z, 0 - 9, _ ]
varchar-list ::= varchar | varchar varchar-list

This document was tranlated from LATEX by HEVEA and HACHA.