# non-context free language a^n b^n c^n parsed using Externaltype ! ! /* (i32,i32) defaults to (0,0), used to form two-counter automaton. */ absyntype bool externtype (i32,i32) nonterminals A B C AB S terminals a b c topsym S S --> AB:@ok@ C { let (an,bn)=parser.exstate; println!("counters at end: an {}, bn {}",an,bn); ok && bn==0 } AB --> A B { let (an,bn)=parser.exstate; if an!=bn {parser.abort("different numbers of a's and b's");} an==bn } A --> A a { parser.exstate.0+=1; true } A --> B --> B b { parser.exstate.1+=1; true } B --> C --> C c { parser.exstate.1-=1; true } C -->