public NonTerminalProduction(IParserConfigurator <T> configurator, INonTerminal <T> resultSymbol, object[] symbols) { this.resultSymbol = resultSymbol; this.symbols = new ISymbol <T> [symbols.Length]; // Move production symbols to the list int i = 0; foreach (object part in symbols) { if (part is string regex) { if (configurator.LexerSettings.EscapeLiterals) { regex = Regex.Escape(regex); } this.symbols[i] = configurator.CreateTerminal(regex, null, true); this.symbols[i].DebugName = part as string; // Set debug name to unescaped string, so it's easy on the eyes. } else { this.symbols[i] = (ISymbol <T>)symbols[i]; } ++i; } }
public static INonTerminal <T> CreateNonTerminal <T>(this IParserConfigurator <T> conf, string name) { INonTerminal <T> nter = conf.CreateNonTerminal(); nter.DebugName = name; return(nter); }
public static ITerminal <T> CreateTerminal <T>(this IParserConfigurator <T> conf, string regex, T val, bool tp = false) => conf.CreateTerminal(regex, _ => val, tp);
public NonTerminal(IParserConfigurator <T> configurator) { this.configurator = configurator; this.productions = new List <NonTerminalProduction>(); }
private static TerminalWrapper <string> CreateTerminal( IParserConfigurator <object> configurator, string regex) { return(new TerminalWrapper <string>(configurator.CreateTerminal(regex))); }
private static TerminalWrapper <T> CreateTerminalParse <T>( IParserConfigurator <object> configurator, string regex, Func <string, T> onParse) { return(new TerminalWrapper <T>(configurator.CreateTerminal(regex, x => onParse(x)))); }
private static NonTerminalWrapper <T> CreateNonTerminal <T>(IParserConfigurator <object> configurator) { return(new NonTerminalWrapper <T>(configurator.CreateNonTerminal())); }