Nullable nonterminals: (const_bindings | const_bindings_tail | decls | directives | exp | implem | imports | interf | iter | let | module_name | names | native_sentences | path | path_tail | paths | pattern | pattern_alts | rest | sentence | sentences | source) The starters of nonterminals: program -> (IMPLEMENTATION | INTERFACE) implem -> (CONST | FUNC_DECL | MODULE | NATIVE | OBJ_DECL | PUBLIC | TRACE_ALL | USE | WORD) interf -> (CONST | FUNC_DECL | MODULE | OBJ_DECL | PUBLIC) module_name -> (MODULE) imports -> (USE) directives -> (CONST | FUNC_DECL | NATIVE | OBJ_DECL | PUBLIC | TRACE_ALL | WORD) directive -> (CONST | FUNC_DECL | NATIVE | OBJ_DECL | PUBLIC | TRACE_ALL | WORD) decls -> (CONST | FUNC_DECL | OBJ_DECL | PUBLIC) decl -> (CONST | FUNC_DECL | OBJ_DECL | PUBLIC) private_decl -> (CONST | FUNC_DECL | OBJ_DECL) obj_decl -> (OBJ_DECL) const_decl -> (CONST) const_bindings -> (WORD) const_bindings_tail -> (COMMA) const_binding -> (WORD) func_decl -> (FUNC_DECL) native -> (NATIVE) native_block -> (LCURL | WORD) native_sentences -> (WORD) native_sentence -> (WORD) trace_all -> (TRACE_ALL) func_def -> (WORD) sentence -> (CHAR | COMMA | CUT | EQL | ERROR | FAIL | FENCE | LANGU | LCURL | LPAR | MATCH_DIR | NOT | NUMB | REF | TRAP | VAR | WORD) path -> (CHAR | COL | COL_CURL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LANGU | LCURL | LET | LPAR | NOT | NUMB | REF | TRAP | VAR | WORD) path_tail -> (COL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LET | NOT | TRAP) iter -> (ITER) let -> (LET) rest -> (COMMA | CUT | EQL | ERROR | FAIL | FENCE | NOT | TRAP) source -> (CHAR | COL_CURL | LANGU | LCURL | LPAR | NUMB | REF | VAR | WORD) pattern_alts -> (COL_CURL) pattern -> (CHAR | LANGU | LPAR | MATCH_DIR | NUMB | REF | VAR | WORD) pattern_alt -> (LCURL) sentences -> (CHAR | COMMA | CUT | EQL | ERROR | FAIL | FENCE | LANGU | LCURL | LPAR | MATCH_DIR | NOT | NUMB | REF | SC | TRAP | VAR | WORD) alt -> (LCURL) paths -> (CHAR | COL | COL_CURL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LANGU | LCURL | LET | LPAR | NOT | NUMB | REF | SC | TRAP | VAR | WORD) exp -> (CHAR | LANGU | LPAR | NUMB | REF | VAR | WORD) exp_head -> (CHAR | LANGU | LPAR | NUMB | REF | VAR | WORD) static_symbol -> (CHAR | NUMB | WORD) names -> (WORD) name -> (WORD) The followers of nullable nonterminals: implem -> ($END) interf -> ($END) module_name -> ($END | CONST | FUNC_DECL | NATIVE | OBJ_DECL | PUBLIC | TRACE_ALL | USE | WORD) imports -> ($END | CONST | FUNC_DECL | NATIVE | OBJ_DECL | PUBLIC | TRACE_ALL | WORD) directives -> ($END) decls -> ($END) const_bindings -> (SC) const_bindings_tail -> (SC) native_sentences -> (RCURL) sentence -> (SC | WITH) path -> (SC | WITH) path_tail -> (SC | WITH) iter -> (COMMA | CUT | EQL | ERROR | FAIL | FENCE | LET | NOT | SC | TRAP | WITH) let -> (COMMA | CUT | EQL | ERROR | FAIL | FENCE | NOT | SC | TRAP | WITH) rest -> (SC | WITH) source -> (COL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LET | NOT | SC | TRAP | WITH) pattern_alts -> (COL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LET | NOT | SC | TRAP | WITH) pattern -> (COMMA | CUT | EQL | ERROR | FAIL | FENCE | NOT | SC | TRAP | WITH) sentences -> (RCURL) paths -> (RCURL) exp -> (COL | COL_CURL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LET | NOT | RANGU | RPAR | SC | TRAP | WITH) names -> (SC) *** Annotated grammar *** program : (IMPLEMENTATION) IMPLEMENTATION #implem | (INTERFACE) INTERFACE #interf ; #implem : ($END | CONST | FUNC_DECL | MODULE | NATIVE | OBJ_DECL | PUBLIC | TRACE_ALL | USE | WORD) #module_name #imports #directives ; #interf : ($END | CONST | FUNC_DECL | MODULE | OBJ_DECL | PUBLIC) #module_name #decls ; #module_name : ($END | CONST | FUNC_DECL | NATIVE | OBJ_DECL | PUBLIC | TRACE_ALL | USE | WORD) /* empty */ | (MODULE) MODULE name SC ; #imports : (USE) USE #names SC #imports | ($END | CONST | FUNC_DECL | NATIVE | OBJ_DECL | PUBLIC | TRACE_ALL | WORD) /* empty */ ; #directives : (CONST | FUNC_DECL | NATIVE | OBJ_DECL | PUBLIC | TRACE_ALL | WORD) directive SC #directives | ($END) /* empty */ ; directive : (CONST | FUNC_DECL | OBJ_DECL | PUBLIC) decl | (WORD) func_def | (NATIVE) native | (TRACE_ALL) trace_all ; #decls : (CONST | FUNC_DECL | OBJ_DECL | PUBLIC) decl SC #decls | ($END) /* empty */ ; decl : (PUBLIC) PUBLIC private_decl | (CONST | FUNC_DECL | OBJ_DECL) private_decl ; private_decl : (OBJ_DECL) obj_decl | (CONST) const_decl | (FUNC_DECL) func_decl ; obj_decl : (OBJ_DECL) OBJ_DECL #names ; const_decl : (CONST) CONST #const_bindings ; #const_bindings : (WORD) const_binding #const_bindings_tail | (SC) /* empty */ ; #const_bindings_tail : (COMMA) COMMA const_binding #const_bindings_tail | (SC) /* empty */ ; const_binding : (WORD) name EQL #exp ; func_decl : (FUNC_DECL) FUNC_DECL name #exp EQL #exp ; native : (NATIVE) NATIVE native_block ; native_block : (LCURL) LCURL #native_sentences RCURL | (WORD) native_sentence ; #native_sentences : (WORD) native_sentence SC #native_sentences | (RCURL) /* empty */ ; native_sentence : (WORD) name EQL name ; trace_all : (TRACE_ALL) TRACE_ALL ; func_def : (WORD) name #sentence ; #sentence : (LCURL) pattern_alt #pattern_alts #path_tail | (CHAR | COMMA | CUT | EQL | ERROR | FAIL | FENCE | LANGU | LPAR | MATCH_DIR | NOT | NUMB | REF | SC | TRAP | VAR | WITH | WORD) #pattern #rest ; #path : (CHAR | COL | COL_CURL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LANGU | LCURL | LET | LPAR | NOT | NUMB | REF | SC | TRAP | VAR | WITH | WORD) #source #path_tail ; #path_tail : (COL) COL #sentence | (COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LET | NOT | SC | TRAP | WITH) #iter #let #rest ; #iter : (ITER) ITER #source | (COMMA | CUT | EQL | ERROR | FAIL | FENCE | LET | NOT | SC | TRAP | WITH) /* empty */ ; #let : (LET) LET #exp | (COMMA | CUT | EQL | ERROR | FAIL | FENCE | NOT | SC | TRAP | WITH) /* empty */ ; #rest : (COMMA) COMMA #path | (FENCE) FENCE #path | (CUT) CUT #path | (ERROR) ERROR #path | (EQL) EQL #path | (NOT) NOT #source #rest | (FAIL) FAIL | (TRAP) TRAP #path WITH #sentence | (SC | WITH) /* empty */ ; #source : (LCURL) alt #pattern_alts | (CHAR | COL | COL_CURL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LANGU | LET | LPAR | NOT | NUMB | REF | SC | TRAP | VAR | WITH | WORD) #exp #pattern_alts ; #pattern_alts : (COL_CURL) COL_CURL pattern_alt #pattern_alts | (COL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LET | NOT | SC | TRAP | WITH) /* empty */ ; #pattern : (MATCH_DIR) MATCH_DIR #exp | (CHAR | COMMA | CUT | EQL | ERROR | FAIL | FENCE | LANGU | LPAR | NOT | NUMB | REF | SC | TRAP | VAR | WITH | WORD) #exp ; pattern_alt : (LCURL) LCURL #sentences RCURL ; #sentences : (CHAR | COMMA | CUT | EQL | ERROR | FAIL | FENCE | LANGU | LCURL | LPAR | MATCH_DIR | NOT | NUMB | REF | SC | TRAP | VAR | WORD) #sentence SC #sentences | (RCURL) /* empty */ ; alt : (LCURL) LCURL #paths RCURL ; #paths : (CHAR | COL | COL_CURL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LANGU | LCURL | LET | LPAR | NOT | NUMB | REF | SC | TRAP | VAR | WORD) #path SC #paths | (RCURL) /* empty */ ; #exp : (CHAR | LANGU | LPAR | NUMB | REF | VAR | WORD) exp_head #exp | (COL | COL_CURL | COMMA | CUT | EQL | ERROR | FAIL | FENCE | ITER | LET | NOT | RANGU | RPAR | SC | TRAP | WITH) /* empty */ ; exp_head : (REF) REF name | (CHAR | NUMB | WORD) static_symbol | (LPAR) LPAR #exp RPAR | (VAR) VAR | (LANGU) LANGU name #exp RANGU ; static_symbol : (CHAR) CHAR | (WORD) WORD | (NUMB) NUMB ; #names : (WORD) name #names | (SC) /* empty */ ; name : (WORD) WORD ;