expressionWithAssignment function

Parser expressionWithAssignment()

Top-level expression handling assignment and named arguments. These are special because they require an identifier on the left.

Optimized with cheap pattern-based lookahead:

  • Uses pattern matching instead of full identifier parsing in lookahead
  • Only parses identifier once when actually needed
  • Pattern: a-zA-Z0-9_-* followed by whitespace* and = or :

Implementation

Parser expressionWithAssignment() {
  // Cheap pattern-based lookahead using character patterns instead of full identifier parsing
  // This avoids parsing the identifier 3 times (once per lookahead + once for actual parse)
  final identPattern = pattern('a-zA-Z') & pattern('a-zA-Z0-9_-').star();

  // Check for = after identifier pattern (doesn't consume, just peeks)
  final assignmentLookahead = (identPattern & whitespace().star() & char('='))
      .and();

  // Check for : after identifier pattern (doesn't consume, just peeks)
  final namedArgLookahead = (identPattern & whitespace().star() & char(':'))
      .and();

  return (
      // Only try assignment if lookahead matches
      (assignmentLookahead & ref0(assignmentExpr)).pick(1) |
          // Only try named arg if lookahead matches
          (namedArgLookahead & ref0(namedArgExpr)).pick(1) |
          // Otherwise, parse as logical expression
          ref0(logicalExpr))
      .labeled('expressionWithAssignment');
}