/// <summary>
 /// Exit a parse tree produced by <see cref="DDD_layout_scriptParser.operation"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitOperation([NotNull] DDD_layout_scriptParser.OperationContext context)
 {
 }
Example #2
0
        /* Összeadások, szorzások stb, zárójelezések sorozata.
         * A végén egy konkrét érték van. (float, int, vec3, errorobject)
         */
        public override object VisitOperation([NotNull] DDD_layout_scriptParser.OperationContext context)
        {
            if (context == null)
            {
                return(new UnitializedObject());
            }

            var opSymbolArr = context.binary_op().Select(binaryOpRule => binaryOpRule.GetText()).ToList();

            List <dynamic> opValues = new List <dynamic>();

            dynamic a = null;

            if (context.operation_helper() != null)
            {
                foreach (var opHelper in context.operation_helper())
                {
                    opValues.Add(VisitOperation_helper(opHelper));
                }
            }

            // elvégezzük az összes operációt, nem lesz már több műveleti jel
            while (opSymbolArr.Count() != 0)
            {
                for (int i = 0; i < opSymbolArr.Count(); ++i)
                {
                    // van-e még magas precedenciájú művelet-e a műveletláncban
                    if (opSymbolArr.Contains("*") || opSymbolArr.Contains("/"))
                    {
                        // ha egy olyannál vagyunk végezzük el
                        if (opSymbolArr[i] == "*" || opSymbolArr[i] == "/")
                        {
                            BinaryOperation op       = new BinaryOperation(opSymbolArr[i]);
                            dynamic         opResult = op.Calculate(opValues[i], opValues[i + 1]);

                            string warningMsg = op.WarningMsg;
                            if (warningMsg != null)
                            {
                                alerts.Add(new warning(context.Start.Line, warningMsg));
                            }

                            if (opResult is UnitializedObject)
                            {
                                alerts.Add(new error(context.Start.Line, "Using of uninitalized variable"));
                                return(new ErrorObject());
                            }

                            if (opResult == null)
                            {
                                alerts.Add(new error(context.Start.Line, op.ErrorMsg));
                                return(new ErrorObject());
                            }

                            opValues[i] = opResult;
                            opValues.RemoveAt(i + 1);
                            opSymbolArr.RemoveAt(i);
                        }
                    }
                    // már csak +-ok és -ok vannak
                    else
                    {
                        BinaryOperation op       = new BinaryOperation(opSymbolArr[i]);
                        dynamic         opResult = op.Calculate(opValues[i], opValues[i + 1]);

                        if (opResult is UnitializedObject)
                        {
                            alerts.Add(new error(context.Start.Line, "Using of uninitalized variable"));
                            return(new ErrorObject());
                        }

                        if (opResult == null)
                        {
                            alerts.Add(new error(context.Start.Line, op.ErrorMsg));
                            return(new ErrorObject());
                        }

                        opValues[i] = opResult;
                        opValues.RemoveAt(i + 1);
                        opSymbolArr.RemoveAt(i);
                    }
                }
            }

            return(opValues[0]);
        }
Example #3
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="DDD_layout_scriptParser.operation"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitOperation([NotNull] DDD_layout_scriptParser.OperationContext context)
 {
     return(VisitChildren(context));
 }