summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Tokenizer.hs
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-09-22 00:26:39 -0600
committerJosh Rahm <joshuarahm@gmail.com>2024-09-22 00:26:39 -0600
commit0d2095b5d42989639c1861d7213c182abd064672 (patch)
treee7d43320521f6bfb57d214cb949db8c8674c18c5 /src/Language/Fiddle/Tokenizer.hs
parentf0c4da33e9576d2509b8c6330b1663e044e2dff3 (diff)
downloadfiddle-0d2095b5d42989639c1861d7213c182abd064672.tar.gz
fiddle-0d2095b5d42989639c1861d7213c182abd064672.tar.bz2
fiddle-0d2095b5d42989639c1861d7213c182abd064672.zip
More major changes to the grammer.
Added annotation sublanguage for defining compiler directives. Also added the syntax for import statements. Imports are not implemented, but I'm currently working on that.
Diffstat (limited to 'src/Language/Fiddle/Tokenizer.hs')
-rw-r--r--src/Language/Fiddle/Tokenizer.hs47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/Language/Fiddle/Tokenizer.hs b/src/Language/Fiddle/Tokenizer.hs
index 08f5649..87f119f 100644
--- a/src/Language/Fiddle/Tokenizer.hs
+++ b/src/Language/Fiddle/Tokenizer.hs
@@ -27,6 +27,7 @@ data T
| KWType
| KWUnion
| KWWo
+ | KWImport
| TokColon
| TokComma
| TokComment !Text
@@ -41,8 +42,35 @@ data T
| TokRBracket
| TokRParen
| TokSemi
+ | TokString !Text
+ | TokDirectiveStart -- [[
+ | TokDirectiveEnd -- ]]
deriving (Eq, Ord, Show, Read)
+textOf :: T -> Maybe Text
+textOf t = do
+ case t of
+ KWAssertPos -> Just "assert_pos"
+ KWAt -> Just "at"
+ KWBits -> Just "bits"
+ KWEnum -> Just "enum"
+ KWInstance -> Just "instance"
+ KWLocation -> Just "location"
+ KWOption -> Just "option"
+ KWPackage -> Just "package"
+ KWReg -> Just "reg"
+ KWReserved -> Just "reserved"
+ KWRo -> Just "ro"
+ KWRw -> Just "rw"
+ KWStruct -> Just "struct"
+ KWType -> Just "type"
+ KWUnion -> Just "union"
+ KWWo -> Just "wo"
+ KWImport -> Just "import"
+ TokIdent i -> Just i
+ TokLitNum n -> Just n
+ _ -> Nothing
+
data Token a = Token !T a
deriving (Eq, Ord, Show, Functor)
@@ -66,6 +94,7 @@ parseToken = spaces *> tok parseToken' <* spaces
"type" -> KWType
"option" -> KWOption
"package" -> KWPackage
+ "import" -> KWImport
"reg" -> KWReg
"ro" -> KWRo
"wo" -> KWWo
@@ -77,6 +106,19 @@ parseToken = spaces *> tok parseToken' <* spaces
(Data.Text.head -> h) | isDigit h -> TokLitNum str
ident -> TokIdent ident
+ parseString = fmap (TokString . Data.Text.pack . concat) $ do
+ char '"'
+ manyTill
+ ( do
+ c <- anyChar
+ if c == '\\'
+ then do
+ c2 <- anyChar
+ return [c, c2]
+ else return [c]
+ )
+ (char '"')
+
parseComment =
try
( do
@@ -91,7 +133,9 @@ parseToken = spaces *> tok parseToken' <* spaces
parseSymbol =
choice
- [ char ':' $> TokColon,
+ [ try (string "[[" $> TokDirectiveStart),
+ try (string "]]" $> TokDirectiveEnd),
+ char ':' $> TokColon,
char ',' $> TokComma,
char '=' $> TokEq,
char '{' $> TokLBrace,
@@ -107,6 +151,7 @@ parseToken = spaces *> tok parseToken' <* spaces
parseToken' =
fmap (parseAlNumTok . Data.Text.pack) (many1 (alphaNum <|> char '_'))
+ <|> parseString
<|> parseComment
<|> parseSymbol