@@ -23,7 +23,7 @@ sourceFile :: SourceFile Span
23
23
24
24
module Language.Rust.Parser (
25
25
-- * Parsing
26
- parse , parse' , readSourceFile , readTokens , Parse (.. ), P , execParser , initPos , Span ,
26
+ parse , parse' , readSourceFile , readTokens , Parse (.. ), P , execParser , execParserTokens , initPos , Span ,
27
27
-- * Lexing
28
28
lexToken , lexNonSpace , lexTokens , translateLit ,
29
29
-- * Input stream
@@ -38,10 +38,11 @@ import Language.Rust.Data.Position (Position, Span, Spanned, initPos, prettyPosi
38
38
import Language.Rust.Parser.Internal
39
39
import Language.Rust.Parser.Lexer (lexToken , lexNonSpace , lexTokens , lexicalError )
40
40
import Language.Rust.Parser.Literals (translateLit )
41
- import Language.Rust.Parser.ParseMonad (P , execParser , parseError )
41
+ import Language.Rust.Parser.ParseMonad (P , execParser , parseError , pushToken )
42
42
43
43
import Data.Typeable (Typeable )
44
44
import Control.Exception (Exception , throw )
45
+ import Data.Foldable (traverse_ )
45
46
46
47
-- | Parse something from an input stream (it is assumed the initial position is 'initPos')
47
48
parse :: Parse a => InputStream -> Either (Position ,String ) a
@@ -55,6 +56,12 @@ parse' is = case execParser parser is initPos of
55
56
Left (pos, msg) -> throw (ParseFail pos msg)
56
57
Right x -> x
57
58
59
+
60
+ execParserTokens :: P a -> [Spanned Token ] -> Position -> Either (Position ,String ) a
61
+ execParserTokens p toks pos = execParser (pushTokens toks *> p) (inputStreamFromString " " ) pos
62
+ where pushTokens = traverse_ pushToken . reverse
63
+
64
+
58
65
-- | Given a path pointing to a Rust source file, read that file and parse it into a 'SourceFile'
59
66
readSourceFile :: FilePath -> IO (SourceFile Span )
60
67
readSourceFile fileName = parse' <$> readInputStream fileName
@@ -78,23 +85,57 @@ instance Exception ParseFail
78
85
79
86
-- | Describes things that can be parsed
80
87
class Parse a where
88
+ -- | Complete parser (fails if not all of the input is consumed)
81
89
parser :: P a
82
90
83
- instance Parse (Lit Span ) where parser = parseLit
84
- instance Parse (Attribute Span ) where parser = parseAttr
85
- instance Parse (Ty Span ) where parser = parseTy
86
- instance Parse (Pat Span ) where parser = parsePat
87
- instance Parse (Expr Span ) where parser = parseExpr
88
- instance Parse (Stmt Span ) where parser = parseStmt
89
- instance Parse (Item Span ) where parser = parseItem
90
- instance Parse (SourceFile Span ) where parser = parseSourceFile
91
- instance Parse TokenTree where parser = parseTt
92
- instance Parse TokenStream where parser = parseTokenStream
93
- instance Parse (Block Span ) where parser = parseBlock
94
- instance Parse (ImplItem Span ) where parser = parseImplItem
95
- instance Parse (TraitItem Span ) where parser = parseTraitItem
96
- instance Parse (TyParam Span ) where parser = parseTyParam
97
- instance Parse (LifetimeDef Span ) where parser = parseLifetimeDef
98
- instance Parse (Generics Span ) where parser = parseGenerics
99
- instance Parse (WhereClause Span ) where parser = parseWhereClause
91
+ instance Parse (Lit Span ) where
92
+ parser = parseLit
93
+
94
+ instance Parse (Attribute Span ) where
95
+ parser = parseAttr
96
+
97
+ instance Parse (Ty Span ) where
98
+ parser = parseTy
99
+
100
+ instance Parse (Pat Span ) where
101
+ parser = parsePat
102
+
103
+ instance Parse (Expr Span ) where
104
+ parser = parseExpr
105
+
106
+ instance Parse (Stmt Span ) where
107
+ parser = parseStmt
108
+
109
+ instance Parse (Item Span ) where
110
+ parser = parseItem
111
+
112
+ instance Parse (SourceFile Span ) where
113
+ parser = parseSourceFile
114
+
115
+ instance Parse TokenTree where
116
+ parser = parseTt
117
+
118
+ instance Parse TokenStream where
119
+ parser = parseTokenStream
120
+
121
+ instance Parse (Block Span ) where
122
+ parser = parseBlock
123
+
124
+ instance Parse (ImplItem Span ) where
125
+ parser = parseImplItem
126
+
127
+ instance Parse (TraitItem Span ) where
128
+ parser = parseTraitItem
129
+
130
+ instance Parse (TyParam Span ) where
131
+ parser = parseTyParam
132
+
133
+ instance Parse (LifetimeDef Span ) where
134
+ parser = parseLifetimeDef
135
+
136
+ instance Parse (Generics Span ) where
137
+ parser = parseGenerics
138
+
139
+ instance Parse (WhereClause Span ) where
140
+ parser = parseWhereClause
100
141
0 commit comments