@@ -178,9 +178,9 @@ impl<'a> Parser<'a> {
178178 Token :: BeginFilePattern => Ok ( Right ( SpecialPattern :: BeginFile ) ) ,
179179 Token :: EndFilePattern => Ok ( Right ( SpecialPattern :: EndFile ) ) ,
180180 _ => {
181- let expr = self . parse_expression ( lex) ?;
181+ let expr = self . parse_expression ( lex, false ) ?;
182182 Ok ( Left ( if lex. consume ( & Token :: Comma ) {
183- let expr_end = self . parse_expression ( lex) ?;
183+ let expr_end = self . parse_expression ( lex, false ) ?;
184184 RulePattern :: Range ( expr, expr_end)
185185 } else {
186186 RulePattern :: Expression ( expr)
@@ -226,7 +226,10 @@ impl<'a> Parser<'a> {
226226 ) -> Option < Result < SimpleStatement < ' a > > > {
227227 let peek = lex. expect_peek ( ) . ok ( ) ?;
228228 if peek. is_expr_start ( ) {
229- Some ( self . parse_expression ( lex) . map ( SimpleStatement :: Expression ) )
229+ Some (
230+ self . parse_expression ( lex, false )
231+ . map ( SimpleStatement :: Expression ) ,
232+ )
230233 } else {
231234 match peek {
232235 token if let Some ( name) = token. maps_to_command ( ) => {
@@ -357,14 +360,14 @@ impl<'a> Parser<'a> {
357360 Token :: Continue => Statement :: Continue ,
358361 Token :: Return => Statement :: Return (
359362 ( !lex. peek_with ( Token :: is_stmnt_or_block_end) )
360- . then ( || self . parse_expression ( lex) )
363+ . then ( || self . parse_expression ( lex, true ) )
361364 . transpose ( ) ?,
362365 ) ,
363366 Token :: Next => Statement :: Next ,
364367 Token :: NextFile => Statement :: NextFile ,
365368 Token :: Exit => Statement :: Exit (
366369 ( !lex. peek_with ( Token :: is_stmnt_or_block_end) )
367- . then ( || self . parse_expression ( lex) )
370+ . then ( || self . parse_expression ( lex, false ) )
368371 . transpose ( ) ?,
369372 ) ,
370373 _ => {
@@ -386,7 +389,7 @@ impl<'a> Parser<'a> {
386389 & Token :: OpenParent ,
387390 ParsingError :: MissingParenthesisInStatement ,
388391 ) ?;
389- let expr = self . parse_expression ( lex) ?;
392+ let expr = self . parse_expression ( lex, false ) ?;
390393 lex. expect (
391394 & Token :: ClosedParent ,
392395 ParsingError :: UnclosedParenthesisInStatement ,
@@ -402,7 +405,7 @@ impl<'a> Parser<'a> {
402405 ) -> Result < Statement < ' a > > {
403406 lex. consume ( & Token :: Newline ) ;
404407 let condition = ( !lex. peek_is ( & Token :: Semicolon ) )
405- . then ( || self . parse_expression ( lex) )
408+ . then ( || self . parse_expression ( lex, false ) )
406409 . transpose ( ) ?;
407410 lex. expect ( & Token :: Semicolon , ParsingError :: InvalidForLoop ) ?;
408411
@@ -469,7 +472,7 @@ impl<'a> Parser<'a> {
469472 fn parse_case ( & mut self , lex : & mut Lexer < ' a > ) -> Result < Atom < ' a > > {
470473 lex. expect ( & Token :: Case , ParsingError :: MissingSwitchBranch ) ?;
471474 let next = lex. expect_next ( ) ?;
472- let value = self . parse_atom ( lex, next) ?;
475+ let value = self . parse_atom ( lex, next, true ) ?;
473476 lex. expect ( & Token :: Colon , ParsingError :: ColonMustFollowCase ) ?;
474477 match value {
475478 Atom :: Variable ( _) => Err ( ParsingError :: InvalidCaseValue ( lex. span ( ) ) ) ,
@@ -506,16 +509,16 @@ impl<'a> Parser<'a> {
506509 return Ok ( arguments) ;
507510 }
508511
509- arguments. push ( self . parse_expression ( lex) ?) ;
512+ arguments. push ( self . parse_expression ( lex, true ) ?) ;
510513 while lex. consume ( & Token :: Comma ) {
511- arguments. push ( self . parse_expression ( lex) ?) ;
514+ arguments. push ( self . parse_expression ( lex, true ) ?) ;
512515 }
513516 Ok ( arguments)
514517 }
515518
516519 fn parse_command_args ( & mut self , lex : & mut Lexer < ' a > ) -> Result < Vec < ' a , Expr < ' a > > > {
517520 let mut arguments = Vec :: new_in ( self . arena ) ;
518- let mut pratt = Pratt :: new ( self ) ;
521+ let mut pratt = Pratt :: new ( self , false ) ;
519522 if !lex. peek_with ( Token :: is_expr_start) {
520523 return Ok ( arguments) ;
521524 }
@@ -537,7 +540,7 @@ impl<'a> Parser<'a> {
537540 lex. next ( ) ;
538541 Ok ( Some ( (
539542 redirection,
540- Pratt :: new ( self ) . parse_redirection ( lex) ?,
543+ Pratt :: new ( self , false ) . parse_redirection ( lex) ?,
541544 ) ) )
542545 } else {
543546 Ok ( None )
@@ -550,7 +553,7 @@ impl<'a> Parser<'a> {
550553 return Err ( ParsingError :: OperatorExpectsVariable ( lex. span ( ) ) ) ;
551554 } ;
552555 let index = if lex. consume ( & Token :: OpenBracket ) {
553- let mut pratt = Pratt :: new ( self ) ;
556+ let mut pratt = Pratt :: new ( self , false ) ;
554557 let first = pratt. parse ( lex) ?;
555558 Some ( pratt. parse_array_index ( lex, first) ?)
556559 } else {
@@ -608,8 +611,8 @@ impl<'a> Parser<'a> {
608611 }
609612
610613 #[ tracing:: instrument]
611- fn parse_expression ( & mut self , lex : & mut Lexer < ' a > ) -> Result < Expr < ' a > > {
612- Pratt :: new ( self ) . parse ( lex)
614+ fn parse_expression ( & mut self , lex : & mut Lexer < ' a > , typed_regex : bool ) -> Result < Expr < ' a > > {
615+ Pratt :: new ( self , typed_regex ) . parse ( lex)
613616 }
614617
615618 #[ tracing:: instrument]
@@ -642,11 +645,18 @@ impl<'a> Parser<'a> {
642645 }
643646
644647 #[ tracing:: instrument]
645- fn parse_atom ( & self , lex : & mut Lexer < ' a > , token : Token < ' a > ) -> Result < Atom < ' a > > {
648+ fn parse_atom (
649+ & self ,
650+ lex : & mut Lexer < ' a > ,
651+ token : Token < ' a > ,
652+ typed_regex : bool ,
653+ ) -> Result < Atom < ' a > > {
646654 match token {
647655 Token :: Number ( n) => Ok ( Atom :: Number ( n) ) ,
648656 Token :: String ( s) => Ok ( Atom :: String ( s) ) ,
649657 Token :: Regex ( r) => Ok ( Atom :: Regex ( r) ) ,
658+ Token :: TypedRegex ( r) if typed_regex => Ok ( Atom :: TypedRegex ( r) ) ,
659+ Token :: TypedRegex ( _) => Err ( ParsingError :: UnexpectedTypedRegex ( lex. span ( ) ) ) ,
650660 token => match self . get_place ( lex, token) {
651661 Some ( var) => Ok ( Atom :: Variable ( var) ) ,
652662 None => Err ( ParsingError :: UnexpectedToken (
0 commit comments