summaryrefslogtreecommitdiff
path: root/app/Parser.hs
diff options
context:
space:
mode:
authorMirek Kratochvil <exa.exa@gmail.com>2022-10-16 21:49:59 +0200
committerMirek Kratochvil <exa.exa@gmail.com>2022-10-16 21:49:59 +0200
commit865d63a103d119e51a4fba3a0d185ff1c6394176 (patch)
treec9156491488db6985e370e4d080c2ac6504aae61 /app/Parser.hs
parentcbd6aa4021f744be7301e9d5b6fce2c6c98c46ae (diff)
downloadprlg-865d63a103d119e51a4fba3a0d185ff1c6394176.tar.gz
prlg-865d63a103d119e51a4fba3a0d185ff1c6394176.tar.bz2
some small stuff
Diffstat (limited to 'app/Parser.hs')
-rw-r--r--app/Parser.hs73
1 files changed, 73 insertions, 0 deletions
diff --git a/app/Parser.hs b/app/Parser.hs
new file mode 100644
index 0000000..d43dce2
--- /dev/null
+++ b/app/Parser.hs
@@ -0,0 +1,73 @@
+module Parser where
+
+import Control.Applicative (liftA2)
+import Data.Char
+import Data.Void
+import Text.Megaparsec
+import Text.Megaparsec.Char
+
+data AST
+ = Call String [AST]
+ | Seq [AST]
+ | List [AST] (Maybe AST)
+ | Literal String
+ deriving (Show)
+
+specialOp = (`elem` ",;|")
+
+specialChar = (`elem` "()[]")
+
+specialName = (`elem` "_")
+
+specialUnused = (`elem` "\'%")
+
+type Lexer = Parsec Void String
+
+data Lexeme
+ = Blank String
+ | Tok String
+ | QTok String String -- unquoted quoted
+ | Cmt String
+ deriving (Show)
+
+blank :: Lexer Lexeme
+blank = Blank <$> some (satisfy isSpace)
+
+tok :: Lexer Lexeme
+tok =
+ Tok <$>
+ choice
+ [ pure <$> satisfy specialOp
+ , pure <$> satisfy specialChar
+ , some $
+ satisfy $ \x ->
+ all
+ ($ x)
+ [ not . specialOp
+ , not . specialChar
+ , not . specialUnused
+ , not . specialName
+ , liftA2 (||) isSymbol isPunctuation
+ ]
+ , (:) <$> satisfy (\x -> any ($ x) [specialName, isAlpha]) <*>
+ many (satisfy $ \x -> any ($ x) [specialName, isAlphaNum, isMark])
+ ]
+
+qtok :: Lexer Lexeme
+qtok = do
+ x <- string "'"
+ y <- many $ satisfy (/= '\'')
+ z <- string "'"
+ return $ QTok y (x ++ y ++ z)
+
+cmt :: Lexer Lexeme
+cmt =
+ Cmt . concat <$>
+ sequence
+ [string "%", many $ satisfy (/= '\n'), choice [string "\n", "" <$ eof]]
+
+lexeme :: Lexer Lexeme
+lexeme = choice [blank, tok, qtok, cmt]
+
+lex :: Lexer [Lexeme]
+lex = many lexeme <* eof