@@ -27,30 +27,26 @@ To get information about transition states and such, run
27
27
{-# LANGUAGE OverloadedStrings, OverloadedLists, PartialTypeSignatures #-}
28
28
29
29
module Language.Rust .Parser .Internal (
30
- -- * Complete parsers
30
+ -- * Parsers
31
31
parseLit, parseAttr, parseTy, parsePat, parseStmt, parseExpr, parseItem, parseSourceFile,
32
32
parseBlock, parseImplItem, parseTraitItem, parseTt, parseTokenStream, parseTyParam,
33
33
parseGenerics, parseWhereClause, parseLifetimeDef,
34
-
35
- -- * Partial parsers
36
- parseLitP, parseAttrP, parseTyP, parsePatP, parseStmtP, parseExprP, parseItemP, parseSourceFileP,
37
- parseBlockP, parseImplItemP, parseTraitItemP, parseTtP, parseTokenStreamP, parseTyParamP,
38
- parseGenericsP, parseWhereClauseP, parseLifetimeDefP
39
34
) where
40
35
41
36
import Language.Rust .Syntax
42
37
import Language.Rust .Data .Position
43
- import Language.Rust .Parser .Lexer ( lexNonSpace, lexShebangLine)
44
- import Language.Rust .Parser .ParseMonad (pushToken, getPosition, P, parseError)
45
- import Language.Rust .Parser .Literals ( translateLit)
38
+ import Language.Rust .Parser .Lexer ( lexNonSpace, lexShebangLine )
39
+ import Language.Rust .Parser .ParseMonad ( pushToken, getPosition, P, parseError )
40
+ import Language.Rust .Parser .Literals ( translateLit )
46
41
import Language.Rust .Parser .Reversed
47
42
48
- import Data.Foldable (toList)
49
- import Data.List ((\\), isSubsequenceOf)
50
- import Data.List .NonEmpty (NonEmpty (..), (<|))
43
+ import Data.Foldable ( toList )
44
+ import Data.List ( (\\), isSubsequenceOf )
45
+ import Text.Read ( readMaybe )
46
+ import Data.Semigroup ( (<>) )
47
+
48
+ import Data.List .NonEmpty ( NonEmpty (..), (<|) )
51
49
import qualified Data.List .NonEmpty as N
52
- import Data.Semigroup ((<>))
53
- import Text.Read (readMaybe)
54
50
}
55
51
56
52
-- in order to document the parsers, we have to alias them
@@ -63,7 +59,7 @@ import Text.Read (readMaybe)
63
59
%name parseItem mod_item
64
60
%name parseSourceFileContents source_file
65
61
%name parseBlock export_block
66
- %name parseImplItem impl_item
62
+ %name parseImplItem impl_item
67
63
%name parseTraitItem trait_item
68
64
%name parseTt token_tree
69
65
%name parseTokenStream token_stream
@@ -72,26 +68,6 @@ import Text.Read (readMaybe)
72
68
%name parseWhereClause where_clause
73
69
%name parseGenerics generics
74
70
75
- -- we also document the partial parsers
76
- %partial parseLitP lit
77
- %partial parseAttrP export_attribute
78
- %partial parseTyP export_ty
79
- %partial parsePatP pat
80
- %partial parseStmtP stmt
81
- %partial parseExprP expr
82
- %partial parseItemP mod_item
83
- %partial parseSourceFileContentsP source_file
84
- %partial parseBlockP export_block
85
- %partial parseImplItemP impl_item
86
- %partial parseTraitItemP trait_item
87
- %partial parseTtP token_tree
88
- %partial parseTokenStreamP token_stream
89
- %partial parseTyParamP ty_param
90
- %partial parseLifetimeDefP lifetime_def
91
- %partial parseWhereClauseP where_clause
92
- %partial parseGenericsP generics
93
-
94
-
95
71
%tokentype { Spanned Token }
96
72
%lexer { lexNonSpace >>= } { Spanned Eof _ }
97
73
%monad { P } { >>= } { return }
@@ -340,22 +316,22 @@ ident :: { Spanned Ident }
340
316
-- lexers to discard what would have been the troublesome ' >>' , ' >=' , or ' >>=' token.
341
317
gt :: { () }
342
318
: {- empty -} {%% \(Spanned tok s) ->
343
- let s' = nudge 1 0 s; s' ' = nudge 0 (-1) s
344
- in case tok of
345
- GreaterGreater -> pushToken (Spanned Greater s' ) *> pushToken (Spanned Greater s' ' )
346
- GreaterEqual -> pushToken (Spanned Equal s' ) *> pushToken (Spanned Greater s' ' )
347
- GreaterGreaterEqual -> pushToken (Spanned GreaterEqual s' ) *> pushToken (Spanned Greater s' ' )
348
- _ -> pushToken (Spanned tok s)
319
+ let s' = nudge 1 0 s; s' ' = nudge 0 (-1) s in
320
+ case tok of
321
+ GreaterGreater -> pushToken (Spanned Greater s' ) *> pushToken (Spanned Greater s' ' )
322
+ GreaterEqual -> pushToken (Spanned Equal s' ) *> pushToken (Spanned Greater s' ' )
323
+ GreaterGreaterEqual -> pushToken (Spanned GreaterEqual s' ) *> pushToken (Spanned Greater s' ' )
324
+ _ -> pushToken (Spanned tok s)
349
325
}
350
326
351
327
-- This should precede any ' |' token which could be absorbed in a ' ||' token. This works in the same
352
328
-- way as ' gt' .
353
329
pipe :: { () }
354
330
: {- empty -} {%% \(Spanned tok s) ->
355
- let s' = nudge 1 0 s; s' ' = nudge 0 (-1) s
356
- in case tok of
357
- PipePipe -> pushToken (Spanned Pipe s' ) *> pushToken (Spanned Pipe s' ' )
358
- _ -> pushToken (Spanned tok s)
331
+ let s' = nudge 1 0 s; s' ' = nudge 0 (-1) s in
332
+ case tok of
333
+ PipePipe -> pushToken (Spanned Pipe s' ) *> pushToken (Spanned Pipe s' ' )
334
+ _ -> pushToken (Spanned tok s)
359
335
}
360
336
361
337
-------------
@@ -364,13 +340,13 @@ pipe :: { () }
364
340
365
341
-- | One or more occurences of ' p'
366
342
some (p) :: { Reversed NonEmpty _ }
367
- : some(p) p { let Reversed xs = $1 in Reversed ($2 <| xs) }
368
- | p { [$1 ] }
343
+ : some(p) p { let Reversed xs = $1 in Reversed ($2 <| xs) }
344
+ | p { [$1 ] }
369
345
370
346
-- | Zero or more occurences of ' p'
371
- many (p) :: { [_ ] }
372
- : some(p) { toList $1 }
373
- | {- empty -} { [] }
347
+ many (p) :: { [ _ ] }
348
+ : some(p) { toList $1 }
349
+ | {- empty -} { [] }
374
350
375
351
-- | One or more occurences of ' p' , seperated by ' sep'
376
352
sep_by1 (p,sep) :: { Reversed NonEmpty _ }
@@ -379,19 +355,19 @@ sep_by1(p,sep) :: { Reversed NonEmpty _ }
379
355
380
356
-- | Zero or more occurrences of ' p' , separated by ' sep'
381
357
sep_by (p,sep) :: { [ _ ] }
382
- : sep_by1(p,sep) { toList $1 }
383
- | {- empty -} { [] }
358
+ : sep_by1(p,sep) { toList $1 }
359
+ | {- empty -} { [] }
384
360
385
361
-- | One or more occurrences of ' p' , seperated by ' sep' , optionally ending in ' sep'
386
362
sep_by1T (p,sep) :: { Reversed NonEmpty _ }
387
- : sep_by1(p,sep) sep { $1 }
388
- | sep_by1(p,sep) { $1 }
363
+ : sep_by1(p,sep) sep { $1 }
364
+ | sep_by1(p,sep) { $1 }
389
365
390
366
-- | Zero or more occurences of ' p' , seperated by ' sep' , optionally ending in ' sep' (only if there
391
367
-- is at least one ' p' )
392
368
sep_byT (p,sep) :: { [ _ ] }
393
- : sep_by1T(p,sep) { toList $1 }
394
- | {- empty -} { [] }
369
+ : sep_by1T(p,sep) { toList $1 }
370
+ | {- empty -} { [] }
395
371
396
372
397
373
--------------------------
@@ -419,8 +395,8 @@ inner_attribute :: { Attribute Span }
419
395
420
396
-- TODO: for some precedence related reason, using ' some' here doesn' t work
421
397
inner_attrs :: { NonEmpty (Attribute Span) }
422
- : inner_attrs inner_attribute { $1 |> $2 }
423
- | inner_attribute { [$1] }
398
+ : inner_attrs inner_attribute { $1 |> $2 }
399
+ | inner_attribute { [$1] }
424
400
425
401
426
402
--------------
@@ -453,16 +429,16 @@ string :: { Lit Span }
453
429
qual_path(segs) :: { Spanned (QSelf Span, Path Span) }
454
430
: ' <' qual_path_suf(segs) { let Spanned x _ = $2 in Spanned x ($1 # $2) }
455
431
| lt_ty_qual_path as ty_path ' >' ' ::' segs {
456
- let Path g segsTy x = $3
457
- in Spanned (QSelf (unspan $1) (length segsTy), Path g (segsTy <> unspan $6) x) ($1 # $>)
432
+ let Path g segsTy x = $3 in
433
+ Spanned (QSelf (unspan $1) (length segsTy), Path g (segsTy <> unspan $6) x) ($1 # $>)
458
434
}
459
435
460
436
-- Basically a qualified path, but ignoring the very first ' <' token
461
437
qual_path_suf(segs) :: { Spanned (QSelf Span, Path Span) }
462
438
: ty ' >' ' ::' segs { Spanned (QSelf $1 0, Path False (unspan $4) (spanOf $4)) ($1 # $>) }
463
439
| ty as ty_path ' >' ' ::' segs {
464
- let Path g segsTy x = $3
465
- in Spanned (QSelf $1 (length segsTy), Path g (segsTy <> unspan $6) x) ($1 # $>)
440
+ let Path g segsTy x = $3 in
441
+ Spanned (QSelf $1 (length segsTy), Path g (segsTy <> unspan $6) x) ($1 # $>)
466
442
}
467
443
468
444
-- Usually qual_path_suf is for... type paths! This consumes these but with a starting ' <<' token.
@@ -547,8 +523,8 @@ mod_path :: { Path Span }
547
523
| self_or_ident { Path False [(unspan $1 , NoParameters mempty)] (spanOf $1 ) }
548
524
| ' ::' self_or_ident { Path True [(unspan $2 , NoParameters mempty)] ($1 # $>) }
549
525
| mod_path ' ::' ident {
550
- let Path g segs _ = $1
551
- in Path g (segs |> (unspan $3 , NoParameters mempty)) ($1 # $>)
526
+ let Path g segs _ = $1 in
527
+ Path g (segs |> (unspan $3 , NoParameters mempty)) ($1 # $>)
552
528
}
553
529
554
530
-----------
@@ -624,8 +600,8 @@ for_ty_no_plus :: { Ty Span }
624
600
| for_lts extern abi fn fn_decl (arg_general) { BareFn Normal $3 (unspan $1 ) $> ($1 # $>) }
625
601
| for_lts fn fn_decl (arg_general) { BareFn Normal Rust (unspan $1 ) $> ($1 # $>) }
626
602
| for_lts trait_ref {
627
- let poly = PolyTraitRef (unspan $1 ) $2 ($1 # $2 )
628
- in TraitObject [TraitTyParamBound poly None ($1 # $2 )] ($1 # $2 )
603
+ let poly = PolyTraitRef (unspan $1 ) $2 ($1 # $2 ) in
604
+ TraitObject [TraitTyParamBound poly None ($1 # $2 )] ($1 # $2 )
629
605
}
630
606
631
607
impl_ty :: { Ty Span }
@@ -1854,13 +1830,6 @@ parseSourceFile = do
1854
1830
(as,items) <- parseSourceFileContents
1855
1831
pure (SourceFile sh as items)
1856
1832
1857
- -- | Parse a partial source file
1858
- parseSourceFileP :: P (SourceFile Span)
1859
- parseSourceFileP = do
1860
- sh <- lexShebangLine
1861
- (as,items) <- parseSourceFileContentsP
1862
- pure (SourceFile sh as items)
1863
-
1864
1833
-- | Nudge the span endpoints of a ' Span' value
1865
1834
nudge :: Int -> Int -> Span -> Span
1866
1835
nudge leftSide rightSide (Span l r) = Span l' r'
0 commit comments