/// <summary> /// Generates the code for an ArgumentDeclarationList node. /// </summary> /// <param name="adl">The ArgumentDeclarationList node.</param> /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns> private void GenerateArgumentDeclarationList(ArgumentDeclarationList adl, StringBuilder sb) { int comma = adl.kids.Count - 1; // tells us whether to print a comma foreach (Declaration d in adl.kids) { Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d, sb); if (0 < comma--) { Generate(", ", sb); } } }
/// <summary> /// Generates the code for an ArgumentDeclarationList node. /// </summary> /// <param name="adl">The ArgumentDeclarationList node.</param> /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns> private string GenerateArgumentDeclarationList(ArgumentDeclarationList adl) { string retstr = String.Empty; int comma = adl.kids.Count - 1; // tells us whether to print a comma foreach (Declaration d in adl.kids) { retstr += Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d); if (0 < comma--) { retstr += Generate(", "); } } return(retstr); }
/// <summary> /// Recursively called to transform each type of node. Will transform this /// node, then all it's children. /// </summary> /// <param name="s">The current node to transform.</param> /// <param name="GlobalMethods"> </param> /// <param name="MethodArguements"> </param> /// <param name="scopesParent"> </param> /// <param name="scopeCurrent"> </param> private void TransformNode(SYMBOL s, Dictionary <string, string> GlobalMethods, Dictionary <string, ObjectList> MethodArguements, List <int> scopesParent, int scopeCurrent) { // make sure to put type lower in the inheritance hierarchy first // ie: since IdentConstant and StringConstant inherit from Constant, // put IdentConstant and StringConstant before Constant if (s is Declaration) { Declaration dec = (Declaration)s; dec.Datatype = m_datatypeLSL2OpenSim[dec.Datatype]; } else if (s is Constant) { ((Constant)s).Type = m_datatypeLSL2OpenSim[((Constant)s).Type]; } else if (s is TypecastExpression) { ((TypecastExpression)s).TypecastType = m_datatypeLSL2OpenSim[((TypecastExpression)s).TypecastType]; } else if (s is GlobalFunctionDefinition) { GlobalFunctionDefinition fun = (GlobalFunctionDefinition)s; if ("void" == fun.ReturnType) // we don't need to translate "void" { if (GlobalMethods != null && !GlobalMethods.ContainsKey(fun.Name)) { GlobalMethods.Add(fun.Name, "void"); } } else { fun.ReturnType = m_datatypeLSL2OpenSim[fun.ReturnType]; if (GlobalMethods != null && !GlobalMethods.ContainsKey(fun.Name)) { GlobalMethods.Add(fun.Name, fun.ReturnType); MethodArguements.Add(fun.Name, (s).kids); } } //Reset the variables, we changed events m_currentEvent = fun.Name; m_localVariableValues.Add("global_function_" + fun.Name, new Dictionary <string, SYMBOL>()); m_localVariableValuesStr.Add("global_function_" + fun.Name, new Dictionary <string, string>()); m_duplicatedLocalVariableValues.Add("global_function_" + fun.Name, new Dictionary <string, SYMBOL>()); m_localVariableScope.Add("global_function_" + fun.Name, new Dictionary <string, int>()); // this is a new function, lets clear the parent scopes and set the current scope to this scopesParent.Clear(); scopeCurrent = s.pos; scopesParent.Add(scopeCurrent); } else if (s is State) { //Reset the variables, we changed events State evt = (State)s; m_currentState = evt.Name; } else if (s is StateEvent) { //Reset the variables, we changed events StateEvent evt = (StateEvent)s; m_currentEvent = evt.Name; m_localVariableValues.Add(m_currentState + "_" + evt.Name, new Dictionary <string, SYMBOL>()); m_localVariableValuesStr.Add(m_currentState + "_" + evt.Name, new Dictionary <string, string>()); m_duplicatedLocalVariableValues.Add(m_currentState + "_" + evt.Name, new Dictionary <string, SYMBOL>()); m_localVariableScope.Add(m_currentState + "_" + evt.Name, new Dictionary <string, int>()); // this is a new state event, lets clear the parent scopes and set the current scope to this scopesParent.Clear(); scopeCurrent = s.pos; scopesParent.Add(scopeCurrent); } else if (s is ArgumentDeclarationList) { ArgumentDeclarationList adl = (ArgumentDeclarationList)s; foreach (SYMBOL child in adl.kids) { Declaration d = child as Declaration; if (d != null) { m_duplicatedLocalVariableValues[GetLocalVariableDictionaryKey()][d.Id] = null; } } //m_duplicatedLocalVariableValues.Add(m_currentState + "_" + evt.Name, new Dictionary<string, SYMBOL>()); } else if (s is GlobalVariableDeclaration) { GlobalVariableDeclaration gvd = (GlobalVariableDeclaration)s; foreach (SYMBOL child in gvd.kids) { if (child is Assignment) { bool isDeclaration = false; string decID = ""; foreach (SYMBOL assignmentChild in child.kids) { if (assignmentChild is Declaration) { Declaration d = (Declaration)assignmentChild; decID = d.Id; isDeclaration = true; } else if (assignmentChild is IdentExpression) { IdentExpression identEx = (IdentExpression)assignmentChild; if (isDeclaration) { if (m_globalVariableValues.ContainsKey(decID)) { m_duplicatedGlobalVariableValues[decID] = identEx; } m_globalVariableValues[decID] = identEx.Name; } } else if (assignmentChild is ListConstant) { ListConstant listConst = (ListConstant)assignmentChild; foreach (SYMBOL listChild in listConst.kids) { if (listChild is ArgumentList) { ArgumentList argList = (ArgumentList)listChild; int i = 0; bool changed = false; object[] p = new object[argList.kids.Count]; foreach (SYMBOL objChild in argList.kids) { p[i] = objChild; if (objChild is IdentExpression) { IdentExpression identEx = (IdentExpression)objChild; if (m_globalVariableValues.ContainsKey(identEx.Name)) { changed = true; p[i] = new IdentExpression(identEx.yyps, m_globalVariableValues[identEx.Name]) { pos = objChild.pos, m_dollar = objChild.m_dollar }; } } i++; } if (changed) { argList.kids = new ObjectList(); foreach (object o in p) { argList.kids.Add(o); } } if (isDeclaration) { if (m_globalVariableValues.ContainsKey(decID)) { m_duplicatedGlobalVariableValues[decID] = listConst; } m_globalVariableValues[decID] = listConst.Value; } } } } else if (assignmentChild is VectorConstant || assignmentChild is RotationConstant) { Constant listConst = (Constant)assignmentChild; int i = 0; bool changed = false; object[] p = new object[listConst.kids.Count]; foreach (SYMBOL objChild in listConst.kids) { p[i] = objChild; if (objChild is IdentExpression) { IdentExpression identEx = (IdentExpression)objChild; if (m_globalVariableValues.ContainsKey(identEx.Name)) { changed = true; p[i] = new IdentExpression(identEx.yyps, m_globalVariableValues[identEx.Name]) { pos = objChild.pos, m_dollar = objChild.m_dollar }; } } i++; } if (changed) { listConst.kids = new ObjectList(); foreach (object o in p) { listConst.kids.Add(o); } } if (isDeclaration) { if (m_globalVariableValues.ContainsKey(decID)) { m_duplicatedGlobalVariableValues[decID] = listConst; } m_globalVariableValues[decID] = listConst.Value; } } else if (assignmentChild is Constant) { Constant identEx = (Constant)assignmentChild; if (isDeclaration) { if (m_globalVariableValues.ContainsKey(decID)) { m_duplicatedGlobalVariableValues[decID] = identEx; } m_globalVariableValues[decID] = identEx.Value; } } } } } } else if (s is Assignment && m_currentEvent != "") { Assignment ass = (Assignment)s; bool isDeclaration = false; string decID = ""; foreach (SYMBOL assignmentChild in ass.kids) { if (assignmentChild is Declaration) { Declaration d = (Declaration)assignmentChild; decID = d.Id; isDeclaration = true; } else if (assignmentChild is IdentExpression) { IdentExpression identEx = (IdentExpression)assignmentChild; if (isDeclaration) { if (m_localVariableValues[GetLocalVariableDictionaryKey()].ContainsKey(decID) && !m_duplicatedLocalVariableValues[GetLocalVariableDictionaryKey()].ContainsKey(decID) && scopesParent.Contains(m_localVariableScope[GetLocalVariableDictionaryKey()][decID])) { m_duplicatedLocalVariableValues[GetLocalVariableDictionaryKey()][decID] = m_localVariableValues[GetLocalVariableDictionaryKey()][decID]; } m_localVariableValues[GetLocalVariableDictionaryKey()][decID] = identEx; m_localVariableValuesStr[GetLocalVariableDictionaryKey()][decID] = identEx.Name; m_localVariableScope[GetLocalVariableDictionaryKey()][decID] = scopeCurrent; } } else if (assignmentChild is ListConstant) { ListConstant listConst = (ListConstant)assignmentChild; foreach (SYMBOL listChild in listConst.kids) { if (listChild is ArgumentList) { ArgumentList argList = (ArgumentList)listChild; int i = 0; bool changed = false; object[] p = new object[argList.kids.Count]; foreach (SYMBOL objChild in argList.kids) { p[i] = objChild; if (objChild is IdentExpression) { IdentExpression identEx = (IdentExpression)objChild; if ( m_localVariableValues[GetLocalVariableDictionaryKey()].ContainsKey( identEx.Name)) { changed = true; p[i] = new IdentExpression(identEx.yyps, m_localVariableValuesStr[ GetLocalVariableDictionaryKey()][identEx.Name ]) { pos = objChild.pos, m_dollar = objChild.m_dollar }; } } i++; } if (changed) { argList.kids = new ObjectList(); foreach (object o in p) { argList.kids.Add(o); } } if (isDeclaration) { if (m_localVariableValues[GetLocalVariableDictionaryKey()].ContainsKey(decID) && !m_duplicatedLocalVariableValues[GetLocalVariableDictionaryKey()].ContainsKey( decID) && scopesParent.Contains( m_localVariableScope[GetLocalVariableDictionaryKey()][decID])) { m_duplicatedLocalVariableValues[GetLocalVariableDictionaryKey()][decID] = m_localVariableValues[GetLocalVariableDictionaryKey()][decID]; } m_localVariableValues[GetLocalVariableDictionaryKey()][decID] = listConst; m_localVariableValuesStr[GetLocalVariableDictionaryKey()][decID] = listConst.Value; m_localVariableScope[GetLocalVariableDictionaryKey()][decID] = scopeCurrent; } } } } else if (assignmentChild is VectorConstant || assignmentChild is RotationConstant) { Constant listConst = (Constant)assignmentChild; int i = 0; bool changed = false; object[] p = new object[listConst.kids.Count]; foreach (SYMBOL objChild in listConst.kids) { p[i] = objChild; if (objChild is IdentExpression) { IdentExpression identEx = (IdentExpression)objChild; if (m_localVariableValues[GetLocalVariableDictionaryKey()].ContainsKey(identEx.Name)) { changed = true; p[i] = new IdentExpression(identEx.yyps, m_localVariableValuesStr[GetLocalVariableDictionaryKey()] [identEx.Name]) { pos = objChild.pos, m_dollar = objChild.m_dollar }; } } i++; } if (changed) { listConst.kids = new ObjectList(); foreach (object o in p) { listConst.kids.Add(o); } } if (isDeclaration) { if (m_localVariableValues[GetLocalVariableDictionaryKey()].ContainsKey(decID) && !m_duplicatedLocalVariableValues[GetLocalVariableDictionaryKey()].ContainsKey(decID) && scopesParent.Contains(m_localVariableScope[GetLocalVariableDictionaryKey()][decID])) { m_duplicatedLocalVariableValues[GetLocalVariableDictionaryKey()][decID] = m_localVariableValues[GetLocalVariableDictionaryKey()][decID]; } m_localVariableValues[GetLocalVariableDictionaryKey()][decID] = listConst; m_localVariableValuesStr[GetLocalVariableDictionaryKey()][decID] = listConst.Value; m_localVariableScope[GetLocalVariableDictionaryKey()][decID] = scopeCurrent; } } else if (assignmentChild is Constant) { Constant identEx = (Constant)assignmentChild; if (isDeclaration) { if (m_localVariableValues[GetLocalVariableDictionaryKey()].ContainsKey(decID) && !m_duplicatedLocalVariableValues[GetLocalVariableDictionaryKey()].ContainsKey(decID) && scopesParent.Contains(m_localVariableScope[GetLocalVariableDictionaryKey()][decID])) { m_duplicatedLocalVariableValues[GetLocalVariableDictionaryKey()][decID] = m_localVariableValues[GetLocalVariableDictionaryKey()][decID]; } m_localVariableValues[GetLocalVariableDictionaryKey()][decID] = identEx; m_localVariableValuesStr[GetLocalVariableDictionaryKey()][decID] = identEx.Value; m_localVariableScope[GetLocalVariableDictionaryKey()][decID] = scopeCurrent; } } } } /*if(s is Statement) * { * if(s.kids.Count == 1 && s.kids[0] is Assignment) * { * Assignment assignment = (Assignment)s.kids[0]; * object[] p = new object[assignment.kids.Count]; * int i = 0; * int toRemove = -1; * foreach(SYMBOL assignmentChild in assignment.kids) * { * p[i] = assignmentChild; * if(assignmentChild is Declaration) * { * Declaration d = (Declaration)assignmentChild; * if(m_allVariableValues.Contains(d.Id)) * toRemove = i; * else * m_allVariableValues.Add(d.Id); * } * i++; * } * if(toRemove != -1) * { * List<object> ps = new List<object>(); * foreach(object obj in p) * ps.Add(obj); * ps[toRemove] = new IDENT(null) * { * kids = new ObjectList(), * pos = ((SYMBOL)ps[toRemove]).pos, * m_dollar = ((SYMBOL)ps[toRemove]).m_dollar, * yylval = ((SYMBOL)ps[toRemove]).yylval, * yylx = ((SYMBOL)ps[toRemove]).yylx, * yyps = ((SYMBOL)ps[toRemove]).yyps, * yytext = ps[toRemove] is Declaration ? * ((Declaration)ps[toRemove]).Id * : ((SYMBOL)ps[toRemove]).yyname, * }; * ((SYMBOL)s.kids[0]).kids = new ObjectList(); * foreach(object obj in ps) * if(obj != null) * ((SYMBOL)s.kids[0]).kids.Add(obj); * } * } * }*/ for (int i = 0; i < s.kids.Count; i++) { // It's possible that a child is null, for instance when the // assignment part in a for-loop is left out, ie: // // for (; i < 10; i++) // { // ... // } // // We need to check for that here. if (null == s.kids[i]) { continue; } bool scopeAdded = false; // we need to keep track of the scope for dulicate variables if ((s is IfStatement) || (s is WhileStatement) || (s is ForLoopStatement) || (s is DoWhileStatement)) { scopeCurrent = ((SYMBOL)s.kids[i]).pos; scopesParent.Add(scopeCurrent); scopeAdded = true; } if (!(s is Assignment || s is ArgumentDeclarationList) && s.kids[i] is Declaration) { AddImplicitInitialization(s, i); } TransformNode((SYMBOL)s.kids[i], null, null, scopesParent, scopeCurrent); // we need to remove the current scope from the parent since we are no longer in that scope if (scopeAdded) { scopesParent.Remove(scopeCurrent); } } }
/// <summary> /// Generates the code for an ArgumentDeclarationList node. /// </summary> /// <param name="adl">The ArgumentDeclarationList node.</param> /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns> private string GenerateArgumentDeclarationList(ArgumentDeclarationList adl) { StringBuilder retVal = new StringBuilder(); int comma = adl.kids.Count - 1; // tells us whether to print a comma foreach (Declaration d in adl.kids) { retVal.Append(GenerateDeclaration(d)); // retstr += Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d); if (0 < comma--) retVal.Append(Generate(", ")); } return retVal.ToString(); }
/// <summary> /// Generates the code for an ArgumentDeclarationList node. /// </summary> /// <param name = "adl">The ArgumentDeclarationList node.</param> /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns> private string GenerateArgumentDeclarationList(ArgumentDeclarationList adl) { string retstr = ""; int comma = adl.kids.Count - 1; // tells us whether to print a comma foreach (Declaration d in adl.kids) { retstr += GenerateDeclaration(d); // retstr += Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d); if (0 < comma--) retstr += Generate(", "); } return retstr; }