forked from GitHub/gf-core
SRGS semantic results for list categories is now an array.
This commit is contained in:
@@ -29,6 +29,7 @@ import GF.Infra.Option
|
|||||||
import GF.Probabilistic.Probabilistic (Probs)
|
import GF.Probabilistic.Probabilistic (Probs)
|
||||||
|
|
||||||
import Data.Char (toUpper,toLower)
|
import Data.Char (toUpper,toLower)
|
||||||
|
import Data.List
|
||||||
|
|
||||||
data XML = Data String | Tag String [Attr] [XML] | Comment String
|
data XML = Data String | Tag String [Attr] [XML] | Comment String
|
||||||
deriving (Eq,Show)
|
deriving (Eq,Show)
|
||||||
@@ -56,18 +57,36 @@ prSrgsXml sisr (SRG{grammarName=name,startCat=start,
|
|||||||
meta "generator" "GF"]
|
meta "generator" "GF"]
|
||||||
++ map ruleToXML rs)
|
++ map ruleToXML rs)
|
||||||
ruleToXML (SRGRule cat origCat alts) =
|
ruleToXML (SRGRule cat origCat alts) =
|
||||||
rule (prCat cat) (comments ["Category " ++ origCat] ++ [prRhs alts])
|
rule (prCat cat) (comments ["Category " ++ origCat] ++ prRhs isList alts)
|
||||||
prRhs rhss = oneOf (map prAlt rhss)
|
where isList = "List" `isPrefixOf` origCat && length cs == 2
|
||||||
prAlt (SRGAlt p n@(Name _ pr) rhs)
|
&& isBase (cs!!0) && isCons (cs!!1)
|
||||||
| sisr = prodItem (Just n) p (map (uncurry (symItem pr)) (numberCats 0 rhs))
|
cs = sortNub [f | SRGAlt _ (Name f _) _ <- alts]
|
||||||
| otherwise = prodItem Nothing p (map (\s -> symItem [] s 0) rhs)
|
prRhs isList rhss = [oneOf (map (mkProd sisr isList) rhss)]
|
||||||
numberCats _ [] = []
|
|
||||||
numberCats n (s@(Cat _):ss) = (s,n):numberCats (n+1) ss
|
|
||||||
numberCats n (s:ss) = (s,n):numberCats n ss
|
|
||||||
|
|
||||||
rule :: String -> [XML] -> XML
|
rule :: String -> [XML] -> XML
|
||||||
rule i = Tag "rule" [("id",i)]
|
rule i = Tag "rule" [("id",i)]
|
||||||
|
|
||||||
|
isBase :: Fun -> Bool
|
||||||
|
isBase f = "Base" `isPrefixOf` prIdent f
|
||||||
|
|
||||||
|
isCons :: Fun -> Bool
|
||||||
|
isCons f = "Cons" `isPrefixOf` prIdent f
|
||||||
|
|
||||||
|
mkProd :: Bool -> Bool -> SRGAlt -> XML
|
||||||
|
mkProd sisr isList (SRGAlt p n@(Name f pr) rhs)
|
||||||
|
| sisr = prodItem (Just n) p (r ++ if isList then [buildList] else [])
|
||||||
|
| otherwise = prodItem Nothing p (map (\s -> symItem [] s 0) rhs)
|
||||||
|
where
|
||||||
|
r = map (uncurry (symItem pr)) (numberCats 0 rhs)
|
||||||
|
buildList | isBase f =
|
||||||
|
tag ["$ = new Array(" ++ join "," args ++ ")"]
|
||||||
|
| isCons f = tag ["$.arg1.unshift($.arg0); $ = $.arg1;"]
|
||||||
|
where args = ["$.arg"++show n | n <- [0..length pr-1]]
|
||||||
|
numberCats _ [] = []
|
||||||
|
numberCats n (s@(Cat _):ss) = (s,n):numberCats (n+1) ss
|
||||||
|
numberCats n (s:ss) = (s,n):numberCats n ss
|
||||||
|
|
||||||
|
|
||||||
prodItem :: Maybe Name -> Maybe Double -> [XML] -> XML
|
prodItem :: Maybe Name -> Maybe Double -> [XML] -> XML
|
||||||
prodItem n mp xs = Tag "item" w (t++cs)
|
prodItem n mp xs = Tag "item" w (t++cs)
|
||||||
where
|
where
|
||||||
@@ -78,7 +97,7 @@ prodItem n mp xs = Tag "item" w (t++cs)
|
|||||||
_ -> xs
|
_ -> xs
|
||||||
|
|
||||||
prodTag :: Name -> [XML]
|
prodTag :: Name -> [XML]
|
||||||
prodTag (Name f prs) = [Tag "tag" [] [Data (join "; " ts)]]
|
prodTag (Name f prs) = [tag ts]
|
||||||
where
|
where
|
||||||
ts = ["$.name=" ++ showFun f] ++
|
ts = ["$.name=" ++ showFun f] ++
|
||||||
["$.arg" ++ show n ++ "=" ++ argInit (prs!!n)
|
["$.arg" ++ show n ++ "=" ++ argInit (prs!!n)
|
||||||
@@ -91,11 +110,14 @@ prodTag (Name f prs) = [Tag "tag" [] [Data (join "; " ts)]]
|
|||||||
symItem :: [Profile a] -> Symbol String Token -> Int -> XML
|
symItem :: [Profile a] -> Symbol String Token -> Int -> XML
|
||||||
symItem prs (Cat c) x = Tag "item" [] ([Tag "ruleref" [("uri","#" ++ prCat c)] []]++t)
|
symItem prs (Cat c) x = Tag "item" [] ([Tag "ruleref" [("uri","#" ++ prCat c)] []]++t)
|
||||||
where
|
where
|
||||||
t = if null ts then [] else [Tag "tag" [] [Data (join "; " ts)]]
|
t = if null ts then [] else [tag ts]
|
||||||
ts = ["$.arg" ++ show n ++ "=$$"
|
ts = ["$.arg" ++ show n ++ "=$$"
|
||||||
| n <- [0..length prs-1], inProfile x (prs!!n)]
|
| n <- [0..length prs-1], inProfile x (prs!!n)]
|
||||||
symItem _ (Tok t) _ = Tag "item" [] [Data (showToken t)]
|
symItem _ (Tok t) _ = Tag "item" [] [Data (showToken t)]
|
||||||
|
|
||||||
|
tag :: [String] -> XML
|
||||||
|
tag ts = Tag "tag" [] [Data (join "; " ts)]
|
||||||
|
|
||||||
inProfile :: Int -> Profile a -> Bool
|
inProfile :: Int -> Profile a -> Bool
|
||||||
inProfile x (Unify xs) = x `elem` xs
|
inProfile x (Unify xs) = x `elem` xs
|
||||||
inProfile _ (Constant _) = False
|
inProfile _ (Constant _) = False
|
||||||
|
|||||||
Reference in New Issue
Block a user