summaryrefslogtreecommitdiff
path: root/src/GF/Grammar/Parser.y
diff options
context:
space:
mode:
authoraarne <aarne@chalmers.se>2009-05-15 16:45:16 +0000
committeraarne <aarne@chalmers.se>2009-05-15 16:45:16 +0000
commit29c0ea9f761647710e7988cb80c3717c3fc6bc43 (patch)
tree9821d266decd82e833729570583c96de29b9400c /src/GF/Grammar/Parser.y
parent110d436e85cea3d482487731646fd6cb82aeca6d (diff)
new pre syntax (as alternative): pre {"o" | "i" => "an" ; _ => "a"}
Diffstat (limited to 'src/GF/Grammar/Parser.y')
-rw-r--r--src/GF/Grammar/Parser.y25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/GF/Grammar/Parser.y b/src/GF/Grammar/Parser.y
index 6be4e0ced..136480799 100644
--- a/src/GF/Grammar/Parser.y
+++ b/src/GF/Grammar/Parser.y
@@ -419,7 +419,9 @@ Exp4
_ -> TRaw
in S (T annot $5) $2 }
| 'variants' '{' ListExp '}' { FV $3 }
- | 'pre' '{' Exp ';' ListAltern '}' { Alts ($3, $5) }
+ | 'pre' '{' ListCase '}' {% mkAlts $3 }
+ | 'pre' '{' String ';' ListAltern '}' { Alts (K $3, $5) }
+ | 'pre' '{' Ident ';' ListAltern '}' { Alts (Vr $3, $5) }
| 'strs' '{' ListExp '}' { Strs $3 }
| '#' Patt2 { EPatt $2 }
| 'pattern' Exp5 { EPattType $2 }
@@ -715,5 +717,26 @@ checkInfoType (MTTransfer _ _) (id,pos,info) =
AbsFun _ _ -> return ()
_ -> failLoc (fst pos) "illegal definition in transfer module"
+
+mkAlts cs = case cs of
+ _:_ -> do
+ def <- mkDef (last cs)
+ alts <- mapM mkAlt (init cs)
+ return (Alts (def,alts))
+ _ -> fail "empty alts"
+ where
+ mkDef (_,t) = return t
+ mkAlt (p,t) = do
+ ss <- mkStrs p
+ return (t,ss)
+ mkStrs p = case p of
+ PAlt a b -> do
+ Strs as <- mkStrs a
+ Strs bs <- mkStrs b
+ return $ Strs $ as ++ bs
+ PString s -> return $ Strs [K s]
+ PV x -> return (Vr x) --- for macros; not yet complete
+ _ -> fail "no strs from pattern"
+
}