1
1
module Mentat.Tokenizer where
2
2
import Mentat.ParseTypes
3
+ import Data.List.Split ( splitOn )
3
4
4
5
tokSubTree :: TokTree -> [TokTree ]
5
6
tokSubTree (TNode _ ts) = ts
@@ -20,6 +21,15 @@ parseInner (TClose x : xs) (y : ys)
20
21
| x /= y = Left $ MismatchedBracket (y : ys) (TClose x : xs)
21
22
| otherwise = Right (xs, [] )
22
23
parseInner (TClose x : xs) [] = Left $ UnclosedBracket [] (TClose x : xs)
24
+ parseInner (TId name : TOpen Paren : cRest) stack = do
25
+ let maybeFxn = parseFxnCall (TId name : TOpen Paren : cRest)
26
+ case maybeFxn of
27
+ Right (restAfterFxn, fxnCall) -> do
28
+ (restToks, rest) <- parseInner restAfterFxn stack
29
+ pure (restToks, fxnCall : rest)
30
+ Left _ -> do
31
+ (restTokens, rest) <- parseInner (TOpen Paren : cRest) stack
32
+ pure (restTokens, TLeaf (TId name) : rest)
23
33
parseInner (TOpen x : xs) stack = do
24
34
-- don't need cases since errors are infective
25
35
(tokAfterInner, inner) <- parseInner xs (x : stack) -- parse inner for bracket x
@@ -29,3 +39,11 @@ parseInner (x : xs) stack = do
29
39
(restTokens, rest) <- parseInner xs stack
30
40
pure (restTokens, TLeaf x : rest)
31
41
42
+ parseFxnCall :: [Token ] -> Either Error ([Token ], TokTree )
43
+ parseFxnCall (TId name : TOpen Paren : TClose Paren : rest) = Right (rest, TFxn name [[] ])
44
+ parseFxnCall (TId name : TOpen Paren : call) = do
45
+ (rest, argToks) <- parseInner call [Paren ]
46
+ let args = splitOn [TLeaf TSep ] argToks
47
+ Right (rest, TFxn name args)
48
+ parseFxnCall _ = Left UnfinishedTokenStream -- add an error
49
+
0 commit comments