コード例 #1
0
        public override void Visit(MethodCallExpressionNode node)
        {
            Gen("push", "ecx", "", "Save 'this' pointer for current function");
            if (node.expressionList != null)
            {
                for (int x = node.expressionList.expressionList.Count - 1; x >= 0; x--)
                {
                    node.expressionList.ExpressionAtIndex(x).Accept(this);
                    Gen("push", "eax", "", "Pushing Parameter " + (x + 1).ToString());
                }
            }
            node.expression.Accept(this);
            Gen("mov", "ecx", "eax");
            Gen("mov", "eax", "[ecx]");
            ClassDefinition  classDefinition  = Analysis.Environment.Classes.Lookup(node.expression.ExpressionType.Name);
            MethodDefinition methodDefinition = Analysis.Environment.LookupMethodInClass(node.identifier.name, classDefinition);

            Gen("call", "dword ptr [eax+" + methodDefinition.Location.ToString() + "]", "", "Calling method " + classDefinition.Name + "." + methodDefinition.Name + "()");
            if (node.expressionList != null)
            {
                if (node.expressionList.expressionList.Count > 0)
                {
                    Gen("add", "esp", methodDefinition.SizeOfParametersInBytes.ToString());
                }
            }
            Gen("pop", "ecx", "", "Recover 'this' pointer for current function");
        }
コード例 #2
0
        public IExpressionNode Visit(IExpressionNode node)
        {
            List <IExpressionNode> chain = null;
            var binaryExpression         = node as IBinaryExpressionNode;

            while (binaryExpression != null && binaryExpression.Token == TokenType.QuestionDot)
            {
                if (chain == null)
                {
                    chain = new List <IExpressionNode>();
                }

                chain.Insert(0, binaryExpression.Right);
                var left = binaryExpression.Left;
                binaryExpression = left as IBinaryExpressionNode;
                if (binaryExpression == null)
                {
                    chain.Insert(0, left);
                }
            }
            if (chain == null)
            {
                return(node);
            }

            node = null;
            for (int i = 1; i < chain.Count; i++)
            {
                node = new MethodCallExpressionNode(TypeConstantNode, "NullConditionalOperatorImpl",
                                                    new[] { node ?? chain[i - 1], new LambdaExpressionNode(UpdateTarget(chain[i], LambdaParameterNode), LambdaParameters) }, null);
            }
            return(node);
        }
コード例 #3
0
 public virtual void Visit(MethodCallExpressionNode node)
 {
     node.expression.Accept(this);
     if (node.expressionList != null)
     {
         for (int x = 0; x < node.expressionList.expressionList.Count; x++)
         {
             node.expressionList.ExpressionAtIndex(x).Accept(this);
         }
     }
 }
コード例 #4
0
        public override void Visit(MethodCallExpressionNode node)
        {
            node.expression.Accept(this);

            if (node.expression.ExpressionType.GetType() != typeof(ClassType))
            {
                throw new Exception("Object used for method call is not an instance of any Class");
            }

            ClassDefinition  classDefinition = Analysis.Environment.Classes.Lookup(node.expression.ExpressionType.Name);
            MethodDefinition methodDefinition;

            try
            {
                methodDefinition = Analysis.Environment.LookupMethodInClass(node.identifier.name, classDefinition);
            }
            catch (Exception)
            {
                throw new Exception("No definition exists for method '" + node.identifier.name + "' in class '" + node.expression.ExpressionType.Name + "'!");
            }
            if (!(node.expressionList == null && methodDefinition.Parameters.Count == 0))
            {
                if (node.expressionList != null && node.expressionList.expressionList.Count == methodDefinition.Parameters.Count)
                {
                    for (int x = 0; x < methodDefinition.Parameters.Count; x++)
                    {
                        node.expressionList.ExpressionAtIndex(x).Accept(this);
                        if (node.expressionList.ExpressionAtIndex(x).ExpressionType.GetType() == typeof(ClassType))
                        {
                            if (!IsClassCompatible((ClassType)node.expressionList.ExpressionAtIndex(x).ExpressionType, (ClassType)methodDefinition.Parameters.ItemAt(x).ParameterType))
                            {
                                throw new Exception("Type mismatch in method call at parameter " + x);
                            }
                        }
                        else
                        if (!AreTypeCompatible(node.expressionList.ExpressionAtIndex(x).ExpressionType.GetType(), methodDefinition.Parameters.ItemAt(x).ParameterType.GetType()))
                        {
                            throw new Exception("Type mismatch in method call at parameter " + x);
                        }
                    }
                }
                else
                {
                    throw new Exception("Method '" + methodDefinition.Name + "' takes " + methodDefinition.Parameters.Count + " Paramater(s)");
                }
            }

            node.ExpressionType = methodDefinition.ReturnType;
        }
