示例#1
0
        public override void EnterExpression(FlyParser.ExpressionContext context)
        {
            if (context.INT() != null) // Int to operator stack
            {
                Code.Int(context.INT().GetText());
            }
            else if (context.NIL() != null) // Null to operator stack
            {
                Code.Nil();
            }
            else if (context.parenExp != null)
            {
                EnterExpression(context.parenExp);
            }
            else if (context.STRING() != null) // Load string to constants, and push to operator stack
            {
                Code.String(context.STRING().GetText());
            }
            else if (context.FLOAT() != null) // Float to operator stack
            {
                Code.Float(context.FLOAT().GetText());
            }
            else if (context.BOOL() != null)
            {
                Code.Bool(context.BOOL().GetText());
            }
            else if (context.ID() != null)
            {
                if (context.index != null)
                {
                    EnterExpression(context.index);
                    Code.VarCall(context.ID().GetText());
                    Code.ArrayGet();
                }
                else
                {
                    Code.VarCall(context.ID().GetText());
                }
            }
            else if (context.callOn != null)
            {
                if (Imports.Contains(context.target.GetText()))
                {
                    var lib = context.target.GetText();
                    if (context.callOn.methodCall() == null)
                    {
                        throw new Exception("No method call found.");
                    }
                    var method      = context.callOn.methodCall().ID().GetText();
                    var expressions = context.callOn.methodCall().expression();
                    foreach (var expr in expressions)
                    {
                        EnterExpression(expr);
                    }

                    Code.LibFunctionCall(lib, method);
                }
                else
                {
                    EnterExpression(context.target);
                    EnterExpression(context.callOn);
                }
            }
            else if (context.array() != null)
            {
                EnterArray(context.array());
            }
            else if (context.quickArray() != null)
            {
                EnterQuickArray(context.quickArray());
            }
            else if (context.unary != null)
            {
                EnterExpression(context.right);
                Code.UnaryOperator(context.unary.Text);
            }
            else if (context.left != null && context.right != null && context.op != null)
            {
                EnterExpression(context.right);
                EnterExpression(context.left);
                Code.BinaryOperator(context.op.Text);
            }
            else if (context.left != null && context.right != null && context.comp != null)
            {
                EnterExpression(context.right);
                EnterExpression(context.left);
                Code.CompareOperator(context.comp.Text);
            }
            else if (context.methodCall() != null)
            {
                EnterMethodCall(context.methodCall());
            }
            else if (context.varAssignment() != null)
            {
                EnterVarAssignment(context.varAssignment());
            }
            else if (context.anonymousMethodDefinition() != null)
            {
                EnterAnonymousMethodDefinition(context.anonymousMethodDefinition());
            }
            else if (context.lambdaExpression() != null)
            {
                EnterLambdaExpression(context.lambdaExpression());
            }
            else
            {
                throw new Exception("Not a valid expression");
            }
        }
示例#2
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="FlyParser.expression"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitExpression([NotNull] FlyParser.ExpressionContext context)
 {
 }