private void UsingLocalFile(UsingAST usingAST) { string fileName = string.Join('/', usingAST.FileName.ConvertAll(file => Visit(file))); TypeSymbol scopeType = currentScope.Lookup("SCOPE") as TypeSymbol; ScopeSymbolTable mainScope = currentScope; ScopeSymbolTable scopeSymbolTable = mainScope; folder = usingAST.Relative ? relativeFolder : rootFolder; Interpret(fileName); ScopeSymbol scopeSymbol; string module; if (usingAST.ModuleName != null) { module = Visit(usingAST.ModuleName); } else { module = Visit(usingAST.FileName.Last()); foreach (WordAST folder in usingAST.FileName.Take(usingAST.FileName.Count - 1)) { var symbol = scopeSymbolTable.Lookup(folder.Word); if (symbol != null && symbol is ScopeSymbol scope) { scopeSymbolTable = scope.GetValue() as ScopeSymbolTable; } else if (folder.Word == "..") { continue; } else { var temp = new ScopeSymbolTable(folder.Word, 0); scopeSymbol = new ScopeSymbol(folder.Word, scopeType, temp); if (!scopeSymbolTable.Insert(scopeSymbol, false)) { throw logger.Error(new SemanticException(folder.FindToken(), $"Cannot using {folder.Word} since it has already exists, consider rename it.")); } scopeSymbolTable = temp; } } } scopeSymbol = new ScopeSymbol(module, scopeType, currentScope); if (!scopeSymbolTable.Insert(scopeSymbol, false)) { throw logger.Error(new SemanticException((usingAST.ModuleName ?? usingAST.FileName.Last()).FindToken(), $"Cannot using {module} since it has already exists.")); } currentScope = mainScope; }
private void ImportLocalFile(ImportAST importAST) { ScopeSymbolTable mainScope = currentScope; string fileName = string.Join('/', importAST.FileName.ConvertAll(file => Visit(file))); folder = importAST.Relative ? relativeFolder : rootFolder; Interpret(fileName); if (importAST.Symbols.Count == 0) { currentScope = mainScope.Merge(currentScope); } else { foreach (var symbolName in importAST.Symbols) { var symbol = currentScope.Lookup(Visit(symbolName), false); if (symbol == null) { throw logger.Error(new SemanticException(symbolName.FindToken(), $"Cannot import {Visit(symbolName)} from {importAST.FileName.Last()}")); } if (!mainScope.Insert(symbol, false)) { throw logger.Error(new SemanticException(symbolName.FindToken(), $"Cannot import {Visit(symbolName)} since it has already exists")); } } currentScope = mainScope; } }
private void Register(JModel jModel) { if (jModel.Type is null) { throw logger.Error(new NotFoundException("Property `type`")); } Model model = ModelManager.Create(jModel.Type); if (jModel.Id is null) { throw logger.Error(new ModelException(model, "Property `id` not found.")); } model.Name = jModel.Id; TypeSymbol typeSymbol = symbolTable.Lookup("MODEL") as TypeSymbol; ModelSymbol modelSymbol = new ModelSymbol(jModel.Id, typeSymbol, model); symbolTable.Insert(modelSymbol); if (jModel.Parameters is null) { throw logger.Error(new ModelException(model, "Property `parameters` not found.")); } Config(jModel.Parameters, model); }
private object Visit(IdAST idAST) { Symbol symbol = currentScope.Lookup(idAST.Id); if (symbol == null) { TypeSymbol typeSymbol = currentScope.Lookup("Node") as TypeSymbol; Node node = typeSymbol.GetValue() as Node; node.Name = idAST.Id; ModelSymbol modelSymbol = new ModelSymbol(idAST.Id, typeSymbol, node); currentScope.Insert(modelSymbol); return(node); // throw logger.Error(new SemanticException(idAST.FindToken(), $"Undefined variable {idAST.Id}")); } else { return(symbol.GetValue()); } }