コード例 #1
0
        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);
        }
コード例 #2
0
        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;
        }
コード例 #3
0
ファイル: Symbol.cs プロジェクト: JRY-Zheng/ligral
 public Symbol Lookup(string name, bool recursively = true)
 {
     if (Symbols.ContainsKey(name))
     {
         return(Symbols[name]);
     }
     else if (recursively && enclosingScope != null)
     {
         return(enclosingScope.Lookup(name));
     }
     else
     {
         return(null);
     }
 }
コード例 #4
0
        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());
            }
        }