linearization by chunks in the GF shell: a new command 'lc' needed because 'l' requires type checking and trees with metavariable function heads don't type check. This will hopefully be a temporary command.

This commit is contained in:
aarne
2013-11-05 17:28:47 +00:00
parent 3814841d7d
commit aba666c5bc
4 changed files with 53 additions and 15 deletions

View File

@@ -516,9 +516,9 @@ allCommands = Map.fromList [
], ],
exec = \env@(pgf, mos) opts -> return . fromStrings . optLins pgf opts, exec = \env@(pgf, mos) opts -> return . fromStrings . optLins pgf opts,
options = [ options = [
("all","show all forms and variants, one by line (cf. l -list)"), ("all", "show all forms and variants, one by line (cf. l -list)"),
("bracket","show tree structure with brackets and paths to nodes"), ("bracket","show tree structure with brackets and paths to nodes"),
("groups","all languages, grouped by lang, remove duplicate strings"), ("groups", "all languages, grouped by lang, remove duplicate strings"),
("list","show all forms and variants, comma-separated on one line (cf. l -all)"), ("list","show all forms and variants, comma-separated on one line (cf. l -all)"),
("multi","linearize to all languages (default)"), ("multi","linearize to all languages (default)"),
("table","show all forms labelled by parameters"), ("table","show all forms labelled by parameters"),
@@ -529,6 +529,24 @@ allCommands = Map.fromList [
("unlexer","set unlexers separately to each language (space-separated)") ("unlexer","set unlexers separately to each language (space-separated)")
] ]
}), }),
("lc", emptyCommandInfo {
longname = "linearize_chunks",
synopsis = "linearize a tree that has metavariables in maximal chunks without them",
explanation = unlines [
"A hopefully temporary command, intended to work around the type checker that fails",
"trees where a function node is a metavariable."
],
examples = [
mkEx "l -lang=LangSwe,LangNor -chunks ? a b (? c d)"
],
exec = \env@(pgf, mos) opts -> return . fromStrings . optLins pgf (opts ++ [OOpt "chunks"]),
options = [
] ++ stringOpOptions,
flags = [
("lang","the languages of linearization (comma-separated, no spaces)")
],
needsTypeCheck = False
}),
("ma", emptyCommandInfo { ("ma", emptyCommandInfo {
longname = "morpho_analyse", longname = "morpho_analyse",
synopsis = "print the morphological analyses of all words in the string", synopsis = "print the morphological analyses of all words in the string",
@@ -1155,6 +1173,8 @@ allCommands = Map.fromList [
_ | isOpt "treebank" opts -> _ | isOpt "treebank" opts ->
(showCId (abstractName pgf) ++ ": " ++ showExpr [] t) : (showCId (abstractName pgf) ++ ": " ++ showExpr [] t) :
[showCId lang ++ ": " ++ linear pgf opts lang t | lang <- optLangs pgf opts] [showCId lang ++ ": " ++ linear pgf opts lang t | lang <- optLangs pgf opts]
_ | isOpt "chunks" opts ->
[unwords (intersperse "<+>" (map (linear pgf opts lang) (treeChunks t))) | lang <- optLangs pgf opts]
_ -> [linear pgf opts lang t | lang <- optLangs pgf opts] _ -> [linear pgf opts lang t | lang <- optLangs pgf opts]
linear :: PGF -> [Option] -> CId -> Expr -> String linear :: PGF -> [Option] -> CId -> Expr -> String

View File

@@ -1,6 +1,7 @@
module GF.Command.TreeOperations ( module GF.Command.TreeOperations (
treeOp, treeOp,
allTreeOps allTreeOps,
treeChunks
) where ) where
import PGF import PGF
@@ -30,6 +31,8 @@ allTreeOps pgf = [
Left $ concatMap subtrees)), Left $ concatMap subtrees)),
("funs",("return all fun functions appearing in the tree, with duplications", ("funs",("return all fun functions appearing in the tree, with duplications",
Left $ concatMap funNodes)) Left $ concatMap funNodes))
--- ("chunks",("return all chunks, i.e. maximal subtrees where the top node is not a metavariable",
--- Left $ concatMap treeChunks)) --- a tree with ? head does not type check anyway AR 5/11/2013
] ]
largest :: [Expr] -> [Expr] largest :: [Expr] -> [Expr]
@@ -42,6 +45,15 @@ smallest = sortBy (\t u -> compare (size t) (size u)) where
EApp e1 e2 -> size e1 + size e2 + 1 EApp e1 e2 -> size e1 + size e2 + 1
_ -> 1 _ -> 1
treeChunks :: Expr -> [Expr]
treeChunks = snd . cks where
cks t = case unAppForm t of
(EFun f, ts) -> case unzip (map cks ts) of
(bs,_) | and bs -> (True, [t])
(_,cts) -> (False,concat cts)
(EMeta _, ts) -> (False,concatMap (snd . cks) ts)
_ -> (True, [t])
subtrees :: Expr -> [Expr] subtrees :: Expr -> [Expr]
subtrees t = t : case unApp t of subtrees t = t : case unApp t of
Just (f,ts) -> concatMap subtrees ts Just (f,ts) -> concatMap subtrees ts

