packages feed

FM-SBLEX-3.0: src/fsv/TestGen.hs

module TestGen where

import List
import Frontend
import Char
import Maybe

is_a_word  = isJust . tword

not_a_word = not . isJust . tword

p_pos t = takeWhile (/='_') (tpara t)

p_annotation t =  
    case dropWhile (/='_') (tpara t) of
      (_:xs) -> takeWhile (/='_') xs

p_word t = case dropWhile (/='_') (tpara t) of
             (_:xs) -> case dropWhile (/='_') xs of
                         (_:ys) -> map f ys
 where f '_' = ' '
       f x   = x

id_pos   t = f (tid t)
 where f [] = error "invalid id: " ++ (tid t)
       f ('.':'.':'.':xs) = f ('.':'.':xs)
       f ('.':'.':xs)     = takeWhile (/='.') xs
       f (x:xs) = f xs 

id_lemma t = f (tid t)
 where f [] = error "invalid id: " ++ (tid t)
       f ('.':'.':'.':xs) = '.':f ('.':'.':xs)
       f ('.':'.':xs)     = []
       f (x:xs)           = x : f xs 

norm_id_lemma t = remove_number $ reverse $ i
  where i = id_lemma t
        remove_number (x:xs) 
         | isDigit x = case dropWhile isDigit xs of
                         ('_':zs@(_:_)) -> reverse zs
                         _              -> i
         | otherwise = i

head_to_lemma_id = add_underscore . symbols . unspace . thead
 where unspace s = [if (x == ' ') then '_' else x | x <- s]
       symbols = concat . map tr
       add_underscore (x:xs)
        | isDigit x || elem x "-·" = ('_':x:xs)
        | otherwise = (x:xs)
       tr c = maybe [c] id $ lookup c 
               [(':',"·3A"), ('\'',"·27"), ('/',"·2F"), ('+',"·2B"), 
                (',',"·2C"),('°',"·B0"), ('%',"·25"),('=',"·3D"),('?',"·3F")] 

is_multi_word t = length pos > 2 && last pos == 'm' 
 where pos = tcat t

is_abbr t = last (tcat t) == 'a'

is_vowel c = elem c "aeiouyåäöAEIOUYÅÄÖüÜàÀæÆøØ"

is_consonant c = elem c "bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZþ"

traverse :: String -> (String -> Bool) -> Bool
traverse [] f = False
traverse s@(x:xs) f
 | f s       = True
 | otherwise = traverse xs f

member_str :: String -> String -> Bool
member_str pre s = traverse s (isPrefixOf pre)

decl :: TestInput -> Char -> Bool
decl t c
 | elem (tcat t) ["nn","nnm","nna"] =  (head (p_annotation t)) == c 
 | otherwise                        = False

conj :: TestInput -> Char -> Bool
conj t c
 | elem (tcat t) ["vb","vbm","vba"] =  (head (p_annotation t)) == c 
 | otherwise                        = False

param :: TestInput -> [String] -> Bool
param t xs = and [elem x (tparam t) | x <- xs]

is_no_plural :: TestInput -> Bool
is_no_plural t 
 | elem (tcat t) ["nn","nnm","nna"] = case (p_annotation t) of
                                        ('0':_) -> True
                                        _       -> False
 | otherwise      = False

gender :: TestInput -> Char -> Bool
gender t c
 | elem (tcat t) ["nn","nnm","nna"] = case p_annotation t of
                                        (_:x:_) -> c == x
 | otherwise                        = False

is_no_komp :: TestInput -> Bool
is_no_komp t
 | elem (tcat t) ["av","avm","ava"] = case dropWhile (/='_') (tpara t) of
                      (_:'0':'_':_) -> True
                      _             -> False
 | otherwise      = False

is_komp :: TestInput -> Bool
is_komp t
 | elem (tcat t) ["av","avm","ava"] = 
     case dropWhile (/='_') (tpara t) of
       (_:x:_) | elem x "12v" -> True
       _                        -> False
 | otherwise      = False

is_no_pret_part :: TestInput -> Bool
is_no_pret_part t 
 | tcat t == "vb" = case p_annotation t of
                      (_:'m':_) -> True
                      _       -> False
 | otherwise      = False

is_verb_sd :: TestInput -> Bool
is_verb_sd t 
 | tcat t == "vb" = case p_annotation t of
                      (_:'s':_) -> True
                      (_:'d':_) -> True
                      _       -> False
 | otherwise      = False

is_pret_part :: TestInput -> Bool
is_pret_part t 
 | tcat t == "vb" = case p_annotation t of
                      (_:'a':_) -> True
                      _         -> False
 | otherwise      = False