private FunctionSym newStandardFunction(string symbol, params string[] parameters)
        {
            FunctionSym retVal = new FunctionSym(new Token(symbol, TokenCategory.IDENTIFIER, -1, -1), FunctionSymKind.STANDARD);

            for (int i = 0; i < parameters.Length; i++)
            {
                retVal.AddLocalVariable(new VariableSym(new Token(parameters[i], TokenCategory.IDENTIFIER, -1, -1), VariableSymKind.PARAMETER));
            }
            return(retVal);
        }
Beispiel #2
0
 public void Visit(NFunDefList node)
 {
     foreach (NFunDef funDef in node)
     {
         FunctionSym newFuncSym = new FunctionSym(funDef.AnchorToken, FunctionSymKind.USER_DEFINED);
         // Add parameters to local scope
         foreach (NParameter param in funDef[0])
         {
             VariableSym newParam = new VariableSym(param.AnchorToken, VariableSymKind.PARAMETER);
             newFuncSym.AddLocalVariable(newParam);
         }
         // Add variables to local scope
         foreach (NVarDef variable in funDef[1])
         {
             VariableSym newVariable = new VariableSym(variable.AnchorToken, VariableSymKind.REGULAR);
             newFuncSym.AddLocalVariable(newVariable);
         }
         semanticAnalyzer.AddFunction(newFuncSym);
     }
 }
        public string Visit(NForStmt nForStmt)
        {
            Token  anchorToken = nForStmt.AnchorToken;
            string lexeme      = anchorToken.Lexeme;
            string retVal      = "";

            string continueLabel = GenerateLabel();
            string breakLabel    = GenerateLabel();

            string lastContinueLabel = currentContinueLabel;
            string lastBreakLabel    = currentBreakLabel;

            currentContinueLabel = continueLabel;
            currentBreakLabel    = breakLabel;

            string      sizeLocalVariable = GenerateLabel();
            VariableSym sizeLocalVarSym   = new VariableSym(sizeLocalVariable, VariableSymKind.REGULAR);

            currentFunction.AddLocalVariable(sizeLocalVarSym);
            retVal += "\t\t.locals init (int64 '" + sizeLocalVariable + "')\n";

            string      indexLocalVariable = GenerateLabel();
            VariableSym indexLocalVarSym   = new VariableSym(indexLocalVariable, VariableSymKind.REGULAR);

            currentFunction.AddLocalVariable(indexLocalVarSym);
            retVal += "\t\t.locals init (int64 '" + indexLocalVariable + "')\n";

            string      arrayHandleLocalVariable = GenerateLabel();
            VariableSym arrayHandleLocalVarSym   = new VariableSym(arrayHandleLocalVariable, VariableSymKind.REGULAR);

            currentFunction.AddLocalVariable(arrayHandleLocalVarSym);
            retVal += "\t\t.locals init (int64 '" + arrayHandleLocalVariable + "')\n";

            Node nExpr     = nForStmt[0];
            Node nStmtList = nForStmt[1];

            retVal += Visit((dynamic)nExpr);
            retVal += storeVariable(arrayHandleLocalVariable);
            retVal += loadVariable(arrayHandleLocalVariable);
            retVal += "\t\tcall int64 class ['int64lib']'Int64'.'Utils'::'size'(int64)\n";
            retVal += storeVariable(sizeLocalVariable);
            retVal += "\t\tldc.i8 -1\n";
            retVal += storeVariable(indexLocalVariable);
            retVal += continueLabel + ":\n";
            retVal += loadVariable(indexLocalVariable);
            retVal += "\t\tldc.i8 1\n";
            retVal += "\t\tadd\n";
            retVal += storeVariable(indexLocalVariable);
            retVal += loadVariable(indexLocalVariable);
            retVal += loadVariable(sizeLocalVariable);
            retVal += "\t\tclt\n";
            retVal += "\t\tbrfalse " + breakLabel + "\n";
            retVal += loadVariable(arrayHandleLocalVariable);
            retVal += loadVariable(indexLocalVariable);
            retVal += "\t\tcall int64 class ['int64lib']'Int64'.'Utils'::'get'(int64, int64)\n";
            retVal += storeVariable(lexeme);
            retVal += Visit((dynamic)nStmtList);
            retVal += "\t\tbr " + continueLabel + "\n";
            retVal += breakLabel + ":\n";

            currentContinueLabel = lastContinueLabel;
            currentBreakLabel    = lastBreakLabel;

            return(retVal);
        }