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"); }
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); }
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); } } }
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; }
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"); } }
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); }
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; } }