<desc> ::= <type> | <variable> | (<feature>:<desc>) | (<desc>,<desc>) | (<desc>;<desc>) | @ <macro_spec> | <func_spec> | a_ <prolog_term> | <path> == <path> | =\= <desc> <type> ::= <prolog_functor> <feature> ::= <prolog_atom> <path> ::= list(<feature>) <macro_def> ::= <macro_head> macro <desc>. <macro_head> ::= <macro_name> | <macro_name>(<seq(var)>) <macro_spec> ::= <macro_name> | <macro_name>(<seq(desc)>) <func_def> ::= <func_spec> +++> <desc>. <func_spec> ::= <func_name> | <func_name>(<seq(desc)>) <clause> ::= <literal> if <goal>. <literal> ::= <pred_sym> | <pred_sym>(<seq(desc)>) <cut_free_goal> ::= true | <literal> | prolog(<prolog_goal>) | (<cut_free_goal>,<cut_free_goal>) | (<cut_free_goal>;<cut_free_goal>) | (<desc> =@ <desc>) | (<cut_free_goal> -> <cut_free_goal>) | (<cut_free_goal> -> <cut_free_goal> ; <cut_free_goal>) | (\+ <cut_free_goal>) <goal> ::= true | <literal> | prolog(<prolog_goal>) | (<goal>,<goal>) | (<goal>;<goal>) | (<desc> =@ <desc>) | (<cut_free_goal> -> <goal>) | (<cut_free_goal> -> <goal> ; <goal>) | ! | (\+ <goal>) | when(<cond>,<goal>) <cond> ::= <variable>^(<cond>) | <quantified_cond> <quantified_cond> ::= <quantified_cond>, <quanitifed_cond> | <quantified_cond> ;<quanitifed_cond> | <variable>=<cond_desc> <cond_desc> ::= <variable> | <type> | max(<type>) | <feat>:<cond_desc> | <path> == <path> | <cond_desc>, <cond_desc> | <cond_desc> ;<cond_desc> <lex_entry> ::= <word> ---> <desc>. <rule> ::= <rule_name> rule <desc> ===> <rule_body>. <rule_body> ::= <sem_less_rule_body> | <sem_less_rule_body>,<sem_rule_body>, <sem_less_rule_body> <sem_less_rule_body> ::= <rule_clause> | <rule_clause>, <sem_less_rule_body> <rule_clause> ::= cat> <desc> | cats> <desc> | goal> <goal> <sem_rule_body> ::= sem_head> <desc> | sem_goal> <goal>, sem_head> <desc> | sem_head> <desc>, sem_goal> <goal> | sem_goal> <goal>, sem_head> <desc>, sem_goal> <goal> <lex_rule> ::= <lex_rule_name> lex_rule <lex_rewrite> morphs <morphs>.
<lex_rewrite> ::= <desc> **> <desc> | <desc> **> <desc> if <goal> <morphs> ::= <morph> | <morph>, <morphs> <morph> ::= (<string_pattern>) becomes (<string_pattern>) | (<string_pattern>) becomes (<string_pattern>) when <prolog_goal> <string_pattern> ::= <atomic_string_pattern> | <atomic_string_pattern>, <string_pattern> <atomic_string_pattern> ::= <atom> | <var> | <list(<var_char>)> <var_char> ::= <char> | <var> <seq(X)> ::= <X> | <X>, <seq(X)> <empty_prod> ::= empty <desc>. <type_spec> ::= <type> sub <list(<type>)> | <type> sub <list(<type>)> intro <list(<frestr_spec>)> | <type> intro <list(<frestr_spec>)> <frestr_spec> ::= <feature>:<type> | <feature>: a_ <prolog_term> <cons_spec> ::= <type> cons <desc> | <type> cons <desc> goal <goal> <ext_spec> ::= ext(list(<type>)) <prog> ::= <prog_line> | <prog_line> <prog>
<prog_line> ::= <type_spec> | <ext_spec> | <cons_spec> | <macro_def> | <empty_prod> | <clause> | <rule> | <lex_entry> | <lex_rule>