/// <summary> /// /// </summary> /// <param name="parser"></param> /// <returns></returns> private EmbeddedCode ExtractEmbeddedCode(CpsParser parser) { if (parser.startPos == -1) { return(null); } EmbeddedCode ec = new EmbeddedCode(); ec.Language = parser.sourceLang; ec.FileName = parser.sourceFile; ec.Code = ExtractEmbeddedSource(FileName, parser.startPos); return(ec); }
/// <summary> /// Parses the file. /// </summary> public void Parse() { try { using (FileStream inputStream = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { // Create a new ANTLR Lexer for the filestream CpsLexer lexer = new CpsPosLexer(inputStream); // Create a new ANTLR Parser for the ANTLR Lexer CpsParser parser = new CpsParser(lexer); // Parse the file parser.concern(); // Embedded code? _embeddedCode = ExtractEmbeddedCode(parser); if (parser.getAST() != null) { AST root = parser.getAST(); if (root != null) { Walk(root, false, null); } } } } catch (IOException ex) { throw new CpsParserException(String.Format(CultureInfo.CurrentCulture, Resources.ConcernNotFound, FileName), FileName, ex); } catch (antlr.ANTLRException ex) { throw new CpsParserException(String.Format(CultureInfo.CurrentCulture, Resources.UnableToParseConcern, FileName, ex.Message), FileName, ex); } }
/// <summary> /// Writes the specified embedded code to a file. /// </summary> /// <param name="ec">The embedded code.</param> private string StoreEmbeddedCode(string concern, EmbeddedCode ec) { if (ec == null) { return(null); } if (_codeLanguage == null) { Log.LogWarningFromResources("EmbeddedCodeNotSupported", concern); return(null); } if (!_codeLanguage.Equals(ec.Language)) { Log.LogWarningFromResources("EmbeddedCodeLanguageWrong", concern, ec.Language, _codeLanguage); return(null); } string embeddedDir = Path.Combine(_baseDir, EmbeddedFolderName); if (!Directory.Exists(embeddedDir)) { Directory.CreateDirectory(embeddedDir); } string filename = Path.Combine(embeddedDir, ec.FileName); using (StreamWriter sw = File.CreateText(filename)) { Log.LogMessageFromResources("WritingEmbeddedCode", filename); sw.Write(ec.Code); //_extraSources.Add(new TaskItem(filename)); return(filename); } }
/// <summary> /// Walks the specified tree. /// </summary> /// <param name="tree">The tree.</param> /// <returns>full type name parsed</returns> private void Walk(ITree root) { Stack <ITree> nodestack = new Stack <ITree>(); if (root.Type == CpsLexer.CONCERN) { for (int i = 0; i < root.ChildCount; i++) { nodestack.Push((ITree)root.GetChild(i)); } } while (nodestack.Count > 0) { ITree current = nodestack.Pop(); switch (current.Type) { case CpsParser.IMPLEMENTATION: // ^(IMPLEMENTATION[$start] $lang $cls $fn $code) if (current.ChildCount == 4) { _embeddedCode = new EmbeddedCode(); _embeddedCode.Language = ((ITree)current.GetChild(0)).Text; _embeddedCode.FileName = ((ITree)current.GetChild(2)).Text; _embeddedCode.Code = ((ITree)current.GetChild(3)).Text; if (_embeddedCode.FileName.IndexOf('"') == 0) { _embeddedCode.FileName = _embeddedCode.FileName.Substring(1, _embeddedCode.FileName.Length - 2); } } break; case CpsParser.FILTER_MODULE: for (int i = 0; i < current.ChildCount; i++) { nodestack.Push((ITree)current.GetChild(i)); } break; case CpsParser.INTERNAL: // ^(INTERNAL[$start] fqnOrSingleFmParam ^(NAMES IDENTIFIER+)) if (current.ChildCount >= 1) { ITree tp = ((ITree)current.GetChild(0)); if (tp.Type == CpsParser.FQN) { _types.Add(fqnToString(tp)); } } break; case CpsParser.EXTERNAL: // ^(EXTERNAL[$start] IDENTIFIER $type ^(INIT[$eq] $init joinPointContext?)?) if (current.ChildCount >= 2) { ITree tp = ((ITree)current.GetChild(1)); if (tp.Type == CpsParser.FQN) { _types.Add(fqnToString(tp)); } } break; case CpsParser.OUTPUT_FILTERS: _hasOutputFilters = true; break; } } }