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(); } }
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"); } } }
protected virtual T VisitParameterDeclaration(ParameterDeclarationNode node) { Visit(node.TypeNameNode); Visit(node.NameNode); return(DefaultResult); }
protected override void VisitParameterDeclaration(ParameterDeclarationNode parameterDeclarationNode) { BuildParameter(parameterDeclarationNode); }
protected virtual void VisitParameterDeclaration(ParameterDeclarationNode node) { Visit(node.TypeNameNode); Visit(node.NameNode); }