mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-11 12:12:51 -06:00
MatchTerm: testing conditions on terms, e.g. nodup
This commit is contained in:
@@ -39,6 +39,7 @@ import qualified GF.Grammar.MMacros as MM
|
||||
import GF.Grammar.AbsCompute
|
||||
import GF.Grammar.TypeCheck
|
||||
import GF.UseGrammar.Generate
|
||||
import GF.UseGrammar.MatchTerm
|
||||
import GF.UseGrammar.Linear (unoptimizeCanon)
|
||||
------import Compile
|
||||
import GF.Compile.ShellState
|
||||
@@ -373,6 +374,8 @@ customTermCommand =
|
||||
,(strCI "compute", \g t -> let gr = grammar g in
|
||||
err (const [t]) return
|
||||
(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
|
||||
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
|
||||
Reference in New Issue
Block a user