date -> month [1-9][0-9]? 20[0-9][0-9] month -> Jan | Feb | Mar | Apr | May | Jun
address -> streetNumber \s streetName \s streetSuffix streetNumber -> [1-9][0-9]?[0-9]?[0-9]?[0-9]? streetName -> [A-Z][a-z]*(\s [A-Z][a-z]*)* streetSuffix -> Rd | Ln | Ave | St
number -> [+-]?(integer | float) integer -> [1-9][0-9]* float -> (0 | integer).[0-9]+
command -> moveCmd | rotateCmd | zoomCmd | scaleCmd moveCmd -> move direction number direction -> up | down | left | right rotateCmd -> rotate number (degrees | radians) zoomCmd -> zoom number scaleCmd -> scale number number number
relExp -> operand operator operand operand -> number | id operator -> < | <= | > | >= | == | !=
boolExp -> boolExp and boolExp | boolExp or boolExp | not boolExp | ( boolExp ) | relExp
whileLoop -> while ( boolExp ) do loopBody end loopBody -> (assignStmt | whileLoop)+ assignStmt -> id = exp ;
letter (letter | digit)*and gets "stuck" if it sees anything that would cause an error (such as a string that starts with a digit), and one that goes to an error state if it sees anything other than a letter or a digit: