expressionWithAssignment function
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');
}