E4220#

Compiler diagnostic name: regex_match_binding_not_supported.

字句ケースで、そのマッチモードでは利用できない束縛が使われています。

StringStringView の入力では、先頭一致の lexmatchbefore=after= の両方をサポートします。最長一致モードは入力の先頭から始まるため、after= はサポートしますが before= はサポートしません。lexscan はどちらの束縛もサポートしません。ストリーミング対象は入力バッファを消費し、メモリ内の @lexbuf.StringScanner は次のスキャン位置を cursor フィールドに保存します。

Erroneous example#

///|
pub fn first_word(input : String) -> StringView {
  lexmatch input with longest {
    (re"^[a-z]+" as word, before=_) => word
    _ => ""
  }
}

Suggestion#

lexscan では before= または after= を削除し、正規表現を ^ でアンカーしてください。lexmatch では before= を削除して正規表現を ^ でアンカーし、マッチしなかった接尾部が必要な場合は after= を使用してください。

///|
pub fn first_word(input : String) -> StringView {
  lexmatch input with longest {
    (re"^[a-z]+" as word, after=_) => word
    _ => ""
  }
}