Lezer Grammer Problem

This is my grammer

Why ‘{{ }}’ will match Token (Text) instead of (OpenTag, CloseTag)

@top Program { expression* }

expression {
  Text | 
  OpenTag |
  CloseTag
}

@tokens {
  Text { char+ }

  OpenTag { "{{" }
  
  CloseTag { "}}" }

  whitespace { std.whitespace++ }

  char { $[\u{20}-\u{10ffff}] }
  
  @precedence { OpenTag, CloseTag, Text }
}

Because any stretch of characters not starting with {{ or }} will be parsed as Text.