]> Git — Sourcephile - haskell/symantic-parser.git/blob - parsers/Parsers/Tiny.hs
add benchmarks
[haskell/symantic-parser.git] / parsers / Parsers / Tiny.hs
1 {-# LANGUAGE NoMonomorphismRestriction #-}
2 {-# LANGUAGE Rank2Types #-}
3 {-# LANGUAGE TemplateHaskell #-}
4 {-# LANGUAGE UnboxedTuples #-}
5 module Parsers.Tiny where
6
7 import Control.Monad (Monad(..))
8 import Data.Char (Char)
9 import Data.Either (Either(..))
10 import Data.Function (($))
11 import Data.Semigroup (Semigroup(..))
12 import Data.String (String, IsString(..))
13 import Data.Text (Text)
14 import Data.Text.IO (readFile)
15 import System.IO (IO, FilePath)
16 import Test.Tasty
17 import Test.Tasty.Golden
18 import Text.Show (Show(..))
19 import qualified Data.ByteString.Lazy as BSL
20 import qualified Data.IORef as IORef
21 import qualified Data.Text.Lazy as TL
22 import qualified Data.Text.Lazy.Encoding as TL
23 import qualified Language.Haskell.TH.Syntax as TH
24
25 import qualified Symantic.Parser as P
26 import qualified Symantic.Parser.Haskell as H
27 --import Golden.Utils
28
29
30 p_Tiny = p_CmdSeq P.<* P.eof -- (!. / %{eof})
31 p_CmdSeq = P.some (p_Cmd p_SEMICOLON{-^cmdSeq-})
32 p_Cmd = p_IfCmd <|> p_RepeatCmd / p_ReadCmd / p_WriteCmd / p_AssignCmd
33
34 -- conditional :: Eq a => [H.Haskell (a -> Bool)] -> [repr b] -> repr a -> repr b -> repr b
35 p_Cmd = P.conditional
36 []
37 [p_IfCmd, p_RepeatCmd, p_ReadCmd, p_WriteCmd, p_AssignCmd]
38
39 empty
40
41 ((\c -> haskell c [||c||]) Prelude.<$> ["", ])
42 (look anyChar) op empty
43
44
45 p_IfCmd = p_IF p_Exp^ifExp p_THEN^ifThen p_CmdSeq^ifThenCmdSeq (p_ELSE p_CmdSeq^ifElseCmdSeq / '') p_END^ifEnd
46 p_RepeatCmd = p_REPEAT p_CmdSeq^repeatCmdSeq p_UNTIL^repeatUntil p_Exp^repeatExp
47 p_AssignCmd = p_NAME p_ASSIGNMENT^assignOp p_Exp^assignExp
48 p_ReadCmd = p_READ p_NAME^readName
49 p_WriteCmd = p_WRITE p_Exp^writeExp
50 p_Exp = p_SimpleExp ((p_LESS / p_EQUAL) p_SimpleExp^simpleExp / '')
51 p_SimpleExp = p_Term ((p_ADD / p_SUB) p_Term^term)*
52 p_Term = p_Factor ((p_MUL / p_DIV) p_Factor^factor)*
53 p_Factor = p_OPENPAR p_Exp^openParExp p_CLOSEPAR^closePar / p_NUMBER / p_NAME
54 p_ADD = lex "+"
55 p_ASSIGNMENT = lex ":="
56 p_CLOSEPAR = lex ")"
57 p_DIV = lex "/"
58 p_IF = lex "if"
59 p_ELSE = lex "else"
60 p_END = lex "end"
61 p_EQUAL = lex "="
62 p_LESS = lex "<"
63 p_MUL = lex "*"
64 p_NAME = !p_RESERVED lex (some (oneOf ['a' .. 'z']))
65 p_NUMBER = lex (some (oneOf ['0' .. '9']))
66 p_OPENPAR = lex "("
67 p_READ = lex "read"
68 p_REPEAT = lex "repeat"
69 p_SEMICOLON = lex ";"
70 p_SUB = lex "-"
71 p_THEN = lex "then"
72 p_UNTIL = lex "until"
73 p_WRITE = lex "write"
74 p_RESERVED = (p_IF / p_ELSE / p_END / p_READ / p_REPEAT / p_THEN / p_UNTIL / p_WRITE) ![a-z]+
75 p_Sp = (" " P.<|> "\n")*
76 lex = (p_Sp *>)