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