@@ -517,8 +517,9 @@ We use these items in macro parser:
517
517
are about to ask the MBE parser to parse. We will consume the raw stream of
518
518
tokens and output a binding of metavariables to corresponding token trees.
519
519
The parsing session can be used to report parser errors.
520
- - a ` matcher ` variable is a sequence of [ ` MatcherLoc ` ] s that we want to match
521
- the token stream against. They're converted from token trees before matching.
520
+ - a ` matcher ` variable is a sequence of [ ` MatcherLoc ` ] s that we want to match the token stream
521
+ against. They're converted from the original token trees in the macro's definition before
522
+ matching.
522
523
523
524
[ `MatcherLoc` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/mbe/macro_parser/enum.MatcherLoc.html
524
525
@@ -544,41 +545,26 @@ The full interface is defined [here][code_parse_int].
544
545
The macro parser does pretty much exactly the same as a normal regex parser
545
546
with one exception: in order to parse different types of metavariables, such as
546
547
` ident ` , ` block ` , ` expr ` , etc., the macro parser must call back to the normal
547
- Rust parser. Both the definition and invocation of macros are parsed using
548
- the parser in a process which is non-intuitively self-referential.
549
-
550
- The code to parse macro _ definitions_ is in
551
- [ ` compiler/rustc_expand/src/mbe/macro_rules.rs ` ] [ code_mr ] . It defines the
552
- pattern for matching a macro definition as ` $( $lhs:tt => $rhs:tt );+ ` . In
553
- other words, a ` macro_rules ` definition should have in its body at least one
554
- occurrence of a token tree followed by ` => ` followed by another token tree.
555
- When the compiler comes to a ` macro_rules ` definition, it uses this pattern to
556
- match the two token trees per the rules of the definition of the macro, _ thereby
557
- utilizing the macro parser itself_ . In our example definition, the
558
- metavariable ` $lhs ` would match the patterns of both arms: `(print
559
- $mvar: ident )` and ` (print twice $mvar: ident )` . And ` $rhs` would match the
560
- bodies of both arms: ` { println!("{}", $mvar); } ` and `{ println!("{}", $mvar);
561
- println!("{}", $mvar); }`. The parser keeps this knowledge around for when it
562
- needs to expand a macro invocation.
563
-
564
- When the compiler comes to a macro invocation, it parses that invocation using
565
- a NFA-based macro parser described above. However, the matcher variable
566
- used is the first token tree (` $lhs ` ) extracted from the arms of the macro
567
- _ definition_ . Using our example, we would try to match the token stream `print
568
- foo` from the invocation against the matchers ` print $mvar: ident ` and ` print
569
- twice $mvar: ident ` that we previously extracted from the definition. The
570
- algorithm is exactly the same, but when the macro parser comes to a place in the
571
- current matcher where it needs to match a _ non-terminal_ (e.g. ` $mvar:ident ` ),
572
- it calls back to the normal Rust parser to get the contents of that
573
- non-terminal. In this case, the Rust parser would look for an ` ident ` token,
574
- which it finds (` foo ` ) and returns to the macro parser. Then, the macro parser
575
- proceeds in parsing as normal. Also, note that exactly one of the matchers from
576
- the various arms should match the invocation; if there is more than one match,
577
- the parse is ambiguous, while if there are no matches at all, there is a syntax
548
+ Rust parser.
549
+
550
+ The code to parse macro definitions is in [ ` compiler/rustc_expand/src/mbe/macro_rules.rs ` ] [ code_mr ] .
551
+ For more information about the macro parser's implementation, see the comments in
552
+ [ ` compiler/rustc_expand/src/mbe/macro_parser.rs ` ] [ code_mp ] .
553
+
554
+ Using our example, we would try to match the token stream ` print foo ` from the invocation against
555
+ the matchers ` print $mvar:ident ` and ` print twice $mvar:ident ` that we previously extracted from the
556
+ rules in the macro definition. When the macro parser comes to a place in the current matcher where
557
+ it needs to match a _ non-terminal_ (e.g. ` $mvar:ident ` ), it calls back to the normal Rust parser to
558
+ get the contents of that non-terminal. In this case, the Rust parser would look for an ` ident `
559
+ token, which it finds (` foo ` ) and returns to the macro parser. Then, the macro parser continues
560
+ parsing.
561
+
562
+ Note that exactly one of the matchers from the various rules should match the invocation; if there is
563
+ more than one match, the parse is ambiguous, while if there are no matches at all, there is a syntax
578
564
error.
579
565
580
- For more information about the macro parser's implementation, see the comments
581
- in [ ` compiler/rustc_expand/src/mbe/macro_parser.rs ` ] [ code_mp ] .
566
+ Assuming exactly one rule matches, macro expansion will then * transcribe * the right-hand side of the
567
+ rule, substituting the values of any matches it captured when matching against the left-hand side .
582
568
583
569
## Procedural Macros
584
570
0 commit comments