private static void InfixOp(Compiler c, bool allowAssignment) { GrammarRule rule = c.GetRule(c._parser.Previous.Type); // An infix operator cannot end an expression. c.IgnoreNewlines(); // Compile the right-hand side. c.ParsePrecedence(false, rule.Precedence + 1); // Call the operator method on the left-hand side. Signature signature = new Signature { Type = SignatureType.Method, Arity = 1, Name = rule.Name, Length = rule.Name.Length }; c.CallSignature(Instruction.Call0, signature); }
// Subscript or "array indexing" operator like `foo[bar]`. private static void Subscript(Compiler c, bool allowAssignment) { Signature signature = new Signature { Name = "", Length = 0, Type = SignatureType.Subscript, Arity = 0 }; // Parse the argument list. c.FinishArgumentList(signature); c.Consume(TokenType.RightBracket, "Expect ']' after arguments."); if (c.Match(TokenType.Eq)) { if (!allowAssignment) c.Error("Invalid assignment."); signature.Type = SignatureType.SubscriptSetter; // Compile the assigned value. c.ValidateNumParameters(++signature.Arity); c.Expression(); } c.CallSignature(Instruction.Call0, signature); }