Пример #1
0
        public TableWith()
        {
            value = null;
            error = new LrAction(LrAction.Type.Error);
            string empty = Empty().type;

            actions = new Dictionary <Tuple <int, string>, LrAction>()
            {
                { Tuple.Create(0, "number"), new LrAction(LrAction.Type.Shift, 3) },
                { Tuple.Create(1, empty), new LrAction(LrAction.Type.Accept) },
                { Tuple.Create(2, "binop"), new LrAction(LrAction.Type.Shift, 4) },
                { Tuple.Create(2, empty), new LrAction(LrAction.Type.Reduce, 0, "{<binop>,<number>}") },
                { Tuple.Create(3, "binop"), new LrAction(LrAction.Type.Reduce, 1, "number") },
                { Tuple.Create(3, empty), new LrAction(LrAction.Type.Reduce, 1, "number") },
                { Tuple.Create(4, "number"), new LrAction(LrAction.Type.Reduce, 1, "binop") },
                { Tuple.Create(5, empty), new LrAction(LrAction.Type.Reduce, 2, "expr") },
                { Tuple.Create(6, "number"), new LrAction(LrAction.Type.Shift, 3) },
                { Tuple.Create(7, "binop"), new LrAction(LrAction.Type.Shift, 4) },
                { Tuple.Create(7, empty), new LrAction(LrAction.Type.Reduce, 0, "{<binop>,<number>}") },
                { Tuple.Create(8, empty), new LrAction(LrAction.Type.Reduce, 3, "{<binop>,<number>}") },
            };
            gotos = new Dictionary <Tuple <int, string>, LrAction>()
            {
                { Tuple.Create(0, "expr"), new LrAction(LrAction.Type.Goto, 1) },
                { Tuple.Create(0, "number"), new LrAction(LrAction.Type.Goto, 2) },
                { Tuple.Create(2, "binop"), new LrAction(LrAction.Type.Goto, 6) },
                { Tuple.Create(2, "{<binop>,<number>}"), new LrAction(LrAction.Type.Goto, 5) },
                { Tuple.Create(6, "number"), new LrAction(LrAction.Type.Goto, 7) },
                { Tuple.Create(7, "binop"), new LrAction(LrAction.Type.Goto, 6) },
                { Tuple.Create(7, "{<binop>,<number>}"), new LrAction(LrAction.Type.Goto, 8) },
            };
        }
Пример #2
0
        /// <summary>
        /// Populates the actions for each state and symbol combination.
        /// </summary>
        private void FillActions()
        {
            var acceptProduction = Grammar.Productions[0];

            foreach (var state in LrStates)
            {
                try
                {
                    var actions = new LrAction[state.Gotos.Count];

                    for (var sym = 0; sym < Grammar.Tokens.Length; sym++)
                    {
                        var possibleActions = new ActionSet();

                        var target = state.Gotos[sym];
                        if (target != null)
                        {
                            if (Terminals.Contains(sym))
                            {
                                possibleActions.Add(LrAction.Shift(target, state.GotoPrecedences[sym]));
                            }
                            if (NonTerminals.Contains(sym))
                            {
                                possibleActions.Add(LrAction.Goto(target, state.GotoPrecedences[sym]));
                            }
                        }
                        foreach (var item in state.Items)
                        {
                            if (item.LookAheadSymbol != sym)
                            {
                                continue;
                            }
                            if (item.CanIncrement == false)
                            {
                                if (item.Production == acceptProduction && item.ProductionProgress == 1)
                                {
                                    possibleActions.Add(LrAction.Accept());
                                }
                                else
                                {
                                    possibleActions.Add(LrAction.Reduce(item.Production, item.Production.Precedence));
                                }
                            }
                        }
                        SetAction(actions, sym, possibleActions);
                    }
                    state.Actions = actions;
                }
                catch (Exception ex)
                {
                    throw new Exception($"Error processing state: {state}", ex);
                }
            }
        }
