Пример #1
0
        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);
        }
Пример #2
0
 /// <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);
     }
 }
Пример #3
0
        /// <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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        /// <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);
                }
            }
        }
Пример #6
0
        /// <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();
        }
Пример #7
0
        /// <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);
                }
            }
        }
Пример #8
0
        /// <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;
        }