/**
 * LMNtalե =(1)=>  =(2)=> ̣ =(3)=> 롼륪֥
 *
 * 2004/07/14 (n-kato) ΥեϸŤΤǻ٤ˤƤ
 *
 * (1) ʸϴ LMNParser::parserSrc()
 *   @ ե򤽤ΤޤJavaΥ֥ȤؤѴ롣
 *     compile.parser.*
 *   @ JFlex, Java CUP
 *     JFlex (http://jflex.de/) Ver 1.4 pre5
 *         ant flex_compile
 *         Lexer.java
 *     Java CUP (http://www.cs.princeton.edu/~appel/modern/java/CUP/) Ver 0.10k
 *         ant bison_compile
 *         parser.java
 *   @ άˡб
 *   @ 롼Ǥиʤ(RuleContext)ǡʬ˽ФƤ
 *     褦ʤȤϥåƤʤ
 *      P  T ζ̤ϤƤʤ
 *   @ ֤ͤ LinkedList (ProcessΤɤ줫)
 *     parser p = new parser(new Lexer(Reader in));
 *     LinkedList result = (LinkedList)p.parse().value();
 * 
 * (2) ̣ϴ LMNParser::parse()
 *   @ compile.struture.* ؤѴ
 *     ȥåפMembraneȤʤ
 *   @ ȥΥȥʤɤδάˡŸ
 *     1. ɤ˽и̾XФƥ롼ƤX$p_Xִ
 *        άˡʣ - 󥯲
 *        ɤˤϥ󥯤Ͻиʤ褦ˤ
 *     2. ɤtermŸ
 *        άˡʣ -  - 1
 *        롼뤬¸ߤˤϥѥ륨顼
 *        ϻȥΰ$pȤʤ ()
 *        ex. $i < $c, 3($c)
 *     3. άˡʣ - ¤ӡ
 *        դ2ʾ$pиˡ̾$qˤ
 *        $p==$q򥬡ɤɲä
 *        ɤ˽иBodyǤνи1Ǥʤ$pФ
 *        ɤground($p)ɲä
 *        TODO ¤ϤʤƤͳ
 *   @ ƵŪ˰̣ϤԤ
 *     ϻǡ¤ > ѥǡ¤
 *        إåɡܥǥάŸ
 *        a(4) => a(X),4(X)
 *        p($p) => p(X), {'+'(X), $p}     p(X),{+X, $p}
 *         դǤʤΤ (ɤ򻲾)
 *        դξ
 *        p($p) => p(X), $q[X] ()
 *   󥯤Žդ
 *     ̲᤹󥯤Υץ
 * 
 * (3) 롼륳ѥ顼 (compile.RuleCompiler)
 *   @ ץΥ롼ʬ(RuleStructure)롼륪֥(Rule)Ѵ
 *     compile.Rule
 *
 * <LMNtalιʸ>
 * P ::= 0 | p(X1, ... ,Xm) | P, P | { P } | (T :- G | T)
 * T ::= 0 | p(X1, ... ,Xm) | T, T | { T } | (T :- G | T)
 *     | @p | $p[X1, ... ,Xm|A] | p(*X1, ... , *Xm)
 * A ::= [] | *X
 * G ::= 0 | G, G | \+($p1=(T1), ..., $pn=(Tn))
 * <ʸ>
 * @ ץΥ롼볰Ʊ󥯤2ۤƽиƤϤʤʤ
 * @ 롼ϥ롼κդޤϥɤ˽иƤϤʤʤ
 * @ 롼κդ˽и @p $p ¦˽иʤФʤʤ
 */

<LinkName>      =   [A-Z][a-zA-Z0-9]*
<AtomName>      =   [a-z0-9][a-zA-Z0-9]*

<Link>          =   <LinkName>

<Atom>          =   <AtomName>
                   | <AtomName> '(' ')'
                   | <AtomName> '(' <ProcessList> ')'

<Membrane>      =   '{' '}'
                  | '{' <ProcessList> '}'

<Rule>          =   '(' <ProcessList> ':-' <ProcessList> ')'
                  | '(' <ProcessList> ':-' <NagateList> <ProcessList> ')' // not supported now

<ProcessCotext> =   '$' <AtomName>

<RuleContext>   =   '@' <AtomName>

<Context>       =   <ProcessContext>
                  | <RuleContext>

<LinkUnify>     = <LinkName> '=' <LinkName>

<Process>       =   <Atom>
                  | <Membrane>
                  | <Rule>
                  | <Context>
                  | <Link>
                  | <LinkUnify>

<ProcessList>   =   <Process>
                  | <ProcessList> ',' <Process>

<LMNtalProg>    =   <ProcessList>
