* $Id$ * * Practical Earley Parsing * Aycock and Horspool * This version takes any context free grammars but with nullable non-terminals * (rules of a kind [E -> ] are not allowed). Check { (e.grammar) (TYPE s.name) e.string, : e.sets (e.last) = ; } FindSuccessRule { s.name ((TYPE s.name e.info) e.prod (DOT) ()) e.rules = (e.info) (e.prod); s.name t.rule e.rules = ; s.name = "Parsing failed"; } Earley { (e.grammar) t.type e.string = ; } * In: (e.grammar) (e.string) e.sets (e.rules) (e.current) (e.next) Parse { (e.grammar) () (e.step) e.sets () (e.current) () = e.sets (e.current); (e.grammar) (s.char e.string) (e.step) e.sets () (e.current) (e.next) = ; (e.grammar) (e.string) (e.step) e.sets (t.rule e.rules) (e.current) (e.next), t.rule : { * Scanner ((TYPE s.name e.info) e.1 (DOT s.char e.2) (e.n)), e.string : { s.char e.rest_chars = ; e.string = ; }; * Predictor (t.type e.1 (DOT (TYPE s.name) e.2) (e.n)), e.current t.rule : e.current2 = ) (e.current2) (e.next)>; * Completer ((TYPE s.name e.info) e.1 (DOT) (e.n)), e.current t.rule : e.current2 = ) (e.current2) (e.next)>; }; } AddPredictions { ((PROD (TYPE s.name) e.prods) e.grammar) (e.rules) (e.current) s.name (e.step) = ) (e.current) s.name (e.step)>; (t.prod e.grammar) (e.rules) (e.current) s.name (e.step) = ; () (e.rules) (e.current) s.name (e.step) = e.rules; } AddPredictions2 { ((e.prod) e.rest_prods) (e.rules) (e.current) s.name (e.step), ((TYPE s.name) (DOT e.prod) (e.step)) : t.prediction, : { True = ; False, : { True = ; False = ; }; }; () (e.rules) (e.current) s.name (e.step) = e.rules; } AddCompletions { (I e.n) (t.set e.rest_sets) (e.rules) (e.current) s.name e.info = ; () ((e.set) e.rest_sets) (e.rules) (e.current) s.name e.info = ; () () (e.rules) (e.current) s.name e.info = e.rules; } AddCompletions2 { (((TYPE s.name2 e.info2) e.1 (DOT (TYPE s.name) e.2) (e.step)) e.set) (e.rules) (e.current) s.name e.info, ((TYPE s.name2 e.info2 (e.info)) e.1 (TYPE s.name) (DOT e.2) (e.step)) : t.completion, : { True = ; False, : { True = ; False = ; }; }; (t.rule e.set) (e.rules) (e.current) s.name e.info = ; () (e.rules) (e.current) s.name e.info = e.rules; } IsIn { t.1 e.set t.1 = True; t.1 e.set t.2 = ; t.2 = False; } $ENTRY Go { = E '+' E | 'n' '\n' >; } * Main = * , * , * , * , * , * , * , * , * , * ;