Facile Grammar Original by Alex Thornton Revised by David G. Kay, Winter 2012 The start symbol is [program]. { [program] [statement] \n.\n [statement] \n [program] [statement] \n [program] [statement] \n [program] [statement] \n [program] [statement] \n [program] [statement] \n [program] [statement] \n [program] [statement] \n [program] [statement] \n [program] [statement] \n [program] } The first right-hand side ends the program with a dot. The other right-hand side is copied many times to influence how often it's selected. (If they're chosen at random, there are many chances to get the continuing one and just one chance to get the program-ending one.) { [statement] LET [sp] [variableName] [sp] [number] PRINT [sp] [variableName] GOTO [sp] [number] ADD [sp] [variableName] [sp] [number] SUB [sp] [variableName] [sp] [number] MUL [sp] [variableName] [sp] [number] DIV [sp] [variableName] [sp] [number] IF [sp] [variableName] [sp] [comparisonOp] [sp] [number] [sp] THEN [sp] [number] GOSUB [sp] [number] RETURN INC [sp] [variableName] DEC [sp] [variableName] } { [variableName] [letter] [variableName] [alphanumeric-plus] } { [letter] A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z } { [alphanumeric-plus] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [letter] [digit] [digit] [variable-punct] } { [digit] 0 1 2 3 4 5 6 7 8 9 } { [variable-punct] - _ = + * & $ # @ ! . , ? / } Might as well allow more symbols than Python does. { [number] [digit] [digit] [number] } { [comparisonOp] < > <= >= = <> } { [sp] \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \x20 \t \x20 [sp] \t [sp] }