AsLexemes <Terminal_T, Nonterminal_T>
     (this GrammarBase <Terminal_T, Nonterminal_T> .ParseTreeNode node)
     where Terminal_T : struct, IComparable, IConvertible
     where Nonterminal_T : struct, IComparable, IConvertible
 {
     return(node.Flatten().AsLexemes());
 }
 FirstSymbols <Terminal_T, Nonterminal_T>
     (this GrammarBase <Terminal_T, Nonterminal_T> .Production production)
     where Terminal_T : struct, IComparable, IConvertible
     where Nonterminal_T : struct, IComparable, IConvertible
 {
     return(production.Rules.Where(r => r.Length > 0).Select(r => r.Symbols[0]).Distinct());
 }
 protected Parser(GrammarBase <Terminal_T, Nonterminal_T> g, LexerBase l)
 {
     Grammar = g;
     Lexer   = l; // Lazy lex
 }
 SearchAll <Terminal_T, Nonterminal_T>
     (this IEnumerable <GrammarBase <Terminal_T, Nonterminal_T> .ParseTreeNode> nodes, GrammarBase <Terminal_T, Nonterminal_T> .Symbol sym, int start = 0)
     where Terminal_T : struct, IComparable, IConvertible
     where Nonterminal_T : struct, IComparable, IConvertible
 {
     return(nodes.Skip(start).SelectMany(n => n.SearchAll(sym)));
 }