コード例 #1
0
        public SlangStoreTypesVisitor(SourceCodeTable table, ModuleData moduleData, string[] modules) : base(table, moduleData)
        {
            allModuleNames         = modules;
            moduleTable.ModuleData = moduleData;

            Table.Modules[ModuleData.Name] = moduleTable;
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 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));
     }
 }
コード例 #4
0
        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();
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
 public SlangBaseVisitor(SourceCodeTable table, ModuleData moduleData)
 {
     Table = table;
     ModuleData = moduleData;
 }
コード例 #7
0
 public SlangStoreFieldsVisitor(SourceCodeTable table, ModuleData module) : base(table, module)
 {
     moduleItem = table.Modules[module.Name];
 }
コード例 #8
0
 public FrontendCompiler()
 {
     SourceCode = new SourceCodeTable();
 }
コード例 #9
0
 public CppBackendCompiler(SourceCodeTable table) : base(table)
 {
 }
コード例 #10
0
 public void SetTable(SourceCodeTable table)
 {
     Table = table;
 }
コード例 #11
0
 protected BackendCompiler(SourceCodeTable table)
 {
     Table = table;
 }