コード例 #5
0
 public override void Visit(MethodCallExpressionNode node)
 {
     Console.WriteLine(this.indentation + "<object_instance>." + node.identifier.name + "()           ---- Method Call -----");
     indentation = indentation + "   ";
     Console.WriteLine(this.indentation + "object_instance");
     indentation = indentation + "   ";
     node.expression.Accept(this);
     indentation = indentation.Substring(0, indentation.Length - 3);
     if (node.expressionList != null)
     {
         Console.WriteLine(this.indentation + "Paramaters");
         indentation = indentation + "   ";
         for (int x = 0; x < node.expressionList.expressionList.Count; x++)
         {
             node.expressionList.ExpressionAtIndex(x).Accept(this);
         }
         indentation = indentation.Substring(0, indentation.Length - 3);
     }
     indentation = indentation.Substring(0, indentation.Length - 3);
 }
        private string EvaluateStringMethodCall(MethodCallExpressionNode methodCallExpression)
        {
            var memberExpression   = (MemberExpressionNode)methodCallExpression.Object;
            var constantExpression = (ConstantExpressionNode)methodCallExpression.Arguments.First();

            switch (methodCallExpression.Method.Signature)
            {
            case "Boolean Equals(System.String)":
                return($"{EvaluateMemberExpression(memberExpression)} eq '{constantExpression.Value}'");

            case "Boolean StartsWith(System.String)":
                return($"startswith({EvaluateMemberExpression(memberExpression)}, '{constantExpression.Value}')");

            case "Boolean EndsWith(System.String)":
                return($"endswith({EvaluateMemberExpression(memberExpression)}, '{constantExpression.Value}')");

            case "Boolean Contains(System.String)":
                return($"contains({EvaluateMemberExpression(memberExpression)}, '{constantExpression.Value}')");

            default:
                throw new Exception("string only supports Equals, StartsWith, EndsWith and Contains methods");
            }
        }