Пример #3
0
 public TableWithout()
 {
     value   = null;
     error   = new LrAction(LrAction.Type.Error);
     actions = new Dictionary <Tuple <int, char>, LrAction>()
     {
         { Tuple.Create(0, '1'), new LrAction(LrAction.Type.Shift, 2) },
         { Tuple.Create(0, '2'), new LrAction(LrAction.Type.Shift, 3) },
         { Tuple.Create(0, '3'), new LrAction(LrAction.Type.Shift, 4) },
         { Tuple.Create(0, '4'), new LrAction(LrAction.Type.Shift, 5) },
         { Tuple.Create(0, '5'), new LrAction(LrAction.Type.Shift, 6) },
         { Tuple.Create(0, '6'), new LrAction(LrAction.Type.Shift, 7) },
         { Tuple.Create(0, '7'), new LrAction(LrAction.Type.Shift, 8) },
         { Tuple.Create(0, '8'), new LrAction(LrAction.Type.Shift, 9) },
         { Tuple.Create(0, '9'), new LrAction(LrAction.Type.Shift, 10) },
         { Tuple.Create(1, Empty()), new LrAction(LrAction.Type.Accept) },
         { Tuple.Create(2, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(2, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(3, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(4, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(5, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(6, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(7, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(8, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(9, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(10, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit without zero") },
         { Tuple.Create(11, '+'), new LrAction(LrAction.Type.Shift, 13) },
         { Tuple.Create(11, '-'), new LrAction(LrAction.Type.Shift, 14) },
         { Tuple.Create(11, Empty()), new LrAction(LrAction.Type.Reduce, 0, "{<binop>,<number>}") },
         { Tuple.Create(12, '+'), new LrAction(LrAction.Type.Reduce, 0, "{<digit>}") },
         { Tuple.Create(12, '-'), new LrAction(LrAction.Type.Reduce, 0, "{<digit>}") },
         { Tuple.Create(12, '0'), new LrAction(LrAction.Type.Shift, 18) },
         { Tuple.Create(12, '1'), new LrAction(LrAction.Type.Shift, 2) },
         { Tuple.Create(12, '2'), new LrAction(LrAction.Type.Shift, 3) },
         { Tuple.Create(12, '3'), new LrAction(LrAction.Type.Shift, 4) },
         { Tuple.Create(12, '4'), new LrAction(LrAction.Type.Shift, 5) },
         { Tuple.Create(12, '5'), new LrAction(LrAction.Type.Shift, 6) },
         { Tuple.Create(12, '6'), new LrAction(LrAction.Type.Shift, 7) },
         { Tuple.Create(12, '7'), new LrAction(LrAction.Type.Shift, 8) },
         { Tuple.Create(12, '8'), new LrAction(LrAction.Type.Shift, 9) },
         { Tuple.Create(12, '9'), new LrAction(LrAction.Type.Shift, 10) },
         { Tuple.Create(12, Empty()), new LrAction(LrAction.Type.Reduce, 0, "{<digit>}") },
         { Tuple.Create(13, '1'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(13, '2'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(13, '3'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(13, '4'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(13, '5'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(13, '6'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(13, '7'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(13, '8'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(13, '9'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(14, '1'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(14, '2'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(14, '3'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(14, '4'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(14, '5'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(14, '6'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(14, '7'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(14, '8'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(14, '9'), new LrAction(LrAction.Type.Reduce, 1, "binop") },
         { Tuple.Create(15, Empty()), new LrAction(LrAction.Type.Reduce, 2, "expr") },
         { Tuple.Create(16, '1'), new LrAction(LrAction.Type.Shift, 2) },
         { Tuple.Create(16, '2'), new LrAction(LrAction.Type.Shift, 3) },
         { Tuple.Create(16, '3'), new LrAction(LrAction.Type.Shift, 4) },
         { Tuple.Create(16, '4'), new LrAction(LrAction.Type.Shift, 5) },
         { Tuple.Create(16, '5'), new LrAction(LrAction.Type.Shift, 6) },
         { Tuple.Create(16, '6'), new LrAction(LrAction.Type.Shift, 7) },
         { Tuple.Create(16, '7'), new LrAction(LrAction.Type.Shift, 8) },
         { Tuple.Create(16, '8'), new LrAction(LrAction.Type.Shift, 9) },
         { Tuple.Create(16, '9'), new LrAction(LrAction.Type.Shift, 10) },
         { Tuple.Create(17, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(17, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '-'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '0'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '1'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '2'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '3'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '4'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '5'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '6'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '7'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '8'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, '9'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(18, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(19, '+'), new LrAction(LrAction.Type.Reduce, 2, "number") },
         { Tuple.Create(19, '-'), new LrAction(LrAction.Type.Reduce, 2, "number") },
         { Tuple.Create(19, Empty()), new LrAction(LrAction.Type.Reduce, 2, "number") },
         { Tuple.Create(20, '+'), new LrAction(LrAction.Type.Reduce, 0, "{<digit>}") },
         { Tuple.Create(20, '-'), new LrAction(LrAction.Type.Reduce, 0, "{<digit>}") },
         { Tuple.Create(20, '0'), new LrAction(LrAction.Type.Shift, 18) },
         { Tuple.Create(20, '1'), new LrAction(LrAction.Type.Shift, 2) },
         { Tuple.Create(20, '2'), new LrAction(LrAction.Type.Shift, 3) },
         { Tuple.Create(20, '3'), new LrAction(LrAction.Type.Shift, 4) },
         { Tuple.Create(20, '4'), new LrAction(LrAction.Type.Shift, 5) },
         { Tuple.Create(20, '5'), new LrAction(LrAction.Type.Shift, 6) },
         { Tuple.Create(20, '6'), new LrAction(LrAction.Type.Shift, 7) },
         { Tuple.Create(20, '7'), new LrAction(LrAction.Type.Shift, 8) },
         { Tuple.Create(20, '8'), new LrAction(LrAction.Type.Shift, 9) },
         { Tuple.Create(20, '9'), new LrAction(LrAction.Type.Shift, 10) },
         { Tuple.Create(20, Empty()), new LrAction(LrAction.Type.Reduce, 0, "{<digit>}") },
         { Tuple.Create(21, '+'), new LrAction(LrAction.Type.Shift, 13) },
         { Tuple.Create(21, '-'), new LrAction(LrAction.Type.Shift, 14) },
         { Tuple.Create(21, Empty()), new LrAction(LrAction.Type.Reduce, 0, "{<binop>,<number>}") },
         { Tuple.Create(22, '+'), new LrAction(LrAction.Type.Reduce, 2, "{<digit>}") },
         { Tuple.Create(22, '-'), new LrAction(LrAction.Type.Reduce, 2, "{<digit>}") },
         { Tuple.Create(22, Empty()), new LrAction(LrAction.Type.Reduce, 2, "{<digit>}") },
         { Tuple.Create(23, Empty()), new LrAction(LrAction.Type.Reduce, 3, "{<binop>,<number>}") },
     };
     gotos = new Dictionary <Tuple <int, string>, LrAction>()
     {
         { Tuple.Create(0, "digit without zero"), new LrAction(LrAction.Type.Goto, 12) },
         { Tuple.Create(0, "expr"), new LrAction(LrAction.Type.Goto, 1) },
         { Tuple.Create(0, "number"), new LrAction(LrAction.Type.Goto, 11) },
         { Tuple.Create(11, "binop"), new LrAction(LrAction.Type.Goto, 16) },
         { Tuple.Create(11, "{<binop>,<number>}"), new LrAction(LrAction.Type.Goto, 15) },
         { Tuple.Create(12, "digit"), new LrAction(LrAction.Type.Goto, 20) },
         { Tuple.Create(12, "digit without zero"), new LrAction(LrAction.Type.Goto, 17) },
         { Tuple.Create(12, "{<digit>}"), new LrAction(LrAction.Type.Goto, 19) },
         { Tuple.Create(16, "digit without zero"), new LrAction(LrAction.Type.Goto, 12) },
         { Tuple.Create(16, "number"), new LrAction(LrAction.Type.Goto, 21) },
         { Tuple.Create(20, "digit"), new LrAction(LrAction.Type.Goto, 20) },
         { Tuple.Create(20, "digit without zero"), new LrAction(LrAction.Type.Goto, 17) },
         { Tuple.Create(20, "{<digit>}"), new LrAction(LrAction.Type.Goto, 22) },
         { Tuple.Create(21, "binop"), new LrAction(LrAction.Type.Goto, 16) },
         { Tuple.Create(21, "{<binop>,<number>}"), new LrAction(LrAction.Type.Goto, 23) },
     };
 }
Пример #4
0
 public LrTableImpl()
 {
     value   = null;
     error   = new LrAction(LrAction.Type.Error);
     actions = new Dictionary <Tuple <int, char>, LrAction>()
     {
         { Tuple.Create(0, '('), new LrAction(LrAction.Type.Shift, 14) },
         { Tuple.Create(0, '0'), new LrAction(LrAction.Type.Shift, 2) },
         { Tuple.Create(0, '1'), new LrAction(LrAction.Type.Shift, 3) },
         { Tuple.Create(0, '2'), new LrAction(LrAction.Type.Shift, 4) },
         { Tuple.Create(0, '3'), new LrAction(LrAction.Type.Shift, 5) },
         { Tuple.Create(0, '4'), new LrAction(LrAction.Type.Shift, 6) },
         { Tuple.Create(0, '5'), new LrAction(LrAction.Type.Shift, 7) },
         { Tuple.Create(0, '6'), new LrAction(LrAction.Type.Shift, 8) },
         { Tuple.Create(0, '7'), new LrAction(LrAction.Type.Shift, 9) },
         { Tuple.Create(0, '8'), new LrAction(LrAction.Type.Shift, 10) },
         { Tuple.Create(0, '9'), new LrAction(LrAction.Type.Shift, 11) },
         { Tuple.Create(1, Empty()), new LrAction(LrAction.Type.Accept) },
         { Tuple.Create(2, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(2, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(2, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(2, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(3, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(3, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(3, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(3, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(4, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(4, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(4, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(4, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(5, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(5, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(5, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(5, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(6, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(6, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(6, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(6, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(7, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(7, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(7, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(7, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(8, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(8, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(8, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(8, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(9, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(9, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(9, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(9, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(10, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(10, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(10, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(10, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(11, ')'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(11, '*'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(11, '+'), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(11, Empty()), new LrAction(LrAction.Type.Reduce, 1, "digit") },
         { Tuple.Create(12, ')'), new LrAction(LrAction.Type.Reduce, 1, "expression") },
         { Tuple.Create(12, '+'), new LrAction(LrAction.Type.Shift, 17) },
         { Tuple.Create(12, Empty()), new LrAction(LrAction.Type.Reduce, 1, "expression") },
         { Tuple.Create(13, ')'), new LrAction(LrAction.Type.Reduce, 1, "factor") },
         { Tuple.Create(13, '*'), new LrAction(LrAction.Type.Reduce, 1, "factor") },
         { Tuple.Create(13, '+'), new LrAction(LrAction.Type.Reduce, 1, "factor") },
         { Tuple.Create(13, Empty()), new LrAction(LrAction.Type.Reduce, 1, "factor") },
         { Tuple.Create(14, '('), new LrAction(LrAction.Type.Shift, 14) },
         { Tuple.Create(14, '0'), new LrAction(LrAction.Type.Shift, 2) },
         { Tuple.Create(14, '1'), new LrAction(LrAction.Type.Shift, 3) },
         { Tuple.Create(14, '2'), new LrAction(LrAction.Type.Shift, 4) },
         { Tuple.Create(14, '3'), new LrAction(LrAction.Type.Shift, 5) },
         { Tuple.Create(14, '4'), new LrAction(LrAction.Type.Shift, 6) },
         { Tuple.Create(14, '5'), new LrAction(LrAction.Type.Shift, 7) },
         { Tuple.Create(14, '6'), new LrAction(LrAction.Type.Shift, 8) },
         { Tuple.Create(14, '7'), new LrAction(LrAction.Type.Shift, 9) },
         { Tuple.Create(14, '8'), new LrAction(LrAction.Type.Shift, 10) },
         { Tuple.Create(14, '9'), new LrAction(LrAction.Type.Shift, 11) },
         { Tuple.Create(15, Empty()), new LrAction(LrAction.Type.Reduce, 1, "statement") },
         { Tuple.Create(16, ')'), new LrAction(LrAction.Type.Reduce, 1, "term") },
         { Tuple.Create(16, '*'), new LrAction(LrAction.Type.Shift, 19) },
         { Tuple.Create(16, '+'), new LrAction(LrAction.Type.Reduce, 1, "term") },
         { Tuple.Create(16, Empty()), new LrAction(LrAction.Type.Reduce, 1, "term") },
         { Tuple.Create(17, '('), new LrAction(LrAction.Type.Shift, 14) },
         { Tuple.Create(17, '0'), new LrAction(LrAction.Type.Shift, 2) },
         { Tuple.Create(17, '1'), new LrAction(LrAction.Type.Shift, 3) },
         { Tuple.Create(17, '2'), new LrAction(LrAction.Type.Shift, 4) },
         { Tuple.Create(17, '3'), new LrAction(LrAction.Type.Shift, 5) },
         { Tuple.Create(17, '4'), new LrAction(LrAction.Type.Shift, 6) },
         { Tuple.Create(17, '5'), new LrAction(LrAction.Type.Shift, 7) },
         { Tuple.Create(17, '6'), new LrAction(LrAction.Type.Shift, 8) },
         { Tuple.Create(17, '7'), new LrAction(LrAction.Type.Shift, 9) },
         { Tuple.Create(17, '8'), new LrAction(LrAction.Type.Shift, 10) },
         { Tuple.Create(17, '9'), new LrAction(LrAction.Type.Shift, 11) },
         { Tuple.Create(18, ')'), new LrAction(LrAction.Type.Shift, 21) },
         { Tuple.Create(19, '('), new LrAction(LrAction.Type.Shift, 14) },
         { Tuple.Create(19, '0'), new LrAction(LrAction.Type.Shift, 2) },
         { Tuple.Create(19, '1'), new LrAction(LrAction.Type.Shift, 3) },
         { Tuple.Create(19, '2'), new LrAction(LrAction.Type.Shift, 4) },
         { Tuple.Create(19, '3'), new LrAction(LrAction.Type.Shift, 5) },
         { Tuple.Create(19, '4'), new LrAction(LrAction.Type.Shift, 6) },
         { Tuple.Create(19, '5'), new LrAction(LrAction.Type.Shift, 7) },
         { Tuple.Create(19, '6'), new LrAction(LrAction.Type.Shift, 8) },
         { Tuple.Create(19, '7'), new LrAction(LrAction.Type.Shift, 9) },
         { Tuple.Create(19, '8'), new LrAction(LrAction.Type.Shift, 10) },
         { Tuple.Create(19, '9'), new LrAction(LrAction.Type.Shift, 11) },
         { Tuple.Create(20, ')'), new LrAction(LrAction.Type.Reduce, 3, "expression") },
         { Tuple.Create(20, Empty()), new LrAction(LrAction.Type.Reduce, 3, "expression") },
         { Tuple.Create(21, ')'), new LrAction(LrAction.Type.Reduce, 3, "factor") },
         { Tuple.Create(21, '*'), new LrAction(LrAction.Type.Reduce, 3, "factor") },
         { Tuple.Create(21, '+'), new LrAction(LrAction.Type.Reduce, 3, "factor") },
         { Tuple.Create(21, Empty()), new LrAction(LrAction.Type.Reduce, 3, "factor") },
         { Tuple.Create(22, ')'), new LrAction(LrAction.Type.Reduce, 3, "term") },
         { Tuple.Create(22, '+'), new LrAction(LrAction.Type.Reduce, 3, "term") },
         { Tuple.Create(22, Empty()), new LrAction(LrAction.Type.Reduce, 3, "term") },
     };
     gotos = new Dictionary <Tuple <int, string>, LrAction>()
     {
         { Tuple.Create(0, "digit"), new LrAction(LrAction.Type.Goto, 13) },
         { Tuple.Create(0, "expression"), new LrAction(LrAction.Type.Goto, 15) },
         { Tuple.Create(0, "factor"), new LrAction(LrAction.Type.Goto, 16) },
         { Tuple.Create(0, "statement"), new LrAction(LrAction.Type.Goto, 1) },
         { Tuple.Create(0, "term"), new LrAction(LrAction.Type.Goto, 12) },
         { Tuple.Create(14, "digit"), new LrAction(LrAction.Type.Goto, 13) },
         { Tuple.Create(14, "expression"), new LrAction(LrAction.Type.Goto, 18) },
         { Tuple.Create(14, "factor"), new LrAction(LrAction.Type.Goto, 16) },
         { Tuple.Create(14, "term"), new LrAction(LrAction.Type.Goto, 12) },
         { Tuple.Create(17, "digit"), new LrAction(LrAction.Type.Goto, 13) },
         { Tuple.Create(17, "expression"), new LrAction(LrAction.Type.Goto, 20) },
         { Tuple.Create(17, "factor"), new LrAction(LrAction.Type.Goto, 16) },
         { Tuple.Create(17, "term"), new LrAction(LrAction.Type.Goto, 12) },
         { Tuple.Create(19, "digit"), new LrAction(LrAction.Type.Goto, 13) },
         { Tuple.Create(19, "factor"), new LrAction(LrAction.Type.Goto, 16) },
         { Tuple.Create(19, "term"), new LrAction(LrAction.Type.Goto, 22) },
     };
 }