-
Notifications
You must be signed in to change notification settings - Fork 17
/
ParseFile.purs
69 lines (62 loc) · 2.23 KB
/
ParseFile.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
module ParseFile where
import Prelude
import Data.Array (foldMap)
import Data.Array as Array
import Data.Either (Either(..))
import Data.Foldable (elem, for_)
import Data.Maybe (Maybe(..))
import Effect (Effect)
import Effect.Aff (launchAff_)
import Effect.Class (liftEffect)
import Effect.Class.Console as Console
import Node.Buffer as Buffer
import Node.Encoding (Encoding(..))
import Node.FS.Aff (readFile)
import Node.Process as Process
import PureScript.CST (RecoveredParserResult(..), parseModule)
import PureScript.CST.Errors (ParseError, printParseError)
import PureScript.CST.Lexer (lex)
import PureScript.CST.Parser.Monad (PositionedError)
import PureScript.CST.Print (TokenOption(..), printSourceTokenWithOption)
import PureScript.CST.TokenStream (TokenStep(..), TokenStream, step)
import PureScript.CST.Types (SourceToken)
main :: Effect Unit
main = launchAff_ do
args <- Array.drop 1 <$> liftEffect Process.argv
let printTokens = (elem "--tokens" || elem "-t") args
case Array.head args of
Just fileName -> do
contents <- liftEffect <<< Buffer.toString UTF8 =<< readFile fileName
if printTokens then do
let
tokens =
map (foldMap (printSourceTokenWithOption ShowLayout))
$ tokenStreamToArray
$ lex contents
for_ tokens Console.log
else
mempty
case parseModule contents of
ParseSucceeded _ -> do
Console.log "Parse succeeded."
ParseSucceededWithErrors _ errs -> do
Console.log "Parse succeeded with errors."
for_ errs $ Console.error <<< printPositionedError
ParseFailed err -> do
Console.log "Parse failed."
Console.error $ printPositionedError err
Nothing ->
Console.log "File path required"
printPositionedError :: PositionedError -> String
printPositionedError { error, position } =
"[" <> show (position.line + 1) <> ":" <> show (position.column + 1) <> "] " <> printParseError error
tokenStreamToArray :: TokenStream -> Either ParseError (Array SourceToken)
tokenStreamToArray = go []
where
go acc = step >>> case _ of
TokenEOF _ _ ->
Right acc
TokenError _ err _ _ ->
Left err
TokenCons tok _ next _ ->
go (Array.snoc acc tok) next