summaryrefslogtreecommitdiff
path: root/src/Language/Elna/Parser.hs
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-07-21 16:15:17 +0200
committerEugen Wissner <belka@caraus.de>2024-07-21 16:15:17 +0200
commitbe4957ee599e7e14c934e61f3d91354760b38acd (patch)
treef8506ff75b5a4f1a502489e39f51a267d51ac69f /src/Language/Elna/Parser.hs
downloadelna-be4957ee599e7e14c934e61f3d91354760b38acd.tar.gz
Initial commit
Diffstat (limited to 'src/Language/Elna/Parser.hs')
-rw-r--r--src/Language/Elna/Parser.hs37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/Language/Elna/Parser.hs b/src/Language/Elna/Parser.hs
new file mode 100644
index 0000000..bf5b4e5
--- /dev/null
+++ b/src/Language/Elna/Parser.hs
@@ -0,0 +1,37 @@
+module Language.Elna.Parser
+ ( Parser
+ , programP
+ ) where
+
+import Control.Monad (void)
+import Data.Text (Text)
+import Data.Void (Void)
+import Language.Elna.AST
+ ( Statement(..)
+ , Program(..)
+ )
+import Text.Megaparsec (Parsec)
+import Text.Megaparsec.Char (space1)
+import qualified Text.Megaparsec.Char.Lexer as Lexer
+
+type Parser = Parsec Void Text
+
+space :: Parser ()
+space = Lexer.space space1 (Lexer.skipLineComment "//")
+ $ Lexer.skipBlockComment "{" "}"
+
+lexeme :: forall a. Parser a -> Parser a
+lexeme = Lexer.lexeme space
+
+symbol :: Text -> Parser Text
+symbol = Lexer.symbol space
+
+beginP :: Parser ()
+beginP = void $ symbol "begin"
+
+endP :: Parser ()
+endP = void $ symbol "end"
+
+programP :: Parser Program
+programP = beginP >> endP >> symbol "."
+ >> pure (Program mempty mempty mempty $ CompoundStatement mempty)