Skip to content

Commit 22c6686

Browse files
committed
Add Ord to AST, and an option to parse directly from tokens
1 parent 284bd7a commit 22c6686

File tree

6 files changed

+133
-83
lines changed

6 files changed

+133
-83
lines changed

src/Language/Rust/Data/Position.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ data Position = Position {
5454
col :: {-# UNPACK #-} !Int -- ^ column in the source file.
5555
}
5656
| NoPosition
57-
deriving (Eq, Show, Data, Typeable, Generic, NFData)
57+
deriving (Eq, Ord, Show, Data, Typeable, Generic, NFData)
5858

5959
-- | Pretty print a 'Position'
6060
prettyPosition :: Position -> String
@@ -116,7 +116,7 @@ incOffset p@Position{ absoluteOffset = a } offset = p { absoluteOffset = a + off
116116
-- | Spans represent a contiguous region of code, delimited by two 'Position's. The endpoints are
117117
-- inclusive. Analogous to the information encoded in a selection.
118118
data Span = Span { lo, hi :: !Position }
119-
deriving (Eq, Show, Data, Typeable, Generic, NFData)
119+
deriving (Eq, Ord, Show, Data, Typeable, Generic, NFData)
120120

121121
-- | Check if a span is a subset of another span
122122
subsetOf :: Span -> Span -> Bool
@@ -145,7 +145,7 @@ prettySpan (Span lo' hi') = show lo' ++ " - " ++ show hi'
145145

146146
-- | A "tagging" of something with a 'Span' that describes its extent.
147147
data Spanned a = Spanned a {-# UNPACK #-} !Span
148-
deriving (Data, Typeable, Generic, NFData)
148+
deriving (Eq, Ord, Data, Typeable, Generic, NFData)
149149

150150
-- | Extract the wrapped value from 'Spanned'
151151
{-# INLINE unspan #-}

src/Language/Rust/Parser.hs

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ sourceFile :: SourceFile Span
2323

2424
module Language.Rust.Parser (
2525
-- * Parsing
26-
parse, parse', readSourceFile, readTokens, Parse(..), P, execParser, initPos, Span,
26+
parse, parse', readSourceFile, readTokens, Parse(..), P, execParser, execParserTokens, initPos, Span,
2727
-- * Lexing
2828
lexToken, lexNonSpace, lexTokens, translateLit,
2929
-- * Input stream
@@ -38,10 +38,11 @@ import Language.Rust.Data.Position (Position, Span, Spanned, initPos, prettyPosi
3838
import Language.Rust.Parser.Internal
3939
import Language.Rust.Parser.Lexer (lexToken, lexNonSpace, lexTokens, lexicalError)
4040
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)
4242

4343
import Data.Typeable (Typeable)
4444
import Control.Exception (Exception, throw)
45+
import Data.Foldable (traverse_)
4546

4647
-- | Parse something from an input stream (it is assumed the initial position is 'initPos')
4748
parse :: Parse a => InputStream -> Either (Position,String) a
@@ -55,6 +56,12 @@ parse' is = case execParser parser is initPos of
5556
Left (pos, msg) -> throw (ParseFail pos msg)
5657
Right x -> x
5758

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+
5865
-- | Given a path pointing to a Rust source file, read that file and parse it into a 'SourceFile'
5966
readSourceFile :: FilePath -> IO (SourceFile Span)
6067
readSourceFile fileName = parse' <$> readInputStream fileName
@@ -78,23 +85,57 @@ instance Exception ParseFail
7885

7986
-- | Describes things that can be parsed
8087
class Parse a where
88+
-- | Complete parser (fails if not all of the input is consumed)
8189
parser :: P a
8290

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
100141

0 commit comments

Comments
 (0)