示例#1
0
        private void BuildParameter(ParameterDeclarationNode parameterDeclarationNode, bool buildArray = false)
        {
            if (parameterDeclarationNode.ParentNode is FunctionDefinitionNode functionDefinitionNode)
            {
                FunctionSymbol functionSymbol    = (FunctionSymbol)functionDefinitionNode.Symbol;
                string         parameterName     = parameterDeclarationNode.NameNode.Value;
                string         parameterTypeName = parameterDeclarationNode.TypeNameCapitalized;

                ParameterSymbol parameterSymbol;
                if (functionSymbol.IsExternal)
                {
                    parameterSymbol = buildArray
                        ? new ExternalParameterArraySymbol(functionSymbol, parameterTypeName, parameterName, parameterDeclarationNode)
                        : new ExternalParameterSymbol(functionSymbol, parameterTypeName, parameterName, parameterDeclarationNode);
                }
                else
                {
                    parameterSymbol = buildArray
                        ? new ParameterArraySymbol(functionSymbol, parameterTypeName, parameterName, parameterDeclarationNode)
                        : new ParameterSymbol(functionSymbol, parameterTypeName, parameterName, parameterDeclarationNode);
                }
                AddSymbol(parameterSymbol);
            }
            else
            {
                throw new Exception();
            }
        }
示例#2
0
        protected override void VisitFunctionCall(FunctionCallNode node)
        {
            if (node.FunctionReferenceNode.Symbol != null)
            {
                FunctionDefinitionNode functionDefinitionNode;
                ASTNode declarationNode = node.FunctionReferenceNode.Symbol.Node;
                if (declarationNode is FunctionDefinitionNode)
                {
                    functionDefinitionNode = (FunctionDefinitionNode)node.FunctionReferenceNode.Symbol.Node;
                }
                else
                {
                    node.Annotations.Add(new SymbolIsNotAFunctionError(node.FunctionReferenceNode.Name, declarationNode.Location));
                    return;
                }

                Symbol symbol = functionDefinitionNode.Symbol;

                if (symbol != null)
                {
                    node.BuiltinType = symbol.BuiltinType;
                    if (symbol is NestableSymbol nestableSymbol)
                    {
                        node.ComplexType = nestableSymbol.ComplexType;
                    }
                }

                string identifier = functionDefinitionNode.NameNode.Value;

                List <ParameterDeclarationNode> parameterNodes = functionDefinitionNode.ParameterNodes;
                List <ExpressionNode>           argumentNodes  = node.ArgumentNodes;

                int parametersCount = parameterNodes.Count;
                int argumentsCount  = argumentNodes.Count;

                if (parametersCount != argumentsCount)
                {
                    node.Annotations.Add(new ArgumentsCountDoesNotMatchError(identifier, parametersCount, argumentsCount, functionDefinitionNode.NameNode.Location));
                }

                int iterationsCount = Math.Min(parametersCount, argumentsCount);
                for (int i = 0; i < iterationsCount; i++)
                {
                    ParameterDeclarationNode parameterNode = parameterNodes[i];
                    SymbolTypePair           parameterType = GetSymbolTypePairFromSymbol(parameterNode.Symbol);
                    ExpressionNode           argumentNode  = argumentNodes[i];

                    /*
                     * if (parameterType.BuiltinType == SymbolType.Float)
                     * {
                     *  _isInsideFloatExpression = true;
                     * }
                     */

                    _currentExpressionTypes.Push(parameterType);
                    Visit(argumentNode);
                    _currentExpressionTypes.Pop();


                    //_isInsideFloatExpression = false;

                    SymbolTypePair argumentType = GetSymbolTypePairFromExpressionNode(argumentNode);

                    //Console.Write("x");
                }
            }
        }
示例#3
0
 protected virtual T VisitParameterDeclaration(ParameterDeclarationNode node)
 {
     Visit(node.TypeNameNode);
     Visit(node.NameNode);
     return(DefaultResult);
 }
示例#4
0
 protected override void VisitParameterDeclaration(ParameterDeclarationNode parameterDeclarationNode)
 {
     BuildParameter(parameterDeclarationNode);
 }
 protected virtual void VisitParameterDeclaration(ParameterDeclarationNode node)
 {
     Visit(node.TypeNameNode);
     Visit(node.NameNode);
 }