コード例 #7
0
        public IExpressionNode Visit(IExpressionNode node)
        {
            var member = node as IMemberExpressionNode;
            var resourceExpressionNode = member?.Target as ResourceExpressionNode;

            if (resourceExpressionNode != null)
            {
                //$self, $this --> $BindingServiceProvider.ResourceResolver.SelfResourceName
                if (member.Member == "self" || member.Member == "this")
                {
                    if (resourceExpressionNode.Dynamic)
                    {
                        return(new MemberExpressionNode(member.Target, BindingServiceProvider.ResourceResolver.SelfResourceName));
                    }
                    return(new MethodCallExpressionNode(member.Target, DefaultBindingParserHandler.GetSelfMethod, null, null));
                }
                //$context --> $BindingServiceProvider.ResourceResolver.DataContextResourceName
                if (member.Member == "context")
                {
                    return(new MemberExpressionNode(member.Target, BindingServiceProvider.ResourceResolver.DataContextResourceName));
                }
                //$args, $arg --> $GetEventArgs()
                if (member.Member == "args" || member.Member == "arg")
                {
                    return(new MethodCallExpressionNode(member.Target, DefaultBindingParserHandler.GetEventArgsMethod, null, null));
                }
                //$binding --> $GetBinding()
                if (member.Member == "binding")
                {
                    return(new MethodCallExpressionNode(member.Target, DefaultBindingParserHandler.GetBindingMethod, null, null));
                }
            }

            var methodCallExp = node as IMethodCallExpressionNode;

            if (methodCallExp != null && methodCallExp.Target is ResourceExpressionNode)
            {
                //$OneTime(Expression) --> oneTimeImpl.GetValue(GetBinding(), () => Expression)
                if (methodCallExp.Method == "OneTime" && methodCallExp.Arguments.Count == 1)
                {
                    DataConstant <object> constant = Guid.NewGuid().ToString("n");
                    var             idEx           = new ConstantExpressionNode(constant);
                    var             getBindEx      = new MethodCallExpressionNode(ResourceExpressionNode.DynamicInstance, DefaultBindingParserHandler.GetBindingMethod, null, null);
                    IExpressionNode getValueEx     = new LambdaExpressionNode(methodCallExp.Arguments[0], null);
                    return(new MethodCallExpressionNode(new ConstantExpressionNode(typeof(BindingExtensions)), "GetOrAddValue", new[]
                    {
                        getBindEx, idEx, getValueEx
                    }, null).Accept(this));
                }

                //Alias ($Format(), $MethodName, etc) --> type.Format()
                Type   type;
                string method;
                if (BindingServiceProvider.ResourceResolver.TryGetMethodAlias(methodCallExp.Method, out type, out method))
                {
                    return(new MethodCallExpressionNode(new ConstantExpressionNode(type), method, methodCallExp.Arguments, methodCallExp.TypeArgs).Accept(this));
                }
            }

            var    nodes      = new List <IExpressionNode>();
            var    members    = new List <string>();
            string memberName = node.TryGetMemberName(true, true, nodes, members);

            if (memberName == null)
            {
                var relativeExp = nodes[0] as IRelativeSourceExpressionNode;
                if (relativeExp != null)
                {
                    relativeExp.MergePath(BindingExtensions.MergePath(members));
                    return(relativeExp);
                }

                var methodCall = nodes[0] as IMethodCallExpressionNode;
                if (methodCall != null && methodCall.Target is ResourceExpressionNode)
                {
                    if (RelativeSourceAliases.Contains(methodCall.Method))
                    {
                        if ((methodCall.Arguments.Count == 1 || methodCall.Arguments.Count == 2) &&
                            methodCall.Arguments[0] is IMemberExpressionNode)
                        {
                            int level        = 1;
                            var relativeType = (IMemberExpressionNode)methodCall.Arguments[0];
                            if (methodCall.Arguments.Count == 2)
                            {
                                level = (int)((IConstantExpressionNode)methodCall.Arguments[1]).Value;
                            }
                            return(RelativeSourceExpressionNode.CreateRelativeSource(relativeType.Member, (uint)level,
                                                                                     BindingExtensions.MergePath(members)));
                        }
                    }

                    if (ElementSourceAliases.Contains(methodCall.Method))
                    {
                        if (methodCall.Arguments.Count == 1 && methodCall.Arguments[0] is IMemberExpressionNode)
                        {
                            var elementSource = (IMemberExpressionNode)methodCall.Arguments[0];
                            return(RelativeSourceExpressionNode.CreateElementSource(elementSource.Member,
                                                                                    BindingExtensions.MergePath(members)));
                        }
                    }
                }
            }
            return(node);
        }
