Esempio n. 1
0
        private void EmitMethod(NonTerm nonTerm)
        {
            Token             typeMethodDeclSimple;
            Token             methodName;
            List <BaseSymbol> formalParametersList;
            BaseSymbol        methodStatementList;
            BaseSymbol        returnStatement;

            NonTermFactory.GetMethodDecl(nonTerm, out typeMethodDeclSimple, out methodName,
                                         out formalParametersList, out methodStatementList, out returnStatement);

            _currentFormalArgumentList.Clear();
            foreach (BaseSymbol symbol in formalParametersList)
            {
                Token type;
                Token id;
                NonTermFactory.GetFormalArgumentDeclaration(symbol, out type, out id);
                _currentFormalArgumentList.Add(id.Value);
            }

            _compilerLogger.PrintRefreshFormalArgumentList(_currentFormalArgumentList);

            _currentMethod = _methodsTables[_currentClass.Name][methodName.Value];
            _g             = _currentMethod;

            GeneratePreInitLocalVariables(methodStatementList);

            Generate(methodStatementList);
            Type resultType = GetVariableType(typeMethodDeclSimple);

            string nameResult = AddTempLocalVariable(resultType);

            EmitExpression(returnStatement, resultType, nameResult);

            try
            {
                _g.Return(_currentOperandTempResult);
            }
            catch (InvalidCastException ex)
            {
                throw new CodeGenerationException(MessagesHelper.TypeMismatchEx, returnStatement.ToStringInfo(), ex);
            }

            ClearCurrentBlockLocalVariables();
        }
Esempio n. 2
0
        private KeyValuePair <string, MethodGen> GenerateMethodSignature(TypeGen classDeclaration, BaseSymbol nonTerm, AssemblyGen ag)
        {
            Token             typeMethodDeclSimple;
            Token             methodName;
            List <BaseSymbol> formalParametersList;

            NonTermFactory.GetMethodSignature(nonTerm, out typeMethodDeclSimple, out methodName, out formalParametersList);

            Type      methodReturnType = GetVariableType(typeMethodDeclSimple);
            MethodGen method           = classDeclaration.Public.Method(methodReturnType, methodName.Value);

            foreach (BaseSymbol symbol in formalParametersList)
            {
                Token type;
                Token id;
                NonTermFactory.GetFormalArgumentDeclaration(symbol, out type, out id);
                method.Parameter(GetVariableType(type), id.Value);
            }

            //_compilerLogger.PrintAddtFormalArgumentList(formalParametersList.Select(s => s.Symbols[1].Value).ToList());

            return(new KeyValuePair <string, MethodGen>(methodName.Value, method));
        }