/// <summary> /// Провести семантический анализ текста /// </summary> /// <param name="text"></param> /// <param name="libraryScope"></param> /// <param name="tokenStream"></param> /// <param name="tree"></param> /// <returns></returns> public VhdlFile ParseText(string text, string filePath, out CommonTokenStream tokenStream, out IParseTree tree) { VhdlFile file = null; lock (this) { // Start process ICharStream stream = new CaseInsensitiveStringStream(text, filePath); file = Parse(stream, currentLibrary, out tokenStream, out tree); } return(file); }
private ArrayType GetArrayType(PapyrusType elementType) { var objectIdentifier = elementType.Name; lock (_arrayTypes) { if (!_arrayTypes.ContainsKey(objectIdentifier)) { var source = CreateArrayTypeSource(objectIdentifier); var stream = new CaseInsensitiveStringStream(source); var lexer = new PapyrusLexer(stream); var parser = new PapyrusParser(new CommonTokenStream(lexer)); parser.AsDynamic().KnownUserFlags = _program.FlagsFile.NativeFlagsDict; parser.script(); var compilerType = parser.ParsedObject; var nodeBinder = new NodeBinder(); var node = nodeBinder.Bind(null, _program, new ScriptText(null, source, "0"), compilerType.GetTokenStream(), compilerType.GetAst()); var scopeBinder = new ScopeBinder(); var scopeResult = scopeBinder.Bind(compilerType, node.Value); node.Diagnostics.AddRange(scopeResult.Diagnostics); var symbolBinder = new SymbolBinder(); var symbolResult = symbolBinder.Bind(node.Value); var type = new ArrayType(_program, symbolResult.Value, compilerType, elementType.Name); _arrayTypes.Add(objectIdentifier, type); } return(_arrayTypes[objectIdentifier]); } }
/// <summary> /// Если обьект класса CodeFile является VHDL_CodeFile, /// то провести его обработку и встроить в общую библиотеку, /// новый поток не создается, /// ошибки выписываются в обьект file /// </summary> /// <param name="file"></param> public override void ProcessCodeFile(CodeFile file) { try { lock (this) { isBusy = true; if ((file is VHDL_CodeFile) && ((file as VHDL_CodeFile).LibraryName == "work")) { VHDL_CodeFile vhdlCode = (file as VHDL_CodeFile); vhdlCode.ParseException = null; vhdlCode.ParseSyntaxException = null; vhdlCode.ParseSemanticException = null; VhdlFile oldFile = null; foreach (VhdlFile f in currentLibrary.Files) { if (f.FilePath == file.FilePath) { oldFile = f; break; } } if (oldFile != null) { currentLibrary.Files.Remove(oldFile); } IParseTree tree; CommonTokenStream tokenStream; ICharStream stream = new CaseInsensitiveStringStream(file.Text, file.FilePath); VhdlFile ParsedFile = Parse(stream, currentLibrary, out tokenStream, out tree); if (ParsedFile != null) { ParsedFile.FilePath = file.FilePath; } vhdlCode.File = ParsedFile; vhdlCode.ParseSemanticException = parseSemanticException; vhdlCode.ParseSyntaxException = parseSyntaxException; vhdlCode.ParseException = parseException; vhdlCode.TokenStream = tokenStream; vhdlCode.Tree = tree; vhdlCode.LibraryFileInfo = LibraryFileInfo.AnalyseText(vhdlCode.Text, vhdlCode.FilePath, vhdlCode.LibraryName); foreach (CodeFile f in vhdlCode.Dependencies) { f.NeedForUpdate = true; } SetDependencies(); } base.ProcessCodeFile(file); isBusy = false; } } catch (Exception ex) { Messages.Add(new DiagnosticMessage(string.Format("Message: {0}\n Source: {1}\n StackTrace: {2}\n HelpLink: {3}", ex.Message, ex.Source, ex.StackTrace, ex.HelpLink))); NotifyCollectionChanged(); } }