public void CheckModuleNames([NotNull] SLangGrammarParser.StartContext context) { var moduleNames = context.moduleImport().Select(i => i.Id()); context.moduleImport(); foreach (var module in moduleNames) { // нет в папке проекта и папке Lib var moduleName = module.GetText(); if (moduleTable.ImportedModules.Contains(moduleName)) { ThrowRepeatingModuleException(moduleName, ModuleData.File, module.Symbol); } if (!allModuleNames.Contains(moduleName)) { ThrowModuleNotFoundException(moduleName, ModuleData.File, module.Symbol); } if (moduleName == ModuleData.Name) { ThrowModuleImportsItselfException(moduleName, ModuleData.File, module.Symbol); } if (moduleName == CompilerConstants.MainModuleName) { ThrowUnableImportMainException(ModuleData.File, module.Symbol); } moduleTable.ImportedModules.Add(moduleName); } }
public override object VisitStart([NotNull] SLangGrammarParser.StartContext context) { CheckModuleNames(context); Visit(context.module()); return(null); }
public override object VisitStart([NotNull] SLangGrammarParser.StartContext context) { headerText.WriteLine($"#ifndef {moduleName}_H"); headerText.WriteLine($"#define {moduleName}_H"); // header includes headerText.WriteLine("#include <iostream>"); headerText.WriteLine("#include <vector>"); headerText.WriteLine("#include <memory>"); headerText.WriteLine("#include <string>"); var importedFiles = new HashSet <string>(); IEnumerable <IImportable> importableItems = GetImportables(currentModule); foreach (var item in importableItems) { if (item.Header != null) { importedFiles.Add(item.Header.File); } } foreach (var module in currentModule.ImportedModules) { var item = source.Modules[module]; if (item.IsEmpty) { var importables = GetImportables(item); foreach (var import in importables) { if (import.Header != null) { importedFiles.Add(import.Header.File); } } } } foreach (var file in importedFiles) { headerText.WriteLine($"#include {file}"); var replacedStr = file.Replace("\"", ""); var sourcePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory ?? throw new InvalidOperationException("Source code path is not set"), replacedStr); var destPath = Path.Combine(directoryGen.FullName, replacedStr); Directory.CreateDirectory(Path.GetDirectoryName(destPath)); File.Copy(sourcePath, destPath, true); } // cpp includes cppText.WriteLine($"#include \"{moduleName}.h\""); base.VisitStart(context); headerText.WriteLine(); headerText.WriteLine("#endif"); // end write headerText.Flush(); cppText.Flush(); return(null); }
/// <summary> /// Exit a parse tree produced by <see cref="SLangGrammarParser.start"/>. /// <para>The default implementation does nothing.</para> /// </summary> /// <param name="context">The parse tree.</param> public virtual void ExitStart([NotNull] SLangGrammarParser.StartContext context) { }
/// <summary> /// Visit a parse tree produced by <see cref="SLangGrammarParser.start"/>. /// <para> /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/> /// on <paramref name="context"/>. /// </para> /// </summary> /// <param name="context">The parse tree.</param> /// <return>The visitor result.</return> public virtual Result VisitStart([NotNull] SLangGrammarParser.StartContext context) { return(VisitChildren(context)); }