88mod ast;
99mod diagnostics;
1010mod idempotency;
11- mod keywords;
1211mod lex;
1312mod pratt;
1413mod sexpr;
@@ -135,14 +134,7 @@ impl<'a> Parser<'a> {
135134 }
136135 Token :: NamespaceDirective => {
137136 let namespace = lex. expect_string ( ) ?;
138- let namespace = lex. lex_ident ( namespace. as_ref ( ) , self . arena ) ?;
139- if keywords:: is_reserved_keyword ( namespace) {
140- return Err ( ParsingError :: ReservedNamespace (
141- lex. span ( ) ,
142- namespace. to_string ( ) ,
143- ) ) ;
144- }
145- self . namespace = namespace;
137+ self . namespace = lex. lex_ident ( namespace. as_ref ( ) , self . arena ) ?;
146138 lex. expect_with ( Token :: is_stmnt_end, "expected statement end." . into ( ) ) ?;
147139 }
148140 Token :: ConcurrentDirective => {
@@ -552,13 +544,8 @@ impl<'a> Parser<'a> {
552544
553545 fn parse_delete ( & mut self , lex : & mut Lexer < ' a > ) -> Result < SimpleStatement < ' a > > {
554546 let next = lex. expect_next ( ) ?;
555- let var = match self . get_place ( lex, next) {
556- Ok ( var) => var,
557- Err (
558- err @ ( ParsingError :: ReservedNamespace ( ..)
559- | ParsingError :: ReservedQualifiedLiteral ( ..) ) ,
560- ) => return Err ( err) ,
561- Err ( _) => return Err ( ParsingError :: OperatorExpectsVariable ( lex. span ( ) ) ) ,
547+ let Ok ( var) = self . get_place ( lex, next) else {
548+ return Err ( ParsingError :: OperatorExpectsVariable ( lex. span ( ) ) ) ;
562549 } ;
563550 let index = if lex. consume ( & Token :: OpenBracket ) {
564551 let mut pratt = Pratt :: new ( self , false ) ;
@@ -574,9 +561,7 @@ impl<'a> Parser<'a> {
574561
575562 #[ tracing:: instrument]
576563 fn parse_function ( & mut self , lex : & mut Lexer < ' a > ) -> Result < ( ) > {
577- let name = lex
578- . expect_identifier ( ) ?
579- . try_qualify ( self . namespace , & lex. span ( ) ) ?;
564+ let name = lex. expect_identifier ( ) ?. qualify ( self . namespace ) ;
580565 let args = self . parse_signature ( lex, & name) ?;
581566 lex. consume ( & Token :: Newline ) ;
582567 let body = self . parse_body ( lex) ?;
@@ -601,9 +586,7 @@ impl<'a> Parser<'a> {
601586 }
602587
603588 loop {
604- let name = lex
605- . expect_identifier ( ) ?
606- . try_qualify ( self . namespace , & lex. span ( ) ) ?;
589+ let name = lex. expect_identifier ( ) ?. qualify ( self . namespace ) ;
607590 // Linear search is fine for the numbers we are working with.
608591 if let Some ( arg) = args. iter ( ) . find ( |& a| a == & name) {
609592 return Err ( ParsingError :: DuplicatedArgument (
@@ -675,10 +658,6 @@ impl<'a> Parser<'a> {
675658 Token :: TypedRegex ( _) => Err ( ParsingError :: UnexpectedTypedRegex ( lex. span ( ) ) ) ,
676659 token => match self . get_place ( lex, token) {
677660 Ok ( var) => Ok ( Atom :: Variable ( var) ) ,
678- Err (
679- err @ ( ParsingError :: ReservedNamespace ( ..)
680- | ParsingError :: ReservedQualifiedLiteral ( ..) ) ,
681- ) => Err ( err) ,
682661 Err ( _) => Err ( ParsingError :: UnexpectedToken (
683662 lex. span ( ) ,
684663 "is not valid data." . into ( ) ,
@@ -688,10 +667,10 @@ impl<'a> Parser<'a> {
688667 }
689668
690669 #[ tracing:: instrument]
691- fn get_place ( & self , lex : & mut Lexer < ' a > , token : Token < ' a > ) -> Result < Variable < ' a > > {
670+ fn get_place ( & self , lex : & mut Lexer < ' a > , token : Token < ' a > ) -> Result < Variable < ' a > , Token < ' a > > {
692671 match token {
693672 Token :: Identifier ( a) if !( lex. peek_is ( & Token :: OpenParent ) && lex. is_yuxtaposed ( ) ) => {
694- Ok ( a. try_qualify ( self . namespace , & lex . span ( ) ) ? . into ( ) )
673+ Ok ( a. qualify ( self . namespace ) . into ( ) )
695674 }
696675 Token :: NrVariable => Ok ( Variable :: Nr ) ,
697676 Token :: NfVariable => Ok ( Variable :: Nf ) ,
@@ -708,10 +687,7 @@ impl<'a> Parser<'a> {
708687 Token :: RstartVariable => Ok ( Variable :: Rstart ) ,
709688 Token :: RlengthVariable => Ok ( Variable :: Rlength ) ,
710689 Token :: EnvironVariable => Ok ( Variable :: Environ ) ,
711- tok => Err ( ParsingError :: UnexpectedToken (
712- lex. span ( ) ,
713- format ! ( "{tok:?}" ) ,
714- ) ) ,
690+ tok => Err ( tok) ,
715691 }
716692 }
717693}
@@ -741,35 +717,22 @@ impl Preprocessor {
741717}
742718
743719trait IdentifierExt < ' a > {
744- fn try_qualify ( self , namespace : & ' a str , span : & Span ) -> Result < Identifier < ' a > >
720+ fn qualify ( self , namespace : & ' a str ) -> Identifier < ' a >
745721 where
746722 Self : ' a ;
747723}
748724
749725impl < ' a > IdentifierExt < ' a > for lexer:: Identifier < ' _ > {
750- fn try_qualify ( self , namespace : & ' a str , span : & Span ) -> Result < Identifier < ' a > >
726+ fn qualify ( self , namespace : & ' a str ) -> Identifier < ' a >
751727 where
752728 Self : ' a ,
753729 {
754730 let literal = self . literal ;
755- let namespace = if let Some ( ns) = self . namespace {
756- if keywords:: is_reserved_keyword ( ns) {
757- return Err ( ParsingError :: ReservedNamespace (
758- span. clone ( ) ,
759- ns. to_string ( ) ,
760- ) ) ;
761- }
762- if keywords:: is_reserved_keyword ( literal) {
763- return Err ( ParsingError :: ReservedQualifiedLiteral (
764- span. clone ( ) ,
765- literal. to_string ( ) ,
766- ) ) ;
767- }
768- ns
731+ if let Some ( namespace) = self . namespace {
732+ Identifier { namespace, literal }
769733 } else {
770- namespace
771- } ;
772- Ok ( Identifier { namespace, literal } )
734+ Identifier { namespace, literal }
735+ }
773736 }
774737}
775738
0 commit comments