Exemple #1
0
        public DogeSymbolTable BuildSymbolTable(DogeNamespaceDefinition @namespace)
        {
            var symbolTable = new DogeSymbolTable();

            symbolTable.AddNamespaceSymbolTable(@namespace, symbolTable.FullName);

            return(symbolTable);
        }
 private DogeSymbol SetNamespaceSymbol(DogeNamespaceDefinition @namespace, IList <string> fullName) =>
 SetSymbol(@namespace.Name.Last(), new DogeSymbol(
               @namespace.Name.Last(),
               fullName.With(@namespace.Name),
               DogeSymbolAttribute.None,
               DogeSymbolType.Namespace,
               DogeAccessibilityModifier.Public,
               null,
               @namespace));
Exemple #3
0
        private static void Compile(DogeFile file, bool verbose, string code, params string[] startup)
        {
            IEnumerable <DogeToken> tokens = Workspace.Tokenize(code).ToArray();

            if (verbose)
            {
                Console.WriteLine($"{string.Join(",\n", tokens.Select(x => x.ToString()))}");
            }

            DogeNamespaceDefinition @namespace = Workspace.Build(file, tokens);

            if (verbose)
            {
                Console.Write(@namespace.ToString());
            }

            DogeSymbolTable symbolTable = Workspace.BuildSymbolTable(@namespace);

            if (verbose)
            {
                Console.Write(symbolTable);
            }

            Workspace.AddStandardLibrary(symbolTable);

            Workspace.ResolveSymbols(@namespace, symbolTable);
            if (verbose)
            {
                Console.Write(@namespace.ToString());
            }

            DogeProject project = new DogeProject(
                @namespace,
                (DogeNamedMethodDefinition)symbolTable.ResolveSymbol(
                    startup,
                    s => s.SymbolType == DogeSymbolType.Method,
                    _ => true)
                .Definition !);

            DogeInterpreter interpreter = new DogeInterpreter(project);

            interpreter.Run();
        }
        public DogeSymbolTable AddNamespaceSymbolTable(DogeNamespaceDefinition @namespace, IList <string> fullName)
        {
            var internalSymbolTable = GetOrAddSymbolTable(@namespace.Name, DogeSymbolTableType.Namespace);

            internalSymbolTable.Parent?.SetNamespaceSymbol(@namespace, fullName);

            fullName = fullName.With(@namespace.Name);

            foreach (var @class in @namespace.ClassDefinitions)
            {
                internalSymbolTable.AddClassSymbolTable(@class, fullName);
            }

            foreach (var nestedNamespace in @namespace.NestedNamespaces)
            {
                internalSymbolTable.AddNamespaceSymbolTable(nestedNamespace, fullName);
            }

            return(internalSymbolTable);
        }
Exemple #5
0
        private void ResolveSymbols(DogeNamespaceDefinition @namespace,
                                    DogeSymbolTable symbolTable,
                                    ICollection <IList <string> > usingDefinitions,
                                    IList <string> fullName)
        {
            usingDefinitions = usingDefinitions
                               .Concat(
                @namespace
                .UsingDefinitions
                .Select(x => x.ReferenceName))
                               .ToList();

            if (fullName.Count > 0)
            {
                usingDefinitions = usingDefinitions
                                   .With(fullName)
                                   .Distinct()
                                   .ToList();
            }

            foreach (var nestedNamespace in @namespace.NestedNamespaces)
            {
                ResolveSymbols(nestedNamespace,
                               symbolTable,
                               usingDefinitions,
                               fullName.With(nestedNamespace.Name));
            }

            foreach (var @class in @namespace.ClassDefinitions)
            {
                ResolveSymbolTypes(@class,
                                   symbolTable,
                                   usingDefinitions,
                                   fullName.With(@class.Name));

                ResolveSymbols(@class,
                               symbolTable,
                               usingDefinitions,
                               fullName.With(@class.Name));
            }
        }
 public DogeProject(DogeNamespaceDefinition defaultNamespace, DogeNamedMethodDefinition startUp)
 {
     DefaultNamespace = defaultNamespace;
     StartUp          = startUp;
 }
Exemple #7
0
 public void ResolveSymbols(DogeNamespaceDefinition @namespace, DogeSymbolTable symbolTable) =>
 ResolveSymbols(@namespace, symbolTable, new List <IList <string> >(), new List <string>());