/// <summary> /// Reads runtime data for lexer/parser construction from a binary file. /// </summary> /// <param name="inFile">The name of the file from which the data shall be read.</param> /// <param name="lexerData">The LexerData serialized from the Stream.</param> /// <param name="parserData">The ParserData serialized from the Stream.</param> public static void ReadRuntimeDataFromFile(string inFile, out LexerData lexerData, out ParserData parserData) { Stream inStream = new FileStream(inFile, FileMode.Open, FileAccess.Read, FileShare.Read); lexerData = LexerData.FromStream(inStream); parserData = ParserData.FromStream(inStream); inStream.Close(); }
/// <summary> /// Creates a new Parser instance using data stored in a ParserData object. /// </summary> /// <param name="parserData">Data on the parser automaton and grammar necessary for parsing</param> public Parser(ParserData parserData) { this.parseTable = parserData.ParseTable; this.gotoTable = parserData.GotoTable; this.symbolNames = parserData.SymbolNames; this.productions = parserData.Productions; this.numTerminals = parserData.ParseTable.GetLength(1); Assembly actionAssembly = Assembly.Load(parserData.ActionAssemblyBytes); Type actionCollection = actionAssembly.GetType("YetAnotherParserGenerator.UserGenerated.ActionCollection"); MethodInfo retrieveActions = actionCollection.GetMethod("RetrieveActions"); this.actions = (Func <object[], int[], int[], object, object>[])retrieveActions.Invoke(null, new object [] {}); }
/// <summary> /// Creates a new Grammar instance and sets it's GrammarDefiniton, LexerData and /// GrammarCode properties to provided values. The ParserData structure will be /// initialized and it's ProductionOutlines and SymbolNames properties will be set. /// </summary> /// <param name="grammarDefinition">The definition of the grammar.</param> /// <param name="lexerData">A structure defining the lexer's runtime behaviour.</param> /// <param name="grammarCode">The collection of user code describing the actions of the parser.</param> public Grammar(GrammarDefinition grammarDefinition, LexerData lexerData, GrammarCode grammarCode) { this.grammarDefinition = grammarDefinition; this.lexerData = lexerData; this.grammarCode = grammarCode; ProductionOutline[] productionOutlines = new ProductionOutline[grammarDefinition.Productions.Length]; for (int i = 0; i < productionOutlines.Length; i++) { productionOutlines[i] = new ProductionOutline(grammarDefinition.Productions[i].LHSSymbol, grammarDefinition.Productions[i].RHSSymbols.Count); } this.parserData = new ParserData(grammarDefinition.SymbolNames, productionOutlines); }
/// <summary> /// Reads runtime data for lexer/parser construction from a binary Stream. /// </summary> /// <param name="inStream">The Stream from which the data shall be read.</param> /// <param name="lexerData">The LexerData serialized from the Stream.</param> /// <param name="parserData">The ParserData serialized from the Stream.</param> public static void ReadRuntimeDataFromStream(Stream inStream, out LexerData lexerData, out ParserData parserData) { lexerData = LexerData.FromStream(inStream); parserData = ParserData.FromStream(inStream); }