summaryrefslogtreecommitdiff
path: root/treebanks/susanne/Parser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'treebanks/susanne/Parser.hs')
-rw-r--r--treebanks/susanne/Parser.hs37
1 files changed, 37 insertions, 0 deletions
diff --git a/treebanks/susanne/Parser.hs b/treebanks/susanne/Parser.hs
new file mode 100644
index 000000000..4e87c6a00
--- /dev/null
+++ b/treebanks/susanne/Parser.hs
@@ -0,0 +1,37 @@
+module Parser where
+
+import Control.Monad
+
+import SusanneFormat
+
+newtype P a = P {runP :: [ParseTree] -> Maybe ([ParseTree], a)}
+
+instance Monad P where
+ return x = P (\ts -> Just (ts, x))
+ f >>= g = P (\ts -> case runP f ts of
+ Nothing -> Nothing
+ Just (ts,x) -> runP (g x) ts)
+
+instance MonadPlus P where
+ mzero = P (\ts -> Nothing)
+ mplus f g = P (\ts -> mplus (runP f ts) (runP g ts))
+
+match tag_spec = P (\ts ->
+ case ts of
+ (Phrase tag1 mods1 fn1 _ _:ts)
+ | tag == tag1 &&
+ all (flip elem mods1) mods &&
+ (null fn || fn == fn1) -> Just (ts,())
+ (Word _ tag1 _ _:ts)
+ | tag == tag1 -> Just (ts,())
+ _ -> Nothing)
+ where
+ (f,_) = readTag (Word "<match>" undefined undefined undefined) tag_spec
+ Phrase tag mods fn _ _ = f []
+
+many f =
+ do x <- f
+ xs <- many f
+ return (x:xs)
+ `mplus`
+ do return []