Ejemplo n.º 1
0
        private String GetVariableReference(String variableName, Boolean getType = false)
        {
            LinkedListNode <Hashtable> currentVariableMap = variablemaps.Last;

            if (variableName == "this")
            {
                return("pointer 0");
            }

            while (currentVariableMap != null)
            {
                foreach (String currentkey in currentVariableMap.Value.Keys)
                {
                    if (currentkey == variableName)
                    {
                        VariableObject foundVariable = (VariableObject)currentVariableMap.Value[currentkey];

                        if (getType)
                        {
                            return(foundVariable.Type);
                        }
                        else
                        {
                            return(updateKind(foundVariable.Kind) + " " + foundVariable.Number);   // +" (aka " + variableName + ")";
                        }
                    }
                }

                currentVariableMap = currentVariableMap.Previous;
            }

            return(variableName + " not found");
        }
Ejemplo n.º 2
0
        private void CompileParameterList(Hashtable arguments, String functionType)
        {
            int            argumentCount = 0;
            VariableObject currentVariable;

            if (variablemaps.Count > 0)// && (String)variablemaps.Last.Value[0] == "")
            {
                foreach (DictionaryEntry entry in variablemaps.Last.Value)
                {
                    currentVariable = (VariableObject)entry.Value;

                    if (currentVariable.ParentType == "function")
                    {
                        variablemaps.RemoveLast();
                        break;
                    }
                }
            }

            if (functionType == "method")
            {
                currentVariable            = new VariableObject();
                currentVariable.Kind       = "argument";
                currentVariable.Type       = currentClassName;
                currentVariable.Number     = argumentCount++;
                currentVariable.ParentType = "function";
                arguments.Add("this", currentVariable);
            }

            if (getCurrentSequence() == "(")
            {
                advanceToken();
            }

            while (getCurrentSequence() != ")")
            {
                currentVariable            = new VariableObject();
                currentVariable.Kind       = "argument";
                currentVariable.Type       = getCurrentSequence();
                currentVariable.Number     = argumentCount++;
                currentVariable.ParentType = "function";
                //Console.WriteLine(getCurrentSequence());
                advanceToken();

                //Console.WriteLine(getCurrentSequence());

                arguments.Add(getCurrentSequence(), currentVariable);

                if (currentToken.Next.Value.sequence == ",")
                {
                    advanceToken(2);
                }
                else
                {
                    advanceToken();
                }
            }
        }
Ejemplo n.º 3
0
        private void writeVariables()
        {
            int counter = 0;

            foreach (Hashtable currentTable in variablemaps)
            {
                Console.WriteLine(counter);
                counter++;

                foreach (string key in currentTable.Keys)
                {
                    VariableObject blah = (VariableObject)currentTable[key];
                    Console.WriteLine(String.Format("{0}: {1}", key, blah.Kind + " - " + blah.Type + " - " + blah.Number));
                }
            }
        }
Ejemplo n.º 4
0
        private int CompileClassVarDec(Hashtable passedVariables = null)
        {
            String    currentKind, currentType;
            int       staticCount = 0, fieldCount = 0, varCount = 0;
            Hashtable variables;

            if (passedVariables != null)
            {
                variables = passedVariables;
            }
            else
            {
                variables = new Hashtable();
            }

            VariableObject currentVariable;

            while (getCurrentSequence() == "static" || getCurrentSequence() == "field" || getCurrentSequence() == "var")
            {
                currentKind = getCurrentSequence();

                advanceToken();
                currentType = getCurrentSequence();
                advanceToken();

                currentVariable            = new VariableObject();
                currentVariable.Kind       = currentKind;
                currentVariable.Type       = currentType;
                currentVariable.ParentType = (currentFunctionName == "" ? @"class" : @"function");

                switch (currentKind)
                {
                case "static":
                    currentVariable.Number = staticCount++;
                    break;

                case "field":
                    currentVariable.Number = fieldCount++;
                    break;

                case "var":
                    currentVariable.Number = varCount++;
                    break;
                }


                variables.Add(getCurrentSequence(), currentVariable);
                //Console.WriteLine("added " + getCurrentSequence());

                while (currentToken.Next.Value.sequence == ",")
                {
                    currentVariable            = new VariableObject();
                    currentVariable.Kind       = currentKind;
                    currentVariable.Type       = currentType;
                    currentVariable.ParentType = (currentFunctionName == "" ? @"class" : @"function");

                    switch (currentKind)
                    {
                    case "static":
                        currentVariable.Number = staticCount++;
                        break;

                    case "field":
                        currentVariable.Number = fieldCount++;
                        break;

                    case "var":
                        currentVariable.Number = varCount++;
                        break;
                    }


                    advanceToken(2);

                    variables.Add(getCurrentSequence(), currentVariable);
                    //Console.WriteLine("added " + getCurrentSequence());
                }

                advanceToken(2);
            }

            if (variables.Count > 0)
            {
                variablemaps.AddLast(variables);
            }

            return(varCount);
        }