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); } }