public ParserAutomaton Deserialize(Stream inputStream)
        {
            var reader = new BinaryReader(inputStream);
            var context = new DeserializerContext(Data.Grammar, reader);

            int statesCount = reader.ReadUInt16();
            int defaultInitialStateId = reader.ReadUInt16();
            int initialStatesCount = reader.ReadByte();

            var initialStateEntries = new Dictionary<int, int>();
            for (int i = 0; i < initialStatesCount; i++)
                initialStateEntries.Add(reader.ReadUInt16(), reader.ReadUInt16());

            for (int i = 0; i < statesCount; i++)
            {
                context.Automaton.States.Add(new ParserState()
                {
                    Id = i
                });
            }

            context.Automaton.DefaultInitialState = context.Automaton.States[defaultInitialStateId];
            foreach (var entry in initialStateEntries)
                context.Automaton.InitialStates.Add((GrammarDefinition)Data.AllElements[entry.Key],
                    context.Automaton.States[entry.Value]);

            for (int i = 0; i < statesCount; i++)
            {
                ReadAndInitializeState(context, i);
            }

            return context.Automaton;
        }
 private void ReadAndInitializeState(DeserializerContext context, int id)
 {
     var state = context.Automaton.States[id];
     var reader = context.Reader;
     bool hasDefaultAction = reader.ReadBoolean();
     if (hasDefaultAction)
     {
         state.DefaultAction = ReadAction(context);
     }
     else
     {
         int actionsCount = reader.ReadUInt16();
         for (int i = 0; i < actionsCount; i++)
         {
             int elementId = reader.ReadInt16();
             var element = elementId == -1 ? Grammar.Eof : Data.AllElements[elementId];
             state.Actions.Add(element, ReadAction(context));
         }
     }
 }
 private ParserAction ReadAction(DeserializerContext context)
 {
     var reader = context.Reader;
     var actionType = reader.ReadByte();
     switch (actionType)
     {
         case ShiftParserActionId:
             return new ShiftParserAction(context.Automaton.States[reader.ReadUInt16()]);
         case ReduceParserActionId:
             return new ReduceParserAction(Data.AllReductions[reader.ReadUInt16()]);
         case AcceptarserActionId:
             return new AcceptParserAction();
         default:
             throw new NotSupportedException("Unrecognized or unsupported action type " + actionType);
     }
 }