public Production(INonterminal nonterminal, string visual, bool[] drops, bool[] promotes) { Nonterminal = nonterminal; Visual = visual; Drops = drops; Promotes = promotes; }
/// <summary> /// Add a new production rule as a sequence of the given symbols. /// </summary> /// <typeparam name="TInput"></typeparam> /// <typeparam name="TOutput"></typeparam> /// <typeparam name="T1"></typeparam> /// <typeparam name="T2"></typeparam> /// <param name="lhs"></param> /// <param name="s1"></param> /// <param name="s2"></param> /// <param name="func"></param> /// <returns></returns> public static INonterminal <TInput, TOutput> Rule <TInput, TOutput, T1, T2>(this INonterminal <TInput, TOutput> lhs, ISymbol <T1> s1, ISymbol <T2> s2, Func <T1, T2, TOutput> func) { var p = new Production <TOutput>(lhs, args => func((T1)args[0], (T2)args[1]), s1, s2); lhs.Add(p); return(lhs); }
public Engine(INonterminal<TInput, TOutput> startSymbol) { Assert.ArgumentNotNull(startSymbol, nameof(startSymbol)); if (startSymbol.Productions.Count == 0) throw new GrammarException("The start symbol contains no valid productions"); if (startSymbol.Productions.All(p => p.Symbols.Count == 0)) throw new GrammarException("The start symbol productions contain no symbols"); _startSymbol = startSymbol; }
protected internal BlockFormula( string name, INode referrers, ITerminal<ITypeDeclaration> type, IBlockFormula parentBlock, IBlockFormula childBlocks, INonterminal variables, INonterminal formulas, INonterminal result) : this(name, referrers, IBlockFormulaMixin.ToReadOnlyProperties(type, parentBlock, childBlocks, variables, formulas, result)) { }
/// <summary> /// Add a new production rule as a sequence of the given symbols. /// </summary> /// <typeparam name="TInput"></typeparam> /// <typeparam name="TOutput"></typeparam> /// <param name="lhs"></param> /// <param name="s1"></param> /// <returns></returns> public static INonterminal <TInput, TOutput> Rule <TInput, TOutput>(this INonterminal <TInput, TOutput> lhs, ISymbol <TOutput> s1) => lhs.Rule(s1, v => v);
/// <summary> /// Add a new production rule as a sequence of the given symbols. /// </summary> /// <typeparam name="TInput"></typeparam> /// <typeparam name="TOutput"></typeparam> /// <typeparam name="T1"></typeparam> /// <typeparam name="T2"></typeparam> /// <typeparam name="T3"></typeparam> /// <typeparam name="T4"></typeparam> /// <typeparam name="T5"></typeparam> /// <typeparam name="T6"></typeparam> /// <typeparam name="T7"></typeparam> /// <typeparam name="T8"></typeparam> /// <typeparam name="T9"></typeparam> /// <param name="lhs"></param> /// <param name="s1"></param> /// <param name="s2"></param> /// <param name="s3"></param> /// <param name="s4"></param> /// <param name="s5"></param> /// <param name="s6"></param> /// <param name="s7"></param> /// <param name="s8"></param> /// <param name="s9"></param> /// <param name="func"></param> /// <returns></returns> public static INonterminal <TInput, TOutput> Rule <TInput, TOutput, T1, T2, T3, T4, T5, T6, T7, T8, T9>(this INonterminal <TInput, TOutput> lhs, ISymbol <T1> s1, ISymbol <T2> s2, ISymbol <T3> s3, ISymbol <T4> s4, ISymbol <T5> s5, ISymbol <T6> s6, ISymbol <T7> s7, ISymbol <T8> s8, ISymbol <T9> s9, Func <T1, T2, T3, T4, T5, T6, T7, T8, T9, TOutput> func) { var p = new Production <TOutput>(lhs, args => func((T1)args[0], (T2)args[1], (T3)args[2], (T4)args[3], (T5)args[4], (T6)args[5], (T7)args[6], (T8)args[7], (T9)args[8]), s1, s2, s3, s4, s5, s6, s7, s8, s9); lhs.Add(p); return(lhs); }
/// <summary> /// Add a new production rule as a sequence of the given symbols. /// </summary> /// <typeparam name="TInput"></typeparam> /// <typeparam name="TOutput"></typeparam> /// <typeparam name="T1"></typeparam> /// <typeparam name="T2"></typeparam> /// <typeparam name="T3"></typeparam> /// <typeparam name="T4"></typeparam> /// <typeparam name="T5"></typeparam> /// <typeparam name="T6"></typeparam> /// <param name="lhs"></param> /// <param name="s1"></param> /// <param name="s2"></param> /// <param name="s3"></param> /// <param name="s4"></param> /// <param name="s5"></param> /// <param name="s6"></param> /// <param name="func"></param> /// <returns></returns> public static INonterminal <TInput, TOutput> Rule <TInput, TOutput, T1, T2, T3, T4, T5, T6>(this INonterminal <TInput, TOutput> lhs, ISymbol <T1> s1, ISymbol <T2> s2, ISymbol <T3> s3, ISymbol <T4> s4, ISymbol <T5> s5, ISymbol <T6> s6, Func <T1, T2, T3, T4, T5, T6, TOutput> func) { var p = new Production <TOutput>(lhs, args => func((T1)args[0], (T2)args[1], (T3)args[2], (T4)args[3], (T5)args[4], (T6)args[5]), s1, s2, s3, s4, s5, s6); lhs.Add(p); return(lhs); }
public static ReadOnlyCollection<INode> ToReadOnlyProperties( ITerminal<ITypeDeclaration> type, IBlockFormula parentBlock, IBlockFormula childBlocks, INonterminal variables, INonterminal formulas, INonterminal result) { var list = (IList<INode>)new List<INode>(); INonterminalMixin.InsertToProperties(new NodeType(NonterminalType.Block), type, ref list); list.Insert(ParentBlockIndex, parentBlock); list.Insert(ChildBlocksIndex, childBlocks); list.Insert(VariablesIndex, variables); list.Insert(FormulasIndex, formulas); list.Insert(ResultIndex, result); return new ReadOnlyCollection<INode>(list); }
public NonterminalToken(INonterminal nonterminal, IReadOnlyList <IToken> children) : base(nonterminal) { Children = children.ToArray(); }
public Production(INonterminal lhs, Func <object[], TValue> reduce, params ISymbol[] symbols) { Symbols = symbols.ToList(); _reduce = reduce; LeftHandSide = lhs; }
public Parser(INonterminal <TInput, TOutput> startSymbol, string?name = null) { _engine = new Engine <TInput, TOutput>(startSymbol); Name = name ?? startSymbol.Name; _startSymbol = startSymbol; }