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"); }
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(); } } }
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)); } } }
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); }