[ ]'s not within quotes are metasymbols meaning "0 or 1"
executable-part -> 'execute' '{' [statements] '}' statements -> statements statement | statement statement -> tell-statement | new-statement | iterate-statement| remove-statement /* left place statement out */ tell-statement -> tell robot-name ':' instructions tell -> 'tell' | 'Tell' instructions -> '{' {instruction} '}' | instruction new-statement -> new robot-type object-name ['at' coords]';' new -> 'new' | 'New' iterate-statement -> iterate expression 'times' statement | iterate expression 'times' statement '{'statements '}' iterate -> 'iterate' | 'Iterate' remove-statement -> remove robot-name ';' remove -> 'remove' | 'Remove' instruction -> simple-instruction ';' | control-instruction | assignment-instruction simple-instruction -> move expression | pickbeeper | putbeeper | turnleft | turnoff move -> 'Move' | 'move' pickbeeper -> 'pickbeeper' | 'PickBeeper' | 'pick_beeper' putbeeper -> 'putbeeper'| 'PutBeeper' | 'put_beeper' turnleft -> 'turnleft' | 'TurnLeft' | 'turn_left' turnoff -> 'turnoff' | 'TurnOff ' | 'turn_off' control-instruction -> if-instruction | iterate-instruction | while-instruction if-instruction -> if '(' expression ')' instructions else instructions | if '(' expression ')' instructions if -> 'if' | 'If' else -> 'else' | 'Else' iterate-instruction -> iterate expression 'times' instructions while-instruction -> while expression instructions while -> 'While' | 'while' assignment-instruction -> variable-name '=' expression ';' robot-name -> object-name robot-type -> variable-name variable-name -> object-name object-name -> letter { lettdig } coords -> expression "," expression lettdig -> letter | digit | '_' letter -> 'A'..'Z' | 'a'..'z' digit -> '0'..'9' Expression Grammar expression -> relation {and relation} | relation {or relation} relation -> simple_expression [relop simple_expression] simple_expression -> [sign] term {addop term} term -> term mulop factor | factor factor -> not factor | ident | bool_function | '(' expression ')' ident -> variable-name | literal | integer_function literal -> {digit}+ not -> '!' | 'not' relop -> '==' | '!=' | '<' | '>' | '<=' | '>=' addop -> '+' | '-' or -> 'or' | '||' mulop -> '*' | '/' and -> 'and' | '&&' bool_function -> 'front_is_clear' | 'FrontIsClear' | 'right_is_clear' | 'RightIsClear' | 'left_is_clear' | 'LeftIsClear' | 'facing_north' | 'FacingNorth' 'facing_south' | 'FacingSouth' 'facing_east' | 'FacingEast' 'facing_west' | 'FacingWest' integer_function -> 'beepers_in_bag' | 'BeepersInBag' | 'beepers_on_floor' | 'BeepersOnFloor' | 'x_position' | 'XPosition' 'y_position' | 'YPosition' sign -> '+' | '-'