diff options
| author | Eugen Wissner <belka@caraus.de> | 2024-07-21 16:15:17 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2024-07-21 16:15:17 +0200 |
| commit | be4957ee599e7e14c934e61f3d91354760b38acd (patch) | |
| tree | f8506ff75b5a4f1a502489e39f51a267d51ac69f /src/Language/Elna/Parser.hs | |
| download | elna-be4957ee599e7e14c934e61f3d91354760b38acd.tar.gz | |
Initial commit
Diffstat (limited to 'src/Language/Elna/Parser.hs')
| -rw-r--r-- | src/Language/Elna/Parser.hs | 37 |
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) |
