@@ -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 , parsePartial , parse' , readSourceFile , readTokens , Parse (.. ), P , execParser , initPos , Span ,
27
27
-- * Lexing
28
28
lexToken , lexNonSpace , lexTokens , translateLit ,
29
29
-- * Input stream
@@ -38,7 +38,7 @@ 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 , getPosition )
42
42
43
43
import Data.Typeable (Typeable )
44
44
import Control.Exception (Exception , throw )
@@ -55,6 +55,12 @@ parse' is = case execParser parser is initPos of
55
55
Left (pos, msg) -> throw (ParseFail pos msg)
56
56
Right x -> x
57
57
58
+ -- | Parse something from an input stream (it is assumed the initial position is 'initPos'), return
59
+ -- the position of the longest partial parse, as well as what was parsed
60
+ parsePartial :: Parse a => InputStream -> Either (Position ,String ) (Position ,a )
61
+ parsePartial is = execParser parser' is initPos
62
+ where parser' = flip (,) <$> partialParser <*> getPosition
63
+
58
64
-- | Given a path pointing to a Rust source file, read that file and parse it into a 'SourceFile'
59
65
readSourceFile :: FilePath -> IO (SourceFile Span )
60
66
readSourceFile fileName = parse' <$> readInputStream fileName
@@ -78,23 +84,77 @@ instance Exception ParseFail
78
84
79
85
-- | Describes things that can be parsed
80
86
class Parse a where
87
+ -- | Complete parser (fails if not all of the input is consumed)
81
88
parser :: P a
82
89
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
90
+ -- | Partial parser (doesn't fail if not all the input is consumed)
91
+ partialParser :: P a
92
+
93
+ instance Parse (Lit Span ) where
94
+ parser = parseLit
95
+ partialParser = parseLitP
96
+
97
+ instance Parse (Attribute Span ) where
98
+ parser = parseAttr
99
+ partialParser = parseAttrP
100
+
101
+ instance Parse (Ty Span ) where
102
+ parser = parseTy
103
+ partialParser = parseTyP
104
+
105
+ instance Parse (Pat Span ) where
106
+ parser = parsePat
107
+ partialParser = parsePatP
108
+
109
+ instance Parse (Expr Span ) where
110
+ parser = parseExpr
111
+ partialParser = parseExprP
112
+
113
+ instance Parse (Stmt Span ) where
114
+ parser = parseStmt
115
+ partialParser = parseStmtP
116
+
117
+ instance Parse (Item Span ) where
118
+ parser = parseItem
119
+ partialParser = parseItemP
120
+
121
+ instance Parse (SourceFile Span ) where
122
+ parser = parseSourceFile
123
+ partialParser = parseSourceFileP
124
+
125
+ instance Parse TokenTree where
126
+ parser = parseTt
127
+ partialParser = parseTtP
128
+
129
+ instance Parse TokenStream where
130
+ parser = parseTokenStream
131
+ partialParser = parseTokenStreamP
132
+
133
+ instance Parse (Block Span ) where
134
+ parser = parseBlock
135
+ partialParser = parseBlockP
136
+
137
+ instance Parse (ImplItem Span ) where
138
+ parser = parseImplItem
139
+ partialParser = parseImplItemP
140
+
141
+ instance Parse (TraitItem Span ) where
142
+ parser = parseTraitItem
143
+ partialParser = parseTraitItemP
144
+
145
+ instance Parse (TyParam Span ) where
146
+ parser = parseTyParam
147
+ partialParser = parseTyParamP
148
+
149
+ instance Parse (LifetimeDef Span ) where
150
+ parser = parseLifetimeDef
151
+ partialParser = parseLifetimeDefP
152
+
153
+ instance Parse (Generics Span ) where
154
+ parser = parseGenerics
155
+ partialParser = parseGenericsP
156
+
157
+ instance Parse (WhereClause Span ) where
158
+ parser = parseWhereClause
159
+ partialParser = parseWhereClauseP
100
160
0 commit comments