Example #1
0
        public FunctionParser(
            ILexer lexer,
            IModuleFunctionMap functionMap,
            IFunctionDefinitionGenerator functionDefinitionGenerator,
            IHeap heap) :
            this
            (
                lexer,
                functionMap,
                functionDefinitionGenerator,
                heap,

                new BinopExpressionParser(),
                new FunctionCallParser(),
                new ComparisonParser()
            )
        {
        }
Example #2
0
        public FunctionCall Parse(
            ILexer lexer,
            IModuleFunctionMap functionMap,
            IExpressionParser expressionParser,
            string name)
        {
            if (functionMap.Contains(name) == false)
            {
                throw new WasmicCompilerException($"function {name} is not declared");
            }

            var callFunc = functionMap.Get(name);

            var parameters = new List <IWasmicSyntaxTreeExpression>();

            lexer.AssertNext(TokenType.L_Paren);
            lexer.Advance();
            if (lexer.Next.TokenType != TokenType.R_Paren)
            {
                do
                {
                    var parameterLoad = expressionParser.GetExpression();
                    parameters.Add(parameterLoad);
                } while(lexer.Next.TokenType == TokenType.Comma);
            }
            lexer.AssertNext(TokenType.R_Paren);
            lexer.Advance();

            var expectedParameters = callFunc.Parameters;

            if (expectedParameters.Count != parameters.Count)
            {
                throw new WasmicCompilerException($"unmatched argument count");
            }
            for (int i = 0; i < expectedParameters.Count; i++)
            {
                if (expectedParameters[i].Type != parameters[i].Type)
                {
                    throw new WasmicCompilerException($"expected argument to be {expectedParameters[i].Type} but found {parameters[i].Type}");
                }
            }

            return(new FunctionCall(name, callFunc.ReturnType?.Type, parameters));
        }
Example #3
0
        internal FunctionParser(
            ILexer lexer,
            IModuleFunctionMap functionMap,
            IFunctionDefinitionGenerator functionDefinitionGenerator,
            IHeap heap,

            IBinopExpressionParser binopExpressionParser,
            IFunctionCallParser functionCallParser,
            IComparisonParser comparisonParser)
        {
            _lexer       = lexer;
            _functionMap = functionMap;
            _functionDefinitionGenerator = functionDefinitionGenerator;
            _heap = heap;

            _binopExpressionParser = binopExpressionParser;
            _functionCallParser    = functionCallParser;
            _comparisonParser      = comparisonParser;
        }