コード例 #8
0
    protected override void DoAction(int action)
    {
        switch (action)
        {
        case 2: // Program -> MainClassDecl, ClassDeclList_Opt
        { CurrentSemanticValue = new ProgramNode((MainClassDeclNode)ValueStack[ValueStack.Depth - 2], (ClassDeclListNode)ValueStack[ValueStack.Depth - 1], LineNumber); Analysis.AST = (ProgramNode)CurrentSemanticValue; }
        break;

        case 3: // MainClassDecl -> ClassKeyword, Identifier, CurlyBracketOpen, PublicKeyword,
                //                  StaticKeyword, VoidKeyword, MainKeyword, RoundBracketOpen,
                //                  StringKeyword, SquareBracketOpen, SquareBracketClose,
                //                  Identifier, RoundBracketClose, CurlyBracketOpen, Statement,
                //                  CurlyBracketClose, CurlyBracketClose
        { CurrentSemanticValue = new MainClassDeclNode((IdentifierNode)ValueStack[ValueStack.Depth - 16], (IdentifierNode)ValueStack[ValueStack.Depth - 6], (StatementNode)ValueStack[ValueStack.Depth - 3], LineNumber); }
        break;

        case 4: // ClassDeclList_Opt -> ClassDeclList_Opt, ClassDecl
        { ((ClassDeclListNode)ValueStack[ValueStack.Depth - 2]).AddClassDecl((ClassDeclNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; }
        break;

        case 5: // ClassDeclList_Opt -> /* empty */
        { CurrentSemanticValue = new ClassDeclListNode(LineNumber); }
        break;

        case 6: // ClassDecl -> ClassKeyword, Identifier, Extends_Opt, CurlyBracketOpen,
                //              VariableDeclList_Opt, MethodDeclList_Opt, CurlyBracketClose
        { CurrentSemanticValue = new ClassDeclNode((IdentifierNode)ValueStack[ValueStack.Depth - 6], (ExtendsNode)ValueStack[ValueStack.Depth - 5], (VariableDeclListNode)ValueStack[ValueStack.Depth - 3], (MethodDeclListNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 7: // Extends_Opt -> ExtendsKeyword, Identifier
        { CurrentSemanticValue = new ExtendsNode((IdentifierNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 9: // MethodDeclList_Opt -> MethodDeclList_Opt, MethodDecl
        { ((MethodDeclListNode)ValueStack[ValueStack.Depth - 2]).AddMethodDecl((MethodDeclNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; }
        break;

        case 10: // MethodDeclList_Opt -> /* empty */
        { CurrentSemanticValue = new MethodDeclListNode(LineNumber); }
        break;

        case 11: // MethodDecl -> PublicKeyword, Type, Identifier, RoundBracketOpen,
                 //               ParamDeclList_Opt, RoundBracketClose, CurlyBracketOpen,
                 //               VariableDeclList_Opt, StatementListEndingInReturn,
                 //               CurlyBracketClose
        { ((StatementListNode)ValueStack[ValueStack.Depth - 2]).statementList.Reverse(); CurrentSemanticValue = new MethodDeclNode((TypeNode)ValueStack[ValueStack.Depth - 9], (IdentifierNode)ValueStack[ValueStack.Depth - 8], (ParamDeclListNode)ValueStack[ValueStack.Depth - 6], (VariableDeclListNode)ValueStack[ValueStack.Depth - 3], (StatementListNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 12: // VariableDeclList_Opt -> VariableDeclList_Opt, VariableDecl
        { ((VariableDeclListNode)ValueStack[ValueStack.Depth - 2]).AddVariableDecl((VariableDeclNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; }
        break;

        case 13: // VariableDeclList_Opt -> /* empty */
        { CurrentSemanticValue = new VariableDeclListNode(LineNumber); }
        break;

        case 14: // VariableDecl -> Type, Identifier, SemiColon
        { CurrentSemanticValue = new VariableDeclNode((TypeNode)ValueStack[ValueStack.Depth - 3], (IdentifierNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 15: // StatementListEndingInReturn -> Statement, StatementListEndingInReturn
        { ((StatementListNode)ValueStack[ValueStack.Depth - 1]).AddStatement((StatementNode)ValueStack[ValueStack.Depth - 2]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; }
        break;

        case 16: // StatementListEndingInReturn -> ReturnKeyword, Expr, SemiColon
        { CurrentSemanticValue = new StatementListNode(LineNumber); ((StatementListNode)CurrentSemanticValue).AddStatement(new ReturnStatementNode((ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber)); }
        break;

        case 17: // ParamDeclList_Opt -> Type, Identifier, ParamDeclListRest_Opt
        { ((ParamDeclListNode)ValueStack[ValueStack.Depth - 1]).paramDeclList.Reverse(); ((ParamDeclListNode)ValueStack[ValueStack.Depth - 1]).AddParamDecl(new ParamDeclNode((TypeNode)ValueStack[ValueStack.Depth - 3], (IdentifierNode)ValueStack[ValueStack.Depth - 2], LineNumber)); ((ParamDeclListNode)ValueStack[ValueStack.Depth - 1]).paramDeclList.Reverse(); CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; }
        break;

        case 19: // ParamDeclListRest_Opt -> ParamDeclListRest_Opt, Comma, Type, Identifier
        { ((ParamDeclListNode)ValueStack[ValueStack.Depth - 4]).AddParamDecl(new ParamDeclNode((TypeNode)ValueStack[ValueStack.Depth - 2], (IdentifierNode)ValueStack[ValueStack.Depth - 1], LineNumber)); CurrentSemanticValue = ValueStack[ValueStack.Depth - 4]; }
        break;

        case 20: // ParamDeclListRest_Opt -> /* empty */
        { CurrentSemanticValue = new ParamDeclListNode(LineNumber); }
        break;

        case 21: // Type -> IntKeyword, SquareBracketOpen, SquareBracketClose
        { CurrentSemanticValue = new IntegerArrayTypeNode(LineNumber); }
        break;

        case 22: // Type -> IntKeyword
        { CurrentSemanticValue = new IntegerTypeNode(LineNumber); }
        break;

        case 23: // Type -> BooleanKeyword
        { CurrentSemanticValue = new BooleanTypeNode(LineNumber); }
        break;

        case 24: // Type -> Identifier
        { CurrentSemanticValue = new IdentifierTypeNode(((IdentifierNode)ValueStack[ValueStack.Depth - 1]).name, LineNumber); }
        break;

        case 25: // Statement -> CurlyBracketOpen, StatementList_Opt, CurlyBracketClose
        { CurrentSemanticValue = new StatementBlockNode((StatementListNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 26: // Statement -> IfKeyword, RoundBracketOpen, Expr, RoundBracketClose, Statement,
                 //              ElseKeyword, Statement
        { CurrentSemanticValue = new IfStatementNode((ExpressionNode)ValueStack[ValueStack.Depth - 5], (StatementNode)ValueStack[ValueStack.Depth - 3], (StatementNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 27: // Statement -> WhileKeyword, RoundBracketOpen, Expr, RoundBracketClose, Statement
        { CurrentSemanticValue = new WhileStatementNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (StatementNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 28: // Statement -> SystemOutPrintLnKeyword, RoundBracketOpen, Expr, RoundBracketClose,
                 //              SemiColon
        { CurrentSemanticValue = new SystemOutPrintLnStatementNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], LineNumber); }
        break;

        case 29: // Statement -> Identifier, EqualsOperator, Expr, SemiColon
        { CurrentSemanticValue = new AssignmentStatementNode((IdentifierNode)ValueStack[ValueStack.Depth - 4], (ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 30: // Statement -> Identifier, Dot, Identifier, EqualsOperator, Expr, SemiColon
        { CurrentSemanticValue = new FieldAssignmentStatementNode((IdentifierNode)ValueStack[ValueStack.Depth - 6], (IdentifierNode)ValueStack[ValueStack.Depth - 4], (ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 31: // Statement -> Identifier, SquareBracketOpen, Expr, SquareBracketClose,
                 //              EqualsOperator, Expr, SemiColon
        { CurrentSemanticValue = new ArrayAssignmentStatementNode((IdentifierNode)ValueStack[ValueStack.Depth - 7], (ExpressionNode)ValueStack[ValueStack.Depth - 5], (ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 32: // Statement -> error, SemiColon
        { CurrentSemanticValue = new StatementBlockNode(new StatementListNode(LineNumber), LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 33: // Statement -> error, CurlyBracketClose
        { CurrentSemanticValue = new StatementBlockNode(new StatementListNode(LineNumber), LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 34: // StatementList_Opt -> StatementList_Opt, Statement
        { ((StatementListNode)ValueStack[ValueStack.Depth - 2]).AddStatement((StatementNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; }
        break;

        case 35: // StatementList_Opt -> /* empty */
        { CurrentSemanticValue = new StatementListNode(LineNumber); }
        break;

        case 36: // Expr -> RoundBracketOpen, Expr, RoundBracketClose
        { CurrentSemanticValue = ValueStack[ValueStack.Depth - 2]; }
        break;

        case 37: // Expr -> NotOperator, Expr
        { CurrentSemanticValue = new NotExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 38: // Expr -> NewKeyword, IntKeyword, SquareBracketOpen, Expr, SquareBracketClose
        { CurrentSemanticValue = new NewIntegerArrayExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 39: // Expr -> NewKeyword, Identifier, RoundBracketOpen, RoundBracketClose
        { CurrentSemanticValue = new NewObjectExpressionNode((IdentifierNode)ValueStack[ValueStack.Depth - 3], LineNumber); }
        break;

        case 40: // Expr -> Expr, AndAndOperator, Expr
        { CurrentSemanticValue = new AndExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 41: // Expr -> Expr, LessThanOperator, Expr
        { CurrentSemanticValue = new LessThanExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 42: // Expr -> Expr, AddOperator, Expr
        { CurrentSemanticValue = new AddExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 43: // Expr -> Expr, SubtractOperator, Expr
        { CurrentSemanticValue = new SubtractExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 44: // Expr -> Expr, MultiplyOperator, Expr
        { CurrentSemanticValue = new MultiplyExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (ExpressionNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 45: // Expr -> Expr, SquareBracketOpen, Expr, SquareBracketClose
        { CurrentSemanticValue = new ArrayLookupExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 4], (ExpressionNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 46: // Expr -> Expr, Dot, LengthKeyword
        { CurrentSemanticValue = new LengthExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], LineNumber); }
        break;

        case 47: // Expr -> Expr, Dot, Identifier
        { CurrentSemanticValue = new FieldAccessExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 3], (IdentifierNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 48: // Expr -> Expr, Dot, Identifier, RoundBracketOpen, ExprList_Opt,
                 //         RoundBracketClose
        { CurrentSemanticValue = new MethodCallExpressionNode((ExpressionNode)ValueStack[ValueStack.Depth - 6], (IdentifierNode)ValueStack[ValueStack.Depth - 4], (ExpressionListNode)ValueStack[ValueStack.Depth - 2], LineNumber); }
        break;

        case 49: // Expr -> ThisKeyword
        { CurrentSemanticValue = new ThisExpressionNode(LineNumber); }
        break;

        case 50: // Expr -> Identifier
        { CurrentSemanticValue = new IdentifierExpressionNode((IdentifierNode)ValueStack[ValueStack.Depth - 1], LineNumber); }
        break;

        case 51: // Expr -> IntegerConstant
        { CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; }
        break;

        case 52: // Expr -> TrueKeyword
        { CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; }
        break;

        case 53: // Expr -> FalseKeyword
        { CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; }
        break;

        case 54: // Expr -> error, IntegerConstant
        { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 55: // Expr -> error, TrueKeyword
        { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 56: // Expr -> error, FalseKeyword
        { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 57: // Expr -> error, Identifier
        { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 58: // Expr -> error, ThisKeyword
        { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 59: // Expr -> error, SquareBracketClose
        { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 60: // Expr -> error, RoundBracketClose
        { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 61: // Expr -> error, LengthKeyword
        { CurrentSemanticValue = new InvalidExpressionNode(LineNumber); yyclearin(); Analysis.LogSyntaxError("Syntax error", LineNumber); }
        break;

        case 62: // ExprList_Opt -> Expr, ExprListRest_Opt
        { ((ExpressionListNode)ValueStack[ValueStack.Depth - 1]).expressionList.Reverse(); ((ExpressionListNode)ValueStack[ValueStack.Depth - 1]).AddExpression((ExpressionNode)ValueStack[ValueStack.Depth - 2]); ((ExpressionListNode)ValueStack[ValueStack.Depth - 1]).expressionList.Reverse(); CurrentSemanticValue = ValueStack[ValueStack.Depth - 1]; }
        break;

        case 63: // ExprList_Opt -> /* empty */
        { new ExpressionListNode(LineNumber); }
        break;

        case 64: // ExprListRest_Opt -> ExprListRest_Opt, Comma, Expr
        { ((ExpressionListNode)ValueStack[ValueStack.Depth - 3]).AddExpression((ExpressionNode)ValueStack[ValueStack.Depth - 1]); CurrentSemanticValue = ValueStack[ValueStack.Depth - 3]; }
        break;

        case 65: // ExprListRest_Opt -> /* empty */
        { CurrentSemanticValue = new ExpressionListNode(LineNumber); }
        break;
        }
    }