/// <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> private void TransformNode(SYMBOL s, Dictionary<string, string> GlobalMethods, Dictionary<string, ObjectList> MethodArguements) { // 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)s).Datatype = m_datatypeLSL2OpenSim[((Declaration)s).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) { if ("void" == ((GlobalFunctionDefinition)s).ReturnType) // we don't need to translate "void" { if (GlobalMethods != null && !GlobalMethods.ContainsKey(((GlobalFunctionDefinition)s).Name)) GlobalMethods.Add(((GlobalFunctionDefinition)s).Name, "void"); } else { ((GlobalFunctionDefinition)s).ReturnType = m_datatypeLSL2OpenSim[((GlobalFunctionDefinition)s).ReturnType]; if (GlobalMethods != null && !GlobalMethods.ContainsKey(((GlobalFunctionDefinition)s).Name)) { GlobalMethods.Add(((GlobalFunctionDefinition)s).Name, ((GlobalFunctionDefinition)s).ReturnType); MethodArguements.Add(((GlobalFunctionDefinition)s).Name, (s).kids); } } //Reset the variables, we changed events /*m_allVariableValues = new List<string>(); foreach(SYMBOL child in s.kids) { if(child is ArgumentDeclarationList) { foreach(SYMBOL assignmentChild in child.kids) { if(assignmentChild is Declaration) { Declaration d = (Declaration)assignmentChild; m_allVariableValues.Add(d.Id); } } } }*/ } 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) 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); } } } } else if (assignmentChild is Constant) { Constant identEx = (Constant)assignmentChild; if (isDeclaration) m_globalVariableValues[decID] = identEx.Value; } } } } } /*if(s is StateEvent) { //Reset the variables, we changed events m_allVariableValues = new List<string>(); } 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]) { if (!(s is Assignment || s is ArgumentDeclarationList) && s.kids[i] is Declaration) AddImplicitInitialization(s, i); TransformNode((SYMBOL)s.kids[i], null, null); } } }
/// <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> private void TransformNode(SYMBOL s, Dictionary <string, string> GlobalMethods, Dictionary <string, ObjectList> MethodArguements) { // 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)s).Datatype = m_datatypeLSL2OpenSim[((Declaration)s).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) { if ("void" == ((GlobalFunctionDefinition)s).ReturnType) // we don't need to translate "void" { if (GlobalMethods != null && !GlobalMethods.ContainsKey(((GlobalFunctionDefinition)s).Name)) { GlobalMethods.Add(((GlobalFunctionDefinition)s).Name, "void"); } } else { ((GlobalFunctionDefinition)s).ReturnType = m_datatypeLSL2OpenSim[((GlobalFunctionDefinition)s).ReturnType]; if (GlobalMethods != null && !GlobalMethods.ContainsKey(((GlobalFunctionDefinition)s).Name)) { GlobalMethods.Add(((GlobalFunctionDefinition)s).Name, ((GlobalFunctionDefinition)s).ReturnType); MethodArguements.Add(((GlobalFunctionDefinition)s).Name, (s).kids); } } //Reset the variables, we changed events /*m_allVariableValues = new List<string>(); * foreach(SYMBOL child in s.kids) * { * if(child is ArgumentDeclarationList) * { * foreach(SYMBOL assignmentChild in child.kids) * { * if(assignmentChild is Declaration) * { * Declaration d = (Declaration)assignmentChild; * m_allVariableValues.Add(d.Id); * } * } * } * }*/ } 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) { 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); } } } } } else if (assignmentChild is Constant) { Constant identEx = (Constant)assignmentChild; if (isDeclaration) { m_globalVariableValues[decID] = identEx.Value; } } } } } } /*if(s is StateEvent) * { * //Reset the variables, we changed events * m_allVariableValues = new List<string>(); * } * 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]) { if (!(s is Assignment || s is ArgumentDeclarationList) && s.kids[i] is Declaration) { AddImplicitInitialization(s, i); } TransformNode((SYMBOL)s.kids[i], null, null); } } }
/// <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> /// 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); } }