Nullable nonterminals: (exp | extern_defs | maybe_sc | program | sentences | sentences2) The starters of nonterminals: program -> (ENTRY | EXTERNAL | WORD) maybe_sc -> (SC) extern_defs -> (WORD) func_def -> (ENTRY | WORD) block -> (LCURL) sentences -> (CHAR | COMMA | EQL | LANGU | LPAR | NUMB | VAR | WORD) sentences2 -> (SC) sentence -> (CHAR | COMMA | EQL | LANGU | LPAR | NUMB | VAR | WORD) conditions -> (COMMA | EQL) conditions2 -> (COL | COL_CURL) exp -> (CHAR | LANGU | LPAR | NUMB | VAR | WORD) exp_head -> (CHAR | LANGU | LPAR | NUMB | VAR | WORD) static_symbol -> (CHAR | NUMB | WORD) name -> (WORD) The followers of nullable nonterminals: program -> ($END) maybe_sc -> ($END | ENTRY | EXTERNAL | WORD) extern_defs -> (SC) sentences -> (RCURL) sentences2 -> (RCURL) exp -> (COL | COL_CURL | COMMA | EQL | RANGU | RCURL | RPAR | SC) *** Annotated grammar *** #program : ($END) /* empty */ | (EXTERNAL) EXTERNAL #extern_defs SC #program | (ENTRY | WORD) func_def #maybe_sc #program ; #maybe_sc : ($END | ENTRY | EXTERNAL | WORD) /* empty */ | (SC) SC ; #extern_defs : (WORD) name COMMA #extern_defs | (SC) /* empty */ ; func_def : (WORD) name block | (ENTRY) ENTRY name block ; block : (LCURL) LCURL #sentences RCURL ; #sentences : (RCURL) /* empty */ | (CHAR | COMMA | EQL | LANGU | LPAR | NUMB | VAR | WORD) sentence #sentences2 ; #sentences2 : (RCURL) /* empty */ | (SC) SC #sentences ; sentence : (CHAR | COMMA | EQL | LANGU | LPAR | NUMB | VAR | WORD) #exp conditions ; conditions : (COMMA) COMMA #exp conditions2 | (EQL) EQL #exp ; conditions2 : (COL) COL #exp conditions | (COL_CURL) COL_CURL block ; #exp : (COL | COL_CURL | COMMA | EQL | RANGU | RCURL | RPAR | SC) /* empty */ | (CHAR | LANGU | LPAR | NUMB | VAR | WORD) exp_head #exp ; exp_head : (CHAR | NUMB | WORD) static_symbol | (LPAR) LPAR #exp RPAR | (VAR) VAR | (LANGU) LANGU name #exp RANGU ; static_symbol : (CHAR) CHAR | (WORD) WORD | (NUMB) NUMB ; name : (WORD) WORD ;