ProbL CFG reference
-------------------------------------------------------

program -> 'input' { vdecl_list } 'output' { vdecl_list } fdecl_list 'model' { stmt_list }

vdecl_list -> vdecl vdecl_list | ''

fdecl_list -> fdecl fdecl_list | ''

stmt_list -> stmt stmt_list | ''

vdecl   -> type ID | type ID ;

fdecl   -> 'fun' ID ( formals ) : type { block }

stmt    -> expr ;
         | if ( expr ) { block }
         | if ( expr ) { block } else { block }
         | while ( expr ) { block }
         | for ( expr ; expr ; expr ) { block }
         | return expr ;

block   -> vdecl block | stmt block | ''

formals -> type ID , formals | ''

actuals -> ID , actuals | literal , actuals | expr , actuals | ''

expr    -> expr op expr | ID ( actuals ) | literal | - expr 
         | ID = expr | ID ~ expr

op      -> + | - | / | * | ^ | % 
         | 'and' | 'or' | 'not'
         | == | < | > | <= | >=

type    -> 'int' | 'float' | 'string' | 'bool' | 'enum' | type '[]'

