public ShaderReflection GetShaderReflection() { ShaderReflection shaderReflection = new ShaderReflection(); int location; foreach (var p in _programs) { foreach (var item in p.Declarations) { if (item is GlobalVariableDeclaration) { GlobalVariableDeclaration vd = (GlobalVariableDeclaration)item; shaderReflection.Variables.Add(GetReflectionVariable(vd)); } else if (item is ConstantBufferDeclaration) { ConstantBufferDeclaration cb = (ConstantBufferDeclaration)item; BufferReflection buffer = new BufferReflection() { Type = cb.Type, Name = cb.Name }; foreach (var c in cb.Constants) { buffer.Constants.Add(GetReflectionVariable(c)); } shaderReflection.Buffers.Add(buffer); } } } return(shaderReflection); }
/// <summary> /// Generates the code for a GlobalVariableDeclaration node. /// </summary> /// <param name="gv">The GlobalVariableDeclaration node.</param> /// <returns>String containing C# code for GlobalVariableDeclaration gv.</returns> private void GenerateGlobalVariableDeclaration(GlobalVariableDeclaration gv, StringBuilder sb) { foreach (SYMBOL s in gv.kids) { Indent(sb); GenerateNodeToSB(gv, s, sb); GenerateLine(";", sb); } }
/// <summary> /// Generates the code for a GlobalVariableDeclaration node. /// </summary> /// <param name="gv">The GlobalVariableDeclaration node.</param> /// <returns>String containing C# code for GlobalVariableDeclaration gv.</returns> private string GenerateGlobalVariableDeclaration(GlobalVariableDeclaration gv) { string retstr = String.Empty; foreach (SYMBOL s in gv.kids) { retstr += Indent(); retstr += GenerateNode(s); retstr += GenerateLine(";"); } return(retstr); }
private static ShaderReflectionVariable GetReflectionVariable(GlobalVariableDeclaration vd) { ShaderReflectionVariable shaderVar = new ShaderReflectionVariable { Location = vd.Offset, Name = vd.Name, Semantic = vd.Semantic, Size = vd.Type.Size, Type = vd.Type.ReflectionType }; return(shaderVar); }
/// <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 a GlobalVariableDeclaration node. /// </summary> /// <param name="gv">The GlobalVariableDeclaration node.</param> /// <returns>String containing C# code for GlobalVariableDeclaration gv.</returns> private string GenerateGlobalVariableDeclaration(GlobalVariableDeclaration gv) { StringBuilder retVal = new StringBuilder(); foreach (SYMBOL s in gv.kids) { retVal.Append(Indent()); retVal.Append("public "); if (s is Assignment) { Assignment a = s as Assignment; List<string> identifiers = new List<string>(); checkForMultipleAssignments(identifiers, a); IsaGlobalVar = true; SYMBOL variableName = (SYMBOL) a.kids.Pop(); string VarName = GenerateNode(variableName); retVal.Append(VarName); IsaGlobalVar = false; #region Find the var name and type Declaration dec = variableName as Declaration; string type = dec.Datatype; string varName = dec.Id; #endregion if (DuplicatedGlobalVariables.ContainsKey(((Declaration) variableName).Id)) { if (a.kids.Count == 1) { SYMBOL assignmentChild = (SYMBOL) a.kids[0]; if (assignmentChild is IdentExpression) { IdentExpression identEx = (IdentExpression) assignmentChild; } 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; } 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; string value = GetValue(identEx); Constant dupConstant = (Constant) DuplicatedGlobalVariables[dec.Id]; dupConstant.Value = dupConstant.Value == null ? GetValue(dupConstant) : dupConstant.Value; if (value != dupConstant.Value) { return ""; } } } } retVal.Append(Generate(String.Format(" {0} ", a.AssignmentType), a)); foreach (SYMBOL kid in a.kids) { retVal.Append(CheckIfGlobalVariable(varName, type, kid)); } } else retVal.Append(GenerateNode(s)); retVal.Append(GenerateLine(";")); } return retVal.ToString(); }
/// <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> /// Generates the code for a GlobalVariableDeclaration node. /// </summary> /// <param name = "gv">The GlobalVariableDeclaration node.</param> /// <returns>String containing C# code for GlobalVariableDeclaration gv.</returns> private string GenerateGlobalVariableDeclaration(GlobalVariableDeclaration gv) { string retstr = ""; foreach (SYMBOL s in gv.kids) { retstr += Indent(); retstr += "public "; if (s is Assignment) { string innerretstr = ""; Assignment a = s as Assignment; List<string> identifiers = new List<string>(); checkForMultipleAssignments(identifiers, a); IsaGlobalVar = true; string VarName = GenerateNode((SYMBOL)a.kids.Pop()); innerretstr += VarName; IsaGlobalVar = false; #region Find the var name and type string[] vars = VarName.Split(' '); string type = vars[0]; string varName = vars[1]; #endregion innerretstr += Generate(String.Format(" {0} ", a.AssignmentType), a); foreach (SYMBOL kid in a.kids) { innerretstr += CheckIfGlobalVariable(varName, type, kid); } retstr += innerretstr; } else retstr += GenerateNode(s); retstr += GenerateLine(";"); } return retstr; }
/// <summary> /// Generates the code for a GlobalVariableDeclaration node. /// </summary> /// <param name = "gv">The GlobalVariableDeclaration node.</param> /// <returns>String containing C# code for GlobalVariableDeclaration gv.</returns> private string GenerateGlobalVariableDeclaration(GlobalVariableDeclaration gv) { string retstr = ""; foreach (SYMBOL s in gv.kids) { retstr += Indent(); retstr += "public "; if (s is Assignment) { string innerretstr = ""; Assignment a = s as Assignment; List<string> identifiers = new List<string>(); checkForMultipleAssignments(identifiers, a); IsaGlobalVar = true; string VarName = GenerateNode((SYMBOL)a.kids.Pop()); innerretstr += VarName; IsaGlobalVar = false; #region Find the var name and type string[] vars = VarName.Split(' '); string type = vars[0]; string varName = vars[1]; string globalVarValue = ""; #endregion innerretstr += Generate(String.Format(" {0} ", a.AssignmentType), a); foreach (SYMBOL kid in a.kids) { if (kid is Constant) { Constant c = kid as Constant; // Supprt LSL's weird acceptance of floats with no trailing digits // after the period. Turn float x = 10.; into float x = 10.0; if ("LSL_Types.LSLFloat" == c.Type) { int dotIndex = c.Value.IndexOf('.') + 1; if (0 < dotIndex && (dotIndex == c.Value.Length || !Char.IsDigit(c.Value[dotIndex]))) globalVarValue = c.Value.Insert(dotIndex, "0"); globalVarValue = "new LSL_Types.LSLFloat(" + c.Value + ") "; } else if ("LSL_Types.LSLInteger" == c.Type) { globalVarValue = "new LSL_Types.LSLInteger(" + c.Value + ") "; } else if ("LSL_Types.LSLString" == c.Type) { globalVarValue = "new LSL_Types.LSLString(\"" + c.Value + "\") "; } if (globalVarValue == "") globalVarValue = c.Value; if (globalVarValue == null) globalVarValue = GenerateNode(c); if (GlobalVariables.ContainsKey(globalVarValue)) { //Its an assignment to another global var! //reset the global value to the other's value GlobalVar var; GlobalVariables.TryGetValue(globalVarValue, out var); //Do one last additional test before we set it. if (type == var.Type) { globalVarValue = var.Value; } c.Value = globalVarValue; } innerretstr += globalVarValue; } else if (kid is IdentExpression) { IdentExpression c = kid as IdentExpression; globalVarValue = c.Name; if (GlobalVariables.ContainsKey(globalVarValue)) { //Its an assignment to another global var! //reset the global value to the other's value GlobalVar var; GlobalVariables.TryGetValue(globalVarValue, out var); //Do one last additional test before we set it. if (type == var.Type) { globalVarValue = var.Value; } } innerretstr += globalVarValue; } else innerretstr += GenerateNode(kid); } GlobalVariables.Add(varName, new GlobalVar { Type = type, Value = globalVarValue }); retstr += innerretstr; } else retstr += GenerateNode(s); retstr += GenerateLine(";"); } return retstr; }