The PALE syntax is defined in two levels: a basic language, and some convenient extensions making PALE look like ordinary programming languages. The grammar below is written in BNF extended with the following extra notation:
| ( X )@: | a comma separated list of one or more X's | |
| ( X )&: | a comma separated list of zero or more X's | |
| ( X )*: | a list of zero or more X's | |
| ( X )?: | zero or one X |
| p: | pointer/data variable/field |
| b: | boolean variable/field |
| s: | set variable |
| m: | predicate |
| T: | type |
| str: | label (string enclosed in "..") |
| pale | -> | ( declaration )* |
| declaration | -> | transducedecl | | | typedecl | | | progvar; | | | preddecl; |
| typedecl | -> | type T = { ( field ; )* } |
| field | -> | data ( d )@ : T |
| | | pointer ( p )@ : T [ formula ] | |
| | | bool ( b )@ |
| progvar | -> | data ( p )@ : T |
| | | pointer ( p )@ : T | |
| | | bool ( b )@ |
| logicvar | -> | pointer ( p )@ : T |
| | | bool ( b )@ | |
| | | set ( s )@ : T |
| preddecl | -> | pred m ( ( logicvar )& ) = formula |
| transducedecl | -> | transduce ( str )? ( logicvar ; )* [ formula ( { ( pointerformula )& } )? ] stm |
| pointerformula | -> | T . p ( [ formula ] )? |
| stm | -> | stm stm |
| | | ( assignment )@ ; | |
| | | if ( condexp ) { stm } ( else { stm } )? | |
| | | assert [ formula ( { ( pointerformula )& } )? ] | |
| | | ; |
| assignment | -> | lboolexp = condexp | | | lptrexp = ptrexp |
| formula | -> | existpos ( p )@ of T : formula | | | allpos ( p )@ of T : formula |
| | | existset ( s )@ of T : formula | | | allset ( s )@ of T : formula | |
| | | existptr ( p )@ of T : formula | | | allptr ( p )@ of T : formula | |
| | | existbool ( s )@ : formula | | | allbool ( s )@ : formula | |
| | | ( formula ) | | | ! formula | |
| | | formula & formula | | | formula | formula | |
| | | formula => formula | | | formula <=> formula | |
| | | ptrexp in setexp | | | setexp sub setexp | |
| | | setexp = setexp | | | setexp != setexp | |
| | | empty ( setexp ) | | | ptrexp < routingexp > ptrexp | |
| | | formula ? formula : formula | | | ptrexp < routingexp > setexp | |
| | | m ( ( predarg )& ) | | | boolexp |
| predarg | -> | formula | | | ptrexp | | | setexp |
| condexp | -> | ? | | | boolexp | | | [ formula ] |
| boolexp | -> | ( boolexp ) | | | ! boolexp |
| | | boolexp & boolexp | | | boolexp | boolexp | |
| | | boolexp => boolexp | | | boolexp <=> boolexp | |
| | | boolexp = boolexp | | | ptrexp = ptrexp | |
| | | boolexp != boolexp | | | ptrexp != ptrexp | |
| | | true | | | false | |
| | | lboolexp | | | boolexp ? boolexp : boolexp |
| lboolexp | -> | b | | | ptrexp . b |
| ptrexp | -> | null | | | this | | | pos | | | lptrexp | | | formula ? ptrexp : ptrexp |
| lptrexp | -> | p | | | ptrexp . p |
| setexp | -> | s | | | ptrexp ^ T . p | | | { ( ptrexp )@ } | | | formula ? setexp : setexp |
| | | setexp union setexp | | | setexp inter setexp | | | setexp minus setexp | |||
| routingexp | -> | p | | | ^ T . p | | | [ formula ] |
| | | routingexp . routingexp | | | ( routingexp ) | |||
| | | routingexp + routingexp | | | routingexp * | |||
| n: | procedure |
| declaration | -> | proc n ( ( progvar )& ) : ( T | void ) ( logicvar ; )* [ formula ( { ( pointerformula )& } )? ] ( { ( progvar ; )* stm } )? [ formula ( { ( pointerformula )& } )? ] |
| stm | -> | while [ formula ( { ( pointerformula )& } )? ] ( condexp ) { stm } |
| | | return progexp ; | |
| | | split [ formula ( { ( pointerformula )& } )? ] ( [ formula ( { ( pointerformula )& } )? ] )? ; | |
| | | proccall ; |
| assignment | -> | lprogexp = proccall |
| proccall | -> | n ( ( progexp )& ) [ formula ] |
| boolexp | -> | n . b | | | return |
| ptrexp | -> | n . p | | | return |
| setexp | -> | n . s |
| progexp | -> | condexp | | | ptrexp |
| lprogexp | -> | lboolexp | | | lptrexp |
| Copyright © 2000 Anders Møller |