diff options
| author | aarne <aarne@chalmers.se> | 2009-05-15 16:45:16 +0000 |
|---|---|---|
| committer | aarne <aarne@chalmers.se> | 2009-05-15 16:45:16 +0000 |
| commit | 29c0ea9f761647710e7988cb80c3717c3fc6bc43 (patch) | |
| tree | 9821d266decd82e833729570583c96de29b9400c /src/GF/Grammar/Parser.y | |
| parent | 110d436e85cea3d482487731646fd6cb82aeca6d (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.y | 25 |
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" + } |
