Пример #1
0
		public void WriteNextRecord(CgtRecordType recordType, int entries) {
			if (entryCount != 0) {
				throw new InvalidOperationException("There are entries missing before starting a new record");
			}
			entryCount = entries+1;
			writer.Write((byte)'M');
			writer.Write(checked((UInt16)entryCount));
			WriteByteEntry((byte)recordType);
		}
Пример #2
0
        public static void Pack(BinaryReader input, BinaryWriter output)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            if (output == null)
            {
                throw new ArgumentNullException("output");
            }
            CgtReader reader      = new CgtReader(input);
            CgtWriter writer      = new CgtWriter(output);
            string    header      = reader.ReadHeaderString();
            Match     headerMatch = FileHeader.Match(header);

            if (headerMatch.Groups["version"].Value != "1.0")
            {
                throw new FileLoadException("The File Header is invalid or of an unsupported version for packing, only uncompressed V1.0 Compiled Grammar Files are supported");
            }
            writer.WriteHeaderString(header);
            while (reader.HasMoreData())
            {
                CgtRecordType recordType = reader.ReadNextRecord();
                switch (recordType)
                {
                case CgtRecordType.Charsets:
                    int        index   = reader.ReadIntegerEntry();
                    string     chars   = reader.ReadStringEntry();
                    DfaCharset charset = new DfaCharset(null, index, chars);
                    if (charset.SequenceLength >= 4)
                    {
                        writer.WriteNextRecord(CgtRecordType.PackedCharsets, 4);
                        writer.WriteIntegerEntry(index);
                        writer.WriteIntegerEntry(charset.SequenceStart);
                        writer.WriteIntegerEntry(charset.SequenceEnd);
                        writer.WriteStringEntry(new string(charset.CharactersExcludingSequence));
                    }
                    else
                    {
                        writer.WriteNextRecord(CgtRecordType.Charsets, 2);
                        writer.WriteIntegerEntry(index);
                        writer.WriteStringEntry(chars);
                    }
                    break;

                default:
                    writer.WriteNextRecord(recordType, reader.EntryCount);
                    while (reader.EntryCount > 0)
                    {
                        reader.CopyEntry(writer);
                    }
                    break;
                }
            }
            output.Flush();
        }
Пример #3
0
 public void WriteNextRecord(CgtRecordType recordType, int entries)
 {
     if (entryCount != 0)
     {
         throw new InvalidOperationException("There are entries missing before starting a new record");
     }
     entryCount = entries + 1;
     writer.Write((byte)'M');
     writer.Write(checked ((UInt16)entryCount));
     WriteByteEntry((byte)recordType);
 }
Пример #4
0
        /// <summary>
        /// Loads grammar from the binary reader.
        /// </summary>
        private void Load(LoadContext context)
        {
            string headerString = context.ReadHeaderString();
//			Trace.WriteLine(headerString, "Reading header");
            Match headerMatch = FileHeader.Match(headerString);

            if (!headerMatch.Success)
            {
                throw new FileLoadException("The File Header is invalid or unsupported: " + headerString);
            }
            switch (headerMatch.Groups["version"].Value)
            {
            case "1.0":
                fileVersion = CgtVersion.V1_0;
                break;

            case "5.0":
                fileVersion = CgtVersion.V5_0;
                break;

            default:
                throw new FileLoadException(string.Format("The file format version {0} is not unsupported", headerMatch.Groups["version"].Value));
            }
            while (context.HasMoreData())
            {
                CgtRecordType recordType = context.ReadNextRecord();
///				Trace.WriteLine(recordType, "Reading record");
                switch (recordType)
                {
                case CgtRecordType.Parameters:
                    ReadHeader(context);
                    break;

                case CgtRecordType.Property:
                    ReadProperty(context);
                    break;

                case CgtRecordType.Groups:
                    ReadGroup(context);
                    break;

                case CgtRecordType.TableCountsEnhanced:
                    ReadTableCounts(context, true);
                    break;

                case CgtRecordType.TableCounts:
                    ReadTableCounts(context, false);
                    break;

                case CgtRecordType.Initial:
                    ReadInitialStates(context);
                    break;

                case CgtRecordType.Symbols:
                    ReadSymbol(context);
                    break;

                case CgtRecordType.Charsets:
                    ReadCharset(context);
                    break;

                case CgtRecordType.PackedCharsets:
                    if (fileVersion == CgtVersion.V1_0)
                    {
                        ReadPackedCharset(context);
                    }
                    else
                    {
                        ReadRangeCharset(context);
                    }
                    break;

                case CgtRecordType.Rules:
                    ReadRule(context);
                    break;

                case CgtRecordType.DfaStates:
                    ReadDfaState(context);
                    break;

                case CgtRecordType.LRStates:
                    ReadLRState(context);
                    break;

                default:
                    throw new FileLoadException("Invalid record type");
                }
            }
            dfaInitialState  = dfaStateTable[context.DfaInitialStateIndex];
            startSymbol      = symbolTable[context.StartSymbolIndex];
            lalrInitialState = lalrStateTable[context.LrInitialState];
            FixupGroups(context);
        }