forked from GitHub/gf-core
MatchTerm: testing conditions on terms, e.g. nodup
This commit is contained in:
@@ -655,12 +655,14 @@ txtHelpFile =
|
|||||||
"\n-startcat, like -cat, but used in grammars (to avoid clash with keyword cat)" ++
|
"\n-startcat, like -cat, but used in grammars (to avoid clash with keyword cat)" ++
|
||||||
"\n" ++
|
"\n" ++
|
||||||
"\n-transform, transformation performed on a syntax tree. The default is identity." ++
|
"\n-transform, transformation performed on a syntax tree. The default is identity." ++
|
||||||
"\n -transform=identity no change" ++
|
"\n -transform=identity no change" ++
|
||||||
"\n -transform=compute compute by using definitions in the grammar" ++
|
"\n -transform=compute compute by using definitions in the grammar" ++
|
||||||
"\n -transform=typecheck return the term only if it is type-correct" ++
|
"\n -transform=nodup return the term only if it has no constants duplicated" ++
|
||||||
"\n -transform=solve solve metavariables as derived refinements" ++
|
"\n -transform=nodupatom return the term only if it has no atomic constants duplicated" ++
|
||||||
"\n -transform=context solve metavariables by unique refinements as variables" ++
|
"\n -transform=typecheck return the term only if it is type-correct" ++
|
||||||
"\n -transform=delete replace the term by metavariable" ++
|
"\n -transform=solve solve metavariables as derived refinements" ++
|
||||||
|
"\n -transform=context solve metavariables by unique refinements as variables" ++
|
||||||
|
"\n -transform=delete replace the term by metavariable" ++
|
||||||
"\n" ++
|
"\n" ++
|
||||||
"\n-unlexer, untokenization transforming linearization output into a string." ++
|
"\n-unlexer, untokenization transforming linearization output into a string." ++
|
||||||
"\n The default is unwords." ++
|
"\n The default is unwords." ++
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import qualified GF.Grammar.MMacros as MM
|
|||||||
import GF.Grammar.AbsCompute
|
import GF.Grammar.AbsCompute
|
||||||
import GF.Grammar.TypeCheck
|
import GF.Grammar.TypeCheck
|
||||||
import GF.UseGrammar.Generate
|
import GF.UseGrammar.Generate
|
||||||
|
import GF.UseGrammar.MatchTerm
|
||||||
import GF.UseGrammar.Linear (unoptimizeCanon)
|
import GF.UseGrammar.Linear (unoptimizeCanon)
|
||||||
------import Compile
|
------import Compile
|
||||||
import GF.Compile.ShellState
|
import GF.Compile.ShellState
|
||||||
@@ -373,6 +374,8 @@ customTermCommand =
|
|||||||
,(strCI "compute", \g t -> let gr = grammar g in
|
,(strCI "compute", \g t -> let gr = grammar g in
|
||||||
err (const [t]) return
|
err (const [t]) return
|
||||||
(exp2termCommand gr (computeAbsTerm gr) t))
|
(exp2termCommand gr (computeAbsTerm gr) t))
|
||||||
|
,(strCI "nodup", \_ t -> if (hasDupIdent $ tree2exp t) then [] else [t])
|
||||||
|
,(strCI "nodupatom", \_ t -> if (hasDupAtom $ tree2exp t) then [] else [t])
|
||||||
,(strCI "paraphrase", \g t -> let gr = grammar g in
|
,(strCI "paraphrase", \g t -> let gr = grammar g in
|
||||||
exp2termlistCommand gr (mkParaphrases gr) t)
|
exp2termlistCommand gr (mkParaphrases gr) t)
|
||||||
|
|
||||||
|
|||||||
50
src/GF/UseGrammar/MatchTerm.hs
Normal file
50
src/GF/UseGrammar/MatchTerm.hs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
----------------------------------------------------------------------
|
||||||
|
-- |
|
||||||
|
-- Module : MatchTerm
|
||||||
|
-- Maintainer : AR
|
||||||
|
-- Stability : (stable)
|
||||||
|
-- Portability : (portable)
|
||||||
|
--
|
||||||
|
--
|
||||||
|
-- functions for matching with terms. AR 16/3/2006
|
||||||
|
-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
module GF.UseGrammar.MatchTerm where
|
||||||
|
|
||||||
|
import GF.Data.Operations
|
||||||
|
import GF.Data.Zipper
|
||||||
|
|
||||||
|
import GF.Grammar.Grammar
|
||||||
|
import GF.Grammar.PrGrammar
|
||||||
|
import GF.Infra.Ident
|
||||||
|
import GF.Grammar.Values
|
||||||
|
import GF.Grammar.Macros
|
||||||
|
import GF.Grammar.MMacros
|
||||||
|
|
||||||
|
import Control.Monad
|
||||||
|
import Data.List
|
||||||
|
|
||||||
|
-- test if a term has duplicated idents, either any or just atoms
|
||||||
|
|
||||||
|
hasDupIdent, hasDupAtom :: Exp -> Bool
|
||||||
|
hasDupIdent = (>1) . maximum . map length . group . sort . allConstants True
|
||||||
|
hasDupAtom = (>1) . maximum . map length . group . sort . allConstants False
|
||||||
|
|
||||||
|
-- test if a certain ident occurs in term
|
||||||
|
|
||||||
|
grepIdent :: Ident -> Exp -> Bool
|
||||||
|
grepIdent c = elem c . allConstants True
|
||||||
|
|
||||||
|
-- form the list of all constants, optionally ignoring all but atoms
|
||||||
|
|
||||||
|
allConstants :: Bool -> Exp -> [Ident]
|
||||||
|
allConstants alsoApp = err (const []) snd . flip appSTM [] . collect where
|
||||||
|
collect e = case e of
|
||||||
|
Q _ c -> add c e
|
||||||
|
QC _ c -> add c e
|
||||||
|
Cn c -> add c e
|
||||||
|
App f a | not alsoApp -> case f of
|
||||||
|
App g b -> collect b >> collect a
|
||||||
|
_ -> collect a
|
||||||
|
_ -> composOp collect e
|
||||||
|
add c e = updateSTM (c:) >> return e
|
||||||
14
src/HelpFile
14
src/HelpFile
@@ -626,12 +626,14 @@ q, quit: q
|
|||||||
-startcat, like -cat, but used in grammars (to avoid clash with keyword cat)
|
-startcat, like -cat, but used in grammars (to avoid clash with keyword cat)
|
||||||
|
|
||||||
-transform, transformation performed on a syntax tree. The default is identity.
|
-transform, transformation performed on a syntax tree. The default is identity.
|
||||||
-transform=identity no change
|
-transform=identity no change
|
||||||
-transform=compute compute by using definitions in the grammar
|
-transform=compute compute by using definitions in the grammar
|
||||||
-transform=typecheck return the term only if it is type-correct
|
-transform=nodup return the term only if it has no constants duplicated
|
||||||
-transform=solve solve metavariables as derived refinements
|
-transform=nodupatom return the term only if it has no atomic constants duplicated
|
||||||
-transform=context solve metavariables by unique refinements as variables
|
-transform=typecheck return the term only if it is type-correct
|
||||||
-transform=delete replace the term by metavariable
|
-transform=solve solve metavariables as derived refinements
|
||||||
|
-transform=context solve metavariables by unique refinements as variables
|
||||||
|
-transform=delete replace the term by metavariable
|
||||||
|
|
||||||
-unlexer, untokenization transforming linearization output into a string.
|
-unlexer, untokenization transforming linearization output into a string.
|
||||||
The default is unwords.
|
The default is unwords.
|
||||||
|
|||||||
Reference in New Issue
Block a user