Exemple #1
0
        /// <summary>
        /// Generates the code for an ArgumentDeclarationList node.
        /// </summary>
        /// <param name="adl">The ArgumentDeclarationList node.</param>
        /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns>
        private void GenerateArgumentDeclarationList(ArgumentDeclarationList adl, StringBuilder sb)
        {
            int comma = adl.kids.Count - 1; // tells us whether to print a comma

            foreach (Declaration d in adl.kids)
            {
                Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d, sb);
                if (0 < comma--)
                {
                    Generate(", ", sb);
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Generates the code for an ArgumentDeclarationList node.
        /// </summary>
        /// <param name="adl">The ArgumentDeclarationList node.</param>
        /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns>
        private string GenerateArgumentDeclarationList(ArgumentDeclarationList adl)
        {
            string retstr = String.Empty;

            int comma = adl.kids.Count - 1; // tells us whether to print a comma

            foreach (Declaration d in adl.kids)
            {
                retstr += Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d);
                if (0 < comma--)
                {
                    retstr += Generate(", ");
                }
            }

            return(retstr);
        }
Exemple #3
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);
                }
            }
        }
        /// <summary>
        ///     Generates the code for an ArgumentDeclarationList node.
        /// </summary>
        /// <param name="adl">The ArgumentDeclarationList node.</param>
        /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns>
        private string GenerateArgumentDeclarationList(ArgumentDeclarationList adl)
        {
            StringBuilder retVal = new StringBuilder();
            int comma = adl.kids.Count - 1; // tells us whether to print a comma

            foreach (Declaration d in adl.kids)
            {
                retVal.Append(GenerateDeclaration(d));
                //                retstr += Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d);
                if (0 < comma--)
                    retVal.Append(Generate(", "));
            }

            return retVal.ToString();
        }
        /// <summary>
        ///   Generates the code for an ArgumentDeclarationList node.
        /// </summary>
        /// <param name = "adl">The ArgumentDeclarationList node.</param>
        /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns>
        private string GenerateArgumentDeclarationList(ArgumentDeclarationList adl)
        {
            string retstr = "";

            int comma = adl.kids.Count - 1; // tells us whether to print a comma

            foreach (Declaration d in adl.kids)
            {
                retstr += GenerateDeclaration(d);
                //                retstr += Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d);
                if (0 < comma--)
                    retstr += Generate(", ");
            }

            return retstr;
        }