/// <summary> /// Parses a text into a list of parsedItems /// </summary> public Parser(Lexer lexer, string filePathBeingParsed, ParsedScopeItem defaultScope, bool matchKnownWords = false) { // process inputs _filePathBeingParsed = filePathBeingParsed; _matchKnownWords = matchKnownWords && _knownStaticItems != null; // init context _context = new ParseContext { BlockStack = new Stack<BlockInfo>(), PreProcIfStack = new Stack<ParsedPreProcBlock>(), UibBlockStack = new Stack<ParsedPreProcBlock>() }; // create root item if (defaultScope == null) { _rootScope = new ParsedFile("Root", new TokenEos(null, 0, 0, 0, 0)); AddParsedItem(_rootScope); } else _rootScope = defaultScope; _context.Scope = _rootScope; // parse _lexer = lexer; while (MoveNext()) { Analyze(); } // add missing values to the line dictionnary var current = new LineInfo(GetCurrentDepth(), _rootScope); for (int i = _lexer.MaxLine - 1; i >= 0; i--) { if (_lineInfo.ContainsKey(i)) current = _lineInfo[i]; else _lineInfo.Add(i, current); } // check that we match an &ENDIF for each &IF if (_context.PreProcIfStack.Count > 0) _parserErrors.Add(new ParserError(ParserErrorType.MismatchNumberOfIfEndIf, PeekAt(0), _context.PreProcIfStack.Count)); // dispose _context.BlockStack.Clear(); _context.PreProcIfStack.Clear(); _context.UibBlockStack.Clear(); _context = null; _lexer = null; }
public static void RunParserTests(string content) { // create unique temporary folder var testDir = Path.Combine(Npp.GetConfigDir(), "Tests", DateTime.Now.ToString("yy.MM.dd_HH-mm-ss-fff")); var perfFile = Path.Combine(testDir, "perfs.txt"); if (!Utils.CreateDirectory(testDir)) { return; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // LEXER //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% var outLocation = Path.Combine(testDir, "Lexer_out.txt"); //------------ var watch = Stopwatch.StartNew(); //------------ Lexer lexer = new Lexer(content); //-------------- watch.Stop(); //-------------- OutputLexerVisitor lexerVisitor = new OutputLexerVisitor(); lexer.Accept(lexerVisitor); Utils.FileWriteAllText(outLocation, lexerVisitor.Output.ToString()); File.AppendAllText(perfFile, @"LEXER DONE in " + watch.ElapsedMilliseconds + @" ms > nb items = " + lexerVisitor.NbItems + "\r\n"); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // PARSER //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% outLocation = Path.Combine(testDir, "Parser_out.txt"); //------------ watch = Stopwatch.StartNew(); //------------ Parser parser = new Parser(lexer, "", null, true); //-------------- watch.Stop(); //------------ OutputParserVisitor parserVisitor = new OutputParserVisitor(); parser.Accept(parserVisitor); Utils.FileWriteAllText(outLocation, parserVisitor.Output.ToString()); File.AppendAllText(perfFile, @"PARSER DONE in " + watch.ElapsedMilliseconds + @" ms > nb items = " + parser.ParsedItemsList.Count + "\r\n"); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // LINE INFO //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% outLocation = Path.Combine(testDir, "LineInfo_out.txt"); StringBuilder lineInfo = new StringBuilder(); var i = 0; var dic = parser.LineInfo; while (dic.ContainsKey(i)) { lineInfo.AppendLine(i + 1 + " > " + dic[i].BlockDepth + " , " + dic[i].Scope + " , " + dic[i].Scope.ScopeType + " , " + dic[i].Scope.Name); i++; } Utils.FileWriteAllText(outLocation, lineInfo.ToString()); File.AppendAllText(perfFile, @"nb items in Line info = " + parser.LineInfo.Count + "\r\n"); UserCommunication.Notify("Done :<br>" + testDir.ToHtmlLink()); }