View File

@@ -2,7 +2,7 @@ module PGF.Expr(Tree, BindType(..), Expr(..), Literal(..), Patt(..), Equation(..
readExpr, showExpr, pExpr, pBinds, ppExpr, ppPatt, pattScope, readExpr, showExpr, pExpr, pBinds, ppExpr, ppPatt, pattScope,
mkAbs, unAbs, mkAbs, unAbs,
mkApp, unApp, mkApp, unApp, unAppForm,
mkStr, unStr, mkStr, unStr,
mkInt, unInt, mkInt, unInt,
mkDouble, unDouble, mkDouble, unDouble,
@@ -112,13 +112,19 @@ mkApp f es = foldl EApp (EFun f) es
-- | Decomposes an expression into application of function -- | Decomposes an expression into application of function
unApp :: Expr -> Maybe (CId,[Expr]) unApp :: Expr -> Maybe (CId,[Expr])
unApp = extract [] unApp e = case unAppForm e of
(EFun f,es) -> Just (f,es)
_ -> Nothing
-- | Decomposes an expression into an application of a constructor such as a constant or a metavariable
unAppForm :: Expr -> (Expr,[Expr])
unAppForm = extract []
where where
extract es (EFun f) = Just (f,es) extract es f@(EFun _) = (f,es)
extract es (EApp e1 e2) = extract (e2:es) e1 extract es (EApp e1 e2) = extract (e2:es) e1
extract es (ETyped e ty)= extract es e extract es (ETyped e ty)= extract es e
extract es (EImplArg e) = extract es e extract es (EImplArg e) = extract es e
extract es _ = Nothing extract es h = (h,es)
-- | Constructs an expression from string literal -- | Constructs an expression from string literal
mkStr :: String -> Expr mkStr :: String -> Expr

View File

@@ -22,18 +22,18 @@ public class Translator {
private static final String TAG = "Translator"; private static final String TAG = "Translator";
// TODO: allow changing // TODO: allow changing
private String mGrammar = "ParseEngAbs.pgf"; /// private String mGrammar = "ParseEngAbs.pgf";
///private String mGrammar = "TranslateEngChiFinSwe.pgf"; // AR private String mGrammar = "TranslateEngChiFinSwe.pgf"; // AR
// TODO: build dynamically? // TODO: build dynamically?
private Language[] mLanguages = { private Language[] mLanguages = {
///new Language("en-US", "English", "TranslateEng", R.xml.inflection_en), // AR new Language("en-US", "English", "TranslateEng", R.xml.inflection_en), // AR
///new Language("cmn-Hans-CN", "Chinese", "TranslateChi", 0), new Language("cmn-Hans-CN", "Chinese", "TranslateChi", 0),
/// new Language("fi-FI", "Finnish", "TranslateFin", 0), new Language("fi-FI", "Finnish", "TranslateFin", 0),
/// new Language("sv-SE", "Swedish", "TranslateSwe", 0), new Language("sv-SE", "Swedish", "TranslateSwe", 0),
new Language("en-US", "English", "ParseEng", R.xml.inflection_en), /// new Language("en-US", "English", "ParseEng", R.xml.inflection_en),
new Language("bg-BG", "Bulgarian", "ParseBul", R.xml.inflection_bg), /// new Language("bg-BG", "Bulgarian", "ParseBul", R.xml.inflection_bg),
}; };
private Language mSourceLanguage; private Language mSourceLanguage;