mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-22 09:32:53 -06:00
Nonlinear patterns in concrete syntax are now detected and reported as errors
Before, they were silently converted to linear patterns. Nonlinear patterns in MorphoCat.gf, ParadigmsGre.gf and ParadigmsFin.gf have been make linear by renaming pattern variables.
This commit is contained in:
@@ -236,7 +236,7 @@ oper
|
|||||||
mkAdj2Reg : Str -> Str -> Adj = \petit,petita ->
|
mkAdj2Reg : Str -> Str -> Adj = \petit,petita ->
|
||||||
case <petit,petita> of {
|
case <petit,petita> of {
|
||||||
<_, _ + ("b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|"x"|"y"|"z")> => adjFidel petit ; --feminine doesn't end in "a"
|
<_, _ + ("b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|"x"|"y"|"z")> => adjFidel petit ; --feminine doesn't end in "a"
|
||||||
<p@(_ + ("t"|"l"|"ç")), p+"a"> => adjPrim petit ; --1) petit~petita 2) ridícul~ridícula, dolç~dolça
|
<p@(_ + ("t"|"l"|"ç")), p2+"a"> => adjPrim petit ; --1) petit~petita 2) ridícul~ridícula, dolç~dolça -- was nonlinear
|
||||||
<_ + "ig", _> => adjIg petit petita ; --lleig~letja
|
<_ + "ig", _> => adjIg petit petita ; --lleig~letja
|
||||||
<_, _+ "na"> => adjVn petit ; --pla~plana
|
<_, _+ "na"> => adjVn petit ; --pla~plana
|
||||||
<_, _ + ("à"|"é"|"è"|"í"|"ó"|"ò"|"ú") + _> => adjBlau petit petita ; --diari~diària
|
<_, _ + ("à"|"é"|"è"|"í"|"ó"|"ò"|"ú") + _> => adjBlau petit petita ; --diari~diària
|
||||||
|
|||||||
@@ -522,9 +522,9 @@ mkVS = overload {
|
|||||||
dSilakka ukko ukon ukkoja ; -- auto,auton
|
dSilakka ukko ukon ukkoja ; -- auto,auton
|
||||||
<_ + "mpi", _ + ("emman" | "emmän")> => dSuurempi ukko ;
|
<_ + "mpi", _ + ("emman" | "emmän")> => dSuurempi ukko ;
|
||||||
<_ + "in", _ + ("imman" | "immän")> => dSuurin ukko ;
|
<_ + "in", _ + ("imman" | "immän")> => dSuurin ukko ;
|
||||||
<terv + "e", terv + "een"> =>
|
<terv + "e", terv2 + "een"> => -- was nonlinear
|
||||||
dRae ukko ukon ;
|
dRae ukko ukon ;
|
||||||
<taiv + ("as" | "äs"), taiv + ("aan" | "ään")> =>
|
<taiv + ("as" | "äs"), taiv2 + ("aan" | "ään")> => -- was nonlinear
|
||||||
dRae ukko ukon ;
|
dRae ukko ukon ;
|
||||||
<nukk + "e", nuk + "een"> => dRae ukko ukon ;
|
<nukk + "e", nuk + "een"> => dRae ukko ukon ;
|
||||||
<arp + "i", arv + "en"> => dArpi ukko ukon ;
|
<arp + "i", arv + "en"> => dArpi ukko ukon ;
|
||||||
|
|||||||
@@ -42,14 +42,15 @@ oper
|
|||||||
|
|
||||||
mkNending : Str -> Str -> Gender -> N = \x,n,g ->
|
mkNending : Str -> Str -> Gender -> N = \x,n,g ->
|
||||||
case <x,n> of {
|
case <x,n> of {
|
||||||
<c + "ος", c + "ων"> => mkNoun_anthropos x n g ;
|
-- all of these were nonlinear
|
||||||
<c + "η", c + "εις"> => mkNoun_kivernisi x n g ;
|
<c + "ος", c2 + "ων"> => mkNoun_anthropos x n g ;
|
||||||
<c + "ης", c + "ηδες"> => mkNoun_fournaris x n g ;
|
<c + "η", c2 + "εις"> => mkNoun_kivernisi x n g ;
|
||||||
<c + "ας", c + "ων"> => mkNoun_filakas x n g ;
|
<c + "ης", c2 + "ηδες"> => mkNoun_fournaris x n g ;
|
||||||
<c + "ο", c + "ων"> => mkNoun_prosopo x n g ;
|
<c + "ας", c2 + "ων"> => mkNoun_filakas x n g ;
|
||||||
<c + ("ώς" | "ός" | "ως" ) , c + ("ος"|"ός" ) > => mkNoun_fws x n g ;
|
<c + "ο", c2 + "ων"> => mkNoun_prosopo x n g ;
|
||||||
<c + ("μα" | "ιμο" ), c + "ατα"> => mkNoun_provlima x n g ;
|
<c + ("ώς" | "ός" | "ως" ) , c2 + ("ος"|"ός" ) > => mkNoun_fws x n g ;
|
||||||
<c + "ος", c + "η"> => mkNoun_megethos x n g
|
<c + ("μα" | "ιμο" ), c2 + "ατα"> => mkNoun_provlima x n g ;
|
||||||
|
<c + "ος", c2 + "η"> => mkNoun_megethos x n g
|
||||||
} ** {lock_N = <>} ;
|
} ** {lock_N = <>} ;
|
||||||
|
|
||||||
|
|
||||||
@@ -128,9 +129,9 @@ oper
|
|||||||
|
|
||||||
mkA1 : Str -> Str -> A = \x,n ->
|
mkA1 : Str -> Str -> A = \x,n ->
|
||||||
case <x,n> of {
|
case <x,n> of {
|
||||||
<c + "ης", c + "ες"> => mkAdjective4 x n ;
|
<c + "ης", c2 + "ες"> => mkAdjective4 x n ; -- was nonlinear
|
||||||
<c + "ων", c + "όντων"> => mkAdjective3 x n ;
|
<c + "ων", c2 + "όντων"> => mkAdjective3 x n ; -- was nonlinear
|
||||||
<c + "ύς", c + "έως"> => mkAdjectiveIr x n
|
<c + "ύς", c2 + "έως"> => mkAdjectiveIr x n -- was nonlinear
|
||||||
} ** {lock_A = <>} ;
|
} ** {lock_A = <>} ;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ import GF.Grammar.Printer
|
|||||||
import GF.Data.Operations
|
import GF.Data.Operations
|
||||||
|
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import Data.List (nub)
|
import Data.List (nub,(\\))
|
||||||
import Text.PrettyPrint
|
import Text.PrettyPrint
|
||||||
|
|
||||||
-- | this gives top-level access to renaming term input in the cc command
|
-- | this gives top-level access to renaming term input in the cc command
|
||||||
@@ -235,8 +235,14 @@ renameTerm env vars = ren vars where
|
|||||||
|
|
||||||
-- | vars not needed in env, since patterns always overshadow old vars
|
-- | vars not needed in env, since patterns always overshadow old vars
|
||||||
renamePattern :: Status -> Patt -> Check (Patt,[Ident])
|
renamePattern :: Status -> Patt -> Check (Patt,[Ident])
|
||||||
renamePattern env patt = case patt of
|
renamePattern env patt =
|
||||||
|
do r@(p',vs) <- renp patt
|
||||||
|
let dupl = vs \\ nub vs
|
||||||
|
unless (null dupl) $ checkError (hang (text "[C.4.13] Pattern is not linear:") 4
|
||||||
|
(ppPatt Unqualified 0 patt))
|
||||||
|
return r
|
||||||
|
where
|
||||||
|
renp patt = case patt of
|
||||||
PMacro c -> do
|
PMacro c -> do
|
||||||
c' <- renid $ Vr c
|
c' <- renid $ Vr c
|
||||||
case c' of
|
case c' of
|
||||||
@@ -301,8 +307,6 @@ renamePattern env patt = case patt of
|
|||||||
|
|
||||||
_ -> return (patt,[])
|
_ -> return (patt,[])
|
||||||
|
|
||||||
where
|
|
||||||
renp = renamePattern env
|
|
||||||
renid = renameIdentTerm env
|
renid = renameIdentTerm env
|
||||||
renid' = renameIdentTerm' env
|
renid' = renameIdentTerm' env
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user