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));
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); }
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; }
public void ResolveSymbols(DogeNamespaceDefinition @namespace, DogeSymbolTable symbolTable) => ResolveSymbols(@namespace, symbolTable, new List <IList <string> >(), new List <string>());