예제 #1
0
 private void ReadFile(Stream stream)
 {
     try
     {
         Reset();
         this.stream = stream;
         ReaderBin reader = new ReaderBin(stream);
         string    header = "";
         try
         {
             header = reader.ReadUnicodeString();
             if (!header.StartsWith("GOLD"))
             {
                 throw new CGTStructureException("El encabezado del archivo es inválido");
             }
         }
         catch (EndOfStreamException e)
         {
             throw new CGTStructureException("El encabezado del archivo es inválido", e);
         }
         RecordCollection records = new RecordCollection();
         while (!(stream.Position == stream.Length))
         {
             records.Add(ReadRecord(reader));
         }
         structure    = new CGTStructure(header, records);
         content      = new CGTContent(structure);
         dfaStates    = CreateDFAStates(content);
         parserStates = CreateParserStates(content);
     }
     finally
     {
         stream.Close();
     }
 }
예제 #2
0
        private DFA.StateCollection CreateDFAStates(CGTContent content)
        {
            symbols = CreateSymbols(content);
            DFA.StateCollection states = new DFA.StateCollection();
            foreach (DFAStateRecord stateRecord in content.DFAStateTable)
            {
                DFA.State state;
                if (stateRecord.AcceptState)
                {
                    Symbol symbol = symbols[stateRecord.AcceptIndex];

                    state = new DFA.EndState(stateRecord.Index, (SymbolTerminal)symbol);
                }
                else
                {
                    state = new DFA.State(stateRecord.Index);
                }
                states.Add(state);
            }

            foreach (DFAStateRecord stateRecord in content.DFAStateTable)
            {
                foreach (EdgeSubRecord edgeRecord in stateRecord.EdgeSubRecords)
                {
                    DFA.State          source     = states[stateRecord.Index];
                    DFA.State          target     = states[edgeRecord.TargetIndex];
                    CharacterSetRecord charsetRec = content.CharacterSetTable[edgeRecord.CharacterSetIndex];
                    DFA.Transition     transition = new DFA.Transition(target, charsetRec.Characters);
                    source.Transitions.Add(transition);
                }
            }
            return(states);
        }
예제 #3
0
 private void Reset()
 {
     stream       = null;
     structure    = null;
     content      = null;
     dfaStates    = null;
     parserStates = null;
     symbols      = null;
     rules        = null;
 }