public SlangStoreTypesVisitor(SourceCodeTable table, ModuleData moduleData, string[] modules) : base(table, moduleData) { allModuleNames = modules; moduleTable.ModuleData = moduleData; Table.Modules[ModuleData.Name] = moduleTable; }
public static BaseNameTableItem ByName(string name, Scope scope, RoutineNameTableItem currentRoutine, SlangCustomType currentType, ModuleNameTable moduleItem, SourceCodeTable table, Dictionary <string, bool> checkDefinitions) { var result = scope.FindVariable(name); // заходим во внешние блоки if (result == null) { // мы сейчас находимся в функции? if (currentRoutine != null && currentRoutine is { } routine) { // в методе? if (currentRoutine is MethodNameTableItem method) { // может это имя this метода? if (method.NameOfThis == name) { return(new VariableNameTableItem { IsConstant = false, Type = currentType, Name = name }); } } // неважно, в функции или методе -- проверяем его параметры foreach (var param in routine.Params) { if (param.Name == name) { return(new VariableNameTableItem { IsConstant = false, Type = param.TypeArg.Type, Name = name }); } } } if (moduleItem.Fields.ContainsKey(name) && (checkDefinitions != null ? checkDefinitions[name] : true)) { return(moduleItem.Fields[name]); } // либо это процедура-функция (взять все сигнатуры) ? if (moduleItem.Routines.ContainsKey(name) && (checkDefinitions != null ? checkDefinitions[name] : true)) { return(moduleItem.Routines[name]); } // ну либо это другой модуль? if (moduleItem.ImportedModules.Contains(name) || name == moduleItem.ModuleData.Name) { return(table.Modules[name]); } return(null); // иначе ничего не остается кроме как отдать пустоту } return(result); }
public ClassesValidator(SourceCodeTable table) { Table = table; foreach (var key in table.Modules.Keys) { allClasses.AddRange(table.Modules[key].Classes.Values.Where(i => i.Header == null)); } }
public CppTranslator(TextWriter headerWriter, TextWriter cppWriter, SourceCodeTable src, ModuleNameTable curModule, DirectoryInfo directoryGen) { headerText = new IndentedTextWriter(headerWriter); cppText = new IndentedTextWriter(cppWriter); source = src; currentModule = curModule; moduleName = currentModule.ModuleData.Name; this.directoryGen = directoryGen; scope = new Scope(); }
public SlangSemanticVisitor(SourceCodeTable table, ModuleData module) : base(table, module) { moduleItem = table.Modules[module.Name]; scope = new Scope(); // не включает в себя глобальную область видимости file = moduleItem.ModuleData.File; foreach (var field in moduleItem.Fields) { checkDefinitions.Add(field.Key, false); } foreach (var routine in moduleItem.Routines) { checkDefinitions.Add(routine.Key, false); } foreach (var classItem in moduleItem.Classes) { checkDefinitions.Add(classItem.Key, false); } }
public SlangBaseVisitor(SourceCodeTable table, ModuleData moduleData) { Table = table; ModuleData = moduleData; }
public SlangStoreFieldsVisitor(SourceCodeTable table, ModuleData module) : base(table, module) { moduleItem = table.Modules[module.Name]; }
public FrontendCompiler() { SourceCode = new SourceCodeTable(); }
public CppBackendCompiler(SourceCodeTable table) : base(table) { }
public void SetTable(SourceCodeTable table) { Table = table; }
protected BackendCompiler(SourceCodeTable table) { Table = table; }