Example #1
0
 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);
    }
Example #3
0
    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;
    }
Example #4
0
 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);
    }
Example #8
0
 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);
 }
Example #9
0
 public NonterminalToken(INonterminal nonterminal, IReadOnlyList <IToken> children)
     : base(nonterminal)
 {
     Children = children.ToArray();
 }
Example #10
0
 public Production(INonterminal lhs, Func <object[], TValue> reduce, params ISymbol[] symbols)
 {
     Symbols      = symbols.ToList();
     _reduce      = reduce;
     LeftHandSide = lhs;
 }
Example #11
0
 public Parser(INonterminal <TInput, TOutput> startSymbol, string?name = null)
 {
     _engine      = new Engine <TInput, TOutput>(startSymbol);
     Name         = name ?? startSymbol.Name;
     _startSymbol = startSymbol;
 }