# -*- cg-pre-pipe: "hfst-tokenise -g ../../tools/tokenisers/tokeniser-gramcheck-gt-desc.pmhfst" -*-
# Divvun & Giellatekno - open source grammars for Sámi and other languages
# Copyright © 2000-2017 UiT The arctic University of Norway
# http://giellatekno.uit.no & http://divvun.no
#
# This program is free software; you can redistribute and/or modify
# this file under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version. The GNU General Public License
# is found at http://www.gnu.org/licenses/gpl.html. It is
# also available in the file $GTHOME/LICENSE.txt.
#
# Other licensing options are available upon request, please contact
# giellatekno@hum.uit.no or divvun@hum.uit.no
# ==================================================================== #
#!! !!! L U L E S A A M I G R A M M A R C H E C K E R
# ==================================================================== #
# ====================================================================
# Sámi language technology 2000-2017, UiT The arctic University of Norway #
# ---------------------- #
# Development setup: #
# ---------------------- #
#
# cd $GTHOME/langs/smj
# ./autogen.sh
# ./configure --enable-apertium --with-hfst --enable-syntax --enable-grammarchecker --enable-tokenisers --enable-alignment --enable-reversed-intersect
# make
# cd tools/grammarcheckers
# make dev
#
# ---------------------- #
# Then edit/test as: #
# ---------------------- #
#
# emacs grammarchecker.cg3 # and C-c C-i / C-c C-c if you have cg-mode installed
# echo "Sun ij puátá." | sh modes/smjgram.mode # from the terminal
#
# ---------------------- #
# Other debug-pipes: #
# ---------------------- #
#
# ls modes/
#
# ---------------------- #
# The pipeline (but use modes, above)
# echo "Hei." | hfst-tokenise -g ../tokenisers/tokeniser-gramcheck-gt-desc.pmhfst | vislcg3 -g disambiguator.cg3 -t | vislcg3 -g grammarchecker.cg3 -t
# =========================================== #
# Short table of contents #
# =========================================== #
# Delimiters
# Tags and sets
# Grammar checking rules
# =============== #
#!! !!!DELIMITERS
# =============== #
DELIMITERS = "<.>" "" ">" "<...>" "<¶>" sent ;
# ================== #
#!! !!!TAGS AND SETS
# ================== #
SETS
#!! !!Tags
#!! This section lists all the tags inherited from the fst, and used as tags
#!! in the syntactic analysis. The next section, __Sets__, contains sets defined
#!! on the basis of the tags listed here, those set names are not visible in the output.
# Tags declared as single-membered LISTs
# ======================================
#!! !Beginning and end of sentence
LIST BOS = (>>>) () ; #!! BOS
LIST EOS = (<<<) () ; #!! EOS
# We define end of clause and beginning of clause in a way so that the file
# may be read both by the CG-2 and the vislcg formalisms.
# CG3 doesn´t function without >>> and <<< !
#!! !Parts of speech tags
LIST N = N ; #!! N
LIST A = A ; #!! A
LIST Adv = Adv ; #!! Adv
LIST V = V ; #!! V
LIST Pron = Pron ; #!! Pron
LIST CS = CS ; #!! CS
LIST CC = CC ; #!! CC
SET CC-CS = CC OR CS ; #!! CC-CS
LIST Po = Po ; #!! Po
LIST Pr = Pr ; #!! Pr
LIST Pcle = Pcle ; #!! Pcle
LIST Num = Num ; #!! Num
LIST Interj = Interj ; #!! Interj
LIST ABBR = ABBR ; #!! ABBR
LIST ACR = ACR ; #!! ACR
LIST CLB = CLB ; #!! CLB
LIST LEFT = LEFT ; #!! LEFT
LIST RIGHT = RIGHT ; #!! RIGHT
LIST WEB = WEB ; #!! WEB
LIST QMARK = """ ; # " #!! QMARK
LIST PPUNCT = PUNCT ; #!! PPUNCT
SET PUNCT = PPUNCT - QMARK ; #!! PUNCT
LIST COMMA = "," ; #!! COMMA
LIST ¶ = ¶; #!! ¶
#!! !Tags for POS sub-categories
LIST Pers = Pers ; #!! Pers
LIST Dem = Dem ; #!! Dem
LIST Interr = Interr ; #!! Interr
LIST Indef = Indef ; #!! Indef
LIST Recipr = Recipr ; #!! Recipr
LIST Refl = Refl ; #!! Refl
LIST Rel = Rel ; #!! Rel
LIST Coll = Coll ; #!! Coll
LIST NomAg = NomAg ; #!! NomAg
LIST Prop = Prop ; #!! Prop
LIST Allegro = Allegro ; #!! Allegro
LIST Arab = Arab ; #!! Arab
LIST Rom = Rom ; #!! Romertall
#!! !Tags for morphosyntactic properties
LIST Nom = Nom ; #!! Nom
LIST Acc = Acc ; #!! Acc
LIST Gen = Gen ; #!! Gen
LIST Ill = Ill ; #!! Ill
LIST Loc = Loc ; #!! Loc
LIST Com = Com ; #!! Com
LIST Ess = Ess ; #!! Ess
LIST Par = Par ; #!! Ess
LIST Sg = Sg ; #!! Sg
LIST Du = Du ; #!! Du
LIST Pl = Pl ; #!! Pl
LIST Cmp/SplitR = Cmp/SplitR ; #!! Cmp/SplitR
LIST Cmp/SgNom = Cmp/SgNom ; #!! Cmp/SgNom Cmp/SgGen
LIST Cmp/SgGen = Cmp/SgGen ; #!! Cmp/SgGen
LIST PxSg1 = PxSg1 ; #!! PxSg1
LIST PxSg2 = PxSg2 ; #!! PxSg2
LIST PxSg3 = PxSg3 ; #!! PxSg3
LIST PxDu1 = PxDu1 ; #!! PxDu1
LIST PxDu2 = PxDu2 ; #!! PxDu2
LIST PxDu3 = PxDu3 ; #!! PxDu3
LIST PxPl1 = PxPl1 ; #!! PxPl1
LIST PxPl2 = PxPl2 ; #!! PxPl2
LIST PxPl3 = PxPl3 ; #!! PxPl3
LIST Px = PxSg1 PxSg2 PxSg3 PxDu1 PxDu2 PxDu3 PxPl1 PxPl2 PxPl3 ; #!! Px
LIST Comp = Comp ; #!! Comp
LIST Superl = Superl ; #!! Superl
LIST Attr = Attr ; #!! Attr
LIST Ord = Ord ; #!! Ord
LIST Qst = Qst ; #!! Qst
LIST IV = IV ; #!! IV
LIST TV = TV ; #!! TV
LIST Prt = Prt; #!! Prt
LIST Prs = Prs ; #!! Prs
LIST Ind = Ind ; #!! Ind
LIST Pot = Pot ; #!! Pot
LIST Cond = Cond ; #!! Cond
LIST Imprt = Imprt ; #!! Imprt
LIST ImprtII = ImprtII ; #!! ImprtII
LIST Sg1 = Sg1 (p1 sg) ; #!! Sg1
LIST Sg2 = Sg2 (p2 sg) ; #!! Sg2
LIST Sg3 = Sg3 (p3 sg) ; #!! Sg3
LIST Du1 = Du1 (p1 du) ; #!! Du1
LIST Du2 = Du2 (p2 du) ; #!! Du2
LIST Du3 = Du3 (p3 du) ; #!! Du3
LIST Pl1 = Pl1 (p1 pl) ; #!! Pl1
LIST Pl2 = Pl2 (p2 pl); #!! Pl2
LIST Pl3 = Pl3 (p3 pl); #!! Pl3
LIST Inf = Inf ; #!! Inf
LIST ConNeg = ConNeg ; #!! ConNeg
LIST Neg = Neg ; #!! Neg
LIST PrfPrc = PrfPrc ; #!! PrfPrc
LIST VGen = VGen ; #!! VGen
LIST PrsPrc = PrsPrc ; #!! PrsPrc
LIST Ger = Ger ; #!! Ger
LIST Sup = Sup ; #!! Sup
LIST Actio = Actio ; #!! Actio
LIST VAbess = VAbess ; #!! VAbess
LIST Err/Orth = Err/Orth Err/Orth-a/á Err/Orth-nom/gen Err/Orth-nom/acc Err/DerSub Err/CmpSub Err/UnspaceCmp Err/HyphSub Err/SpaceCmp Err/Spellrelax err_orth_mt ; #!! Err/Orth
#!! !Semantic tags
LIST Sem/Act = Sem/Act ; #!! Sem/Act
LIST Sem/Ani = Sem/Ani ; #!! Sem/Ani
LIST Sem/Atr = Sem/Atr ; #!! Sem/Atr
LIST Sem/Body = Sem/Body ; #!! Sem/Body
LIST Sem/Clth = Sem/Clth ; #!! Sem/Clth
LIST Sem/Domain = Sem/Domain ; #!! Sem/Domain
LIST Sem/Feat-phys = Sem/Feat-phys ; #!! Sem/Feat-phys
LIST Sem/Fem = Sem/Fem ; #!! Sem/Fem
LIST Sem/Group = Sem/Group ; #!! Sem/Group
LIST Sem/Lang = Sem/Lang ; #!! Sem/Lang
LIST Sem/Mal = Sem/Mal ; #!! Sem/Mal
LIST Sem/Measr = Sem/Measr ; #!! Sem/Measr
LIST Sem/Money = Sem/Money ; #!! Sem/Money
LIST Sem/Obj = Sem/Obj ; #!! Sem/Obj
LIST Sem/Obj-el = Sem/Obj-el ; #!! Sem/Obj-el
LIST Sem/Org = Sem/Org ; #!! Sem/Org
LIST Sem/Perc-emo = Sem/Perc-emo ; #!! Sem/Perc-emo
LIST Sem/Plc = Sem/Plc ; #!! Sem/Plc
LIST Sem/Sign = Sem/Sign ; #!! Sem/Sign
LIST Sem/State-sick = Sem/State-lang-sick ; #!! Sem/State-sick
LIST Sem/Sur = Sem/Sur ; #!! Sem/Sur
LIST Sem/Time = Sem/Time ; #!! Sem/Time
LIST Sem/Txt = Sem/Txt ; #!! Sem/Txt
LIST HUMAN = Sem/Fem Sem/Mal Sem/Sur ; #!! HUMAN
SET HAB-ACTOR = HUMAN ; # Goal: make this like the sme one. #!! HAB-ACTOR
SET HAB-ACTOR-NOT-HUMAN = Sem/Org ; # make this like the sme one #!! HAB-ACTOR-NOT-HUMAN
LIST PROP-ATTR = Sem/Mal Sem/Sur Sem/Fem ; #!! PROP-ATTR
LIST PROP-SUR = Sem/Sur Sem/Mal Sem/Fem ; #!! PROP-SUR
SET TIME-N-SET = N + Sem/Time ; #!! TIME-N-SET
#!! ! Syntactic tags
LIST @+FAUXV = @+FAUXV ; #!! @+FAUXV
LIST @+FMAINV = @+FMAINV ; #!! @+FMAINV
LIST @-FAUXV = @-FAUXV ; #!! @-FAUXV
LIST @-FMAINV = @-FMAINV ; #!! @-FMAINV
LIST @-FSUBJ> = @-FSUBJ> ; #!! @-FSUBJ>
LIST @-F = @-FOBJ> ; #!! @-FOBJ>
LIST @SPRED = @-FADVL> ; #!! @-FADVL>
LIST @-F = @-FSPRED> ; #!! @-FSPRED>
LIST @-FOPRED> = @-FOPRED> ; #!! @-FOPRED>
SET FOBJ = @-F ;
SET FMAINV = @-FMAINV OR @+FMAINV ;
SET FAUXV = @-FAUXV OR @+FAUXV ;
LIST @>ADVL = @>ADVL ; #!! @>ADVL
LIST @ADVL< = @ADVL< ; #!! @ADVL<
LIST @ = @ADVL> ; #!! @ADVL>
LIST ADVL = @ADVL @ADVL> @ADVL< @ADVL @-F ; #!! @ADVL
LIST @HAB> = @HAB> ; #!! @HAB>
LIST @ ;
LIST @>N = @>N ; #!! @>N
LIST @Interj = @Interj ; #!! @Interj
LIST @N< = @N< ; #!! @N<
LIST @>A = @>A ; #!! @>A
LIST @P< = @P< ; #!! @P<
LIST @>P = @>P ; #!! @>P
LIST @HNOUN = @HNOUN ; #!! @HNOUN
LIST @INTERJ = @INTERJ ; #!! @INTERJ
LIST @>Num = @>Num; #!! @>Num
LIST @Pron< = @Pron< ; #!! @Pron<
LIST @>Pron = @>Pron ; #!! @>Pron
LIST @Num< = @Num< ; #!! @Num<
LIST @OBJ = @OBJ ; #!! @OBJ
LIST @ = @OBJ> ; #!! @OBJ>
LIST @OPRED = @OPRED ; #!! @OPRED
LIST @ = @OPRED> ; #!! @OPRED>
LIST @PCLE = @PCLE ; #!! @PCLE
LIST @COMP-CS< = @COMP-CS< ; #!! @COMP-CS<
LIST @SPRED = @SPRED ; #!! @SPRED
LIST @ = @SPRED> ; #!! @SPRED>
LIST @SUBJ = @SUBJ ; #!! @SUBJ
LIST @ = @SUBJ> ; #!! @SUBJ>
SET SUBJ = @ OR @SUBJ ; #!! SUBJ
SET SPRED = @ OR @SPRED ; #!! SPRED
SET OPRED = @ OR @OPRED ; #!! OPRED
LIST @PPRED = @PPRED ; #!! @PPRED
LIST @APP = @APP ; #!! @APP
LIST @APP-N< = @APP-N< ; #!! @APP-N<
LIST @APP-Pron< = @APP-Pron< ; #!! @APP-Pron<
LIST @APP>Pron = @APP>Pron ; #!! @APP>Pron
LIST @APP-Num< = @APP-Num< ; #!! @APP-Num<
LIST @APP-ADVL< = @APP-ADVL< ; #!! @APP-ADVL<
LIST @VOC = @VOC ; #!! @VOC
LIST @CVP = @CVP ; #!! @CVP
LIST @CNP = @CNP ; #!! @CNP
SET OBJ = (@) OR (@OBJ) OR (@-F) ; #!! OBJ
LIST = @OBJ> @-FOBJ> ; #!! OBJ>
SET -OTHERS = OBJ> OR (Gen) OR (Nom) OR (Ess) OR (Loc) OR (Adv) ; #!! OBJ>-OTHERS
SET NOT-FAUXV = FMAINV OR OBJ + V OR ADVL + V ;
# Works after the mapping rules for verbs.
SET SYN-V = FMAINV OR FAUXV OR V + SUBJ OR OBJ + V OR ADVL + V OR (V @>N) OR (V @N<) OR (V @A<) ; #!! SYN-V
LIST @X = @X ; #!! @X
# ========
SETS
# ========
#!! !!Sets containing sets of lists and tags
#!! This part of the file lists a large number of sets based partly upon the tags defined above, and
#!! partly upon lexemes drawn from the lexicon.
#!! See the sourcefile itself to inspect the sets, what follows here is an overview of the set types.
#!! !Sets for Single-word sets
LIST INITIAL = "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m"
"n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
"á" "æ" "ø" "å" "ö" "ä" ; #!! INITIAL
#!! !Sets for word or not
LIST WORD = N A Adv V Pron CS CC Po Pr Interj Pcle Num ABBR ACR \? ; #!! WORD
# any word
# SET REAL-WORD = WORD - Num - Ord ; #!! REAL-WORD
SET REAL-WORD-NOT-ABBR = WORD - Num - Ord - (ABBR N) ; # This is former REALWORD-NOTABBR #!! REAL-WORD-NOT-ABBR
SET NOT-COMMA = WORD - COMMA ; #!! NOT-COMMA
#!! !Case sets
# ---------
LIST ADVLCASE = Ill Loc Com Ess ; #!! ADLVCASE
LIST CASE-AGREEMENT = Nom Acc Gen (Pl Ill) Loc Com Ess ; #!! CASE-AGREEMENT
LIST CASE = Nom Acc Gen Ill Loc Com Ess ; #!! CASE
SET NOT-NOM = CASE - Nom ; #!! NOT-NOM
SET NOT-GEN = CASE - Gen ; #!! NOT-GEN
SET NOT-ACC = CASE - Acc ; #!! NOT-ACC
#!! !Verb sets
# ---------
# Verbs and their complements
# - - - - - - - - - - - - - -
SET NOT-V = WORD - V ; #!! NOT-V
#!! !Sets for finiteness and mood
# - - - - - - - - - -
SET REAL-NEG = Neg - Sup ; #!! REAL-NEG
SET MOOD-V = Ind OR Pot OR Imprt OR ImprtII OR Cond OR (Neg Sup) ; #!! MOOD-V
SET NOT-PRFPRC = WORD - PrfPrc ; #!! NOT-PRFPRC
#!! !Sets for person
# - - - -
LIST SG1-V = (V Sg1) ; #!! SG1-V
LIST SG2-V = (V Sg2) ; #!! SG2-V
LIST SG3-V = (V Sg3) ; #!! SG3-V
LIST DU1-V = (V Du1) ; #!! DU1-V
LIST DU2-V = (V Du2) ; #!! DU2-V
LIST DU3-V = (V Du3) ; #!! DU3-V
LIST PL1-V = (V Pl1) ; #!! PL1-V
LIST PL2-V = (V Pl2) ; #!! PL2-V
LIST PL3-V = (V Pl3) ; #!! PL3-V
# Note that imperative verbs are not included in these sets!
# Some subsets of the VFIN sets
# - - - - - - - - - - - - - - -
SET SG-V = SG1-V OR SG2-V OR SG3-V ;
SET DU-V = DU1-V OR DU2-V OR DU3-V ;
SET PL-V = PL1-V OR PL2-V OR PL3-V ;
SET DU-PL-V = DU1-V OR DU2-V OR DU3-V OR PL1-V OR PL2-V OR PL3-V ;
SET 1-2-V = SG1-V OR SG2-V OR DU1-V OR DU2-V OR PL1-V OR PL2-V ;
#!! !Pronoun sets
# ------------
LIST MUN = (Pron Pers Sg1 Nom) (pers p1 sg nom) ;
LIST DON = (Pron Pers Sg2 Nom) (pers p2 sg nom) ;
LIST SON = (Pron Pers Sg3 Nom) (pers p3 sg nom) ;
LIST MOAI = (Pron Pers Du1 Nom) (pers p1 du nom) ;
LIST DOAI = (Pron Pers Du2 Nom) (pers p2 du nom) ;
LIST SOAI = (Pron Pers Du3 Nom) (pers p3 du nom) ;
LIST MII-PERS = (Pron Pers Pl1 Nom) (pers p1 pl nom) ;
LIST DII = (Pron Pers Pl2 Nom) (pers p2 pl nom) ;
LIST SII = (Pron Pers Pl3 Nom) (pers p3 pl nom) ;
SET PPRON-NOM-NOT-DAT = MUN OR DON OR SON OR MOAI OR DOAI OR SOAI OR MII-PERS OR DII OR SII ;
SET PPRON-DU-PL = MOAI OR DOAI OR SOAI OR MII-PERS OR DII OR SII ;
SET PPRON-PL = MII-PERS OR DII OR SII ;
SET PRON-DU = MOAI OR DOAI OR SOAI ;
SET PPRON-NOT-SII = MUN OR DON OR SON OR MOAI OR DOAI OR SOAI OR MII-PERS OR DII ;
LIST PPRON-GEN = (Sg1 Gen) (Sg2 Gen) (Sg3 Gen) (Du1 Gen) (Du2 Gen) (Du3 Gen)
(Pl1 Gen) (Pl2 Gen) (Pl3 Gen) (p1 sg gen) (p2 sg gen) (p3 sg gen) (p1 du gen) (p2 du gen) (p3 du gen)
(p1 pl gen) (p2 pl gen) (p3 pl gen) ;
SET PPRON-NOT-GEN = (Pron Pers) - PPRON-GEN ;
LIST SG-DEM = (Pron Dem Sg Nom);
LIST PL-DEM = (Pron Dem Pl Nom);
SET NOT-DEM = WORD - Dem ;
LIST SG-PRON = (Pron Sg1) (Pron Sg2) (Pron Sg3) (Pron Sg) (Pron PxSg1) (Pron PxSg2) (Pron PxSg3) (pron p1 sg) (pron p2 sg) (pron p3 sg);
LIST DU-PRON = (Pron Du1) (Pron Du2) (Pron Du3) (Pron PxDu1) (Pron PxDu2) (Pron PxDu3) (pron p1 du) (pron p2 du) (pron p3 du);
LIST PL-PRON = (Pron Pl1) (Pron Pl2) (Pron Pl3) (Pron Pl) (Pron PxPl1) (Pron PxPl2) (Pron PxPl3) (pron p1 pl) (pron p2 pl) (pron p3 pl);
LIST DU-PRON-NOTPX = (Pron Du1) (Pron Du2) (Pron Du3) (pron p1 du) (pron p2 du) (pron p3 du) ;
LIST FIRST-PX = PxSg1 PxDu1 PxPl1 ;
LIST SECOND-PX = PxSg2 PxDu2 PxPl2 ;
LIST THIRD-PX = PxSg3 PxDu3 PxPl3 ;
LIST SG-PX = PxSg1 PxSg2 PxSg3 ;
LIST DU-PX = PxDu1 PxDu2 PxDu3 ;
LIST PL-PX = PxPl1 PxPl2 PxPl3 ;
LIST PX = PxSg1 PxDu1 PxPl1 PxSg2 PxDu2 PxPl2 PxSg3 PxDu3 PxPl3 ;
LIST DU-NR = Du1 Du2 Du3 ;
SET NOT-SG-PRON = DU-PRON OR PL-PRON ;
#!! !Adjectival sets and their complements
# -------------------------------------
SET A-CASE = A - Attr - Adv ;
LIST A-CC = A CC ;
SET NOT-A = WORD - A ; # This is former NOT-ADJ
SET NOT-A-COMMA = WORD - A - COMMA ;
SET NOT-Attr = WORD - Attr ;
SET NOT-A-PCLE = WORD - A - Pcle ;
SET NOT-A-CC = WORD - A-CC ;
# and many others
#!! !Adverbial sets and their complements
# ------------------------------------
SET LEX-ADV = Adv - (AA) ;
SET NOT-ADV-DE = WORD - Adv ;
SET NOT-ADV = NOT-ADV-DE OR CLB ;
SET NOT-ADV-N = NOT-ADV - N;
SET NOT-ADV-PCLE = NOT-ADV - Pcle ;
SET NOT-ADV-INDEF = NOT-ADV - Indef ;
SET NOT-ADV-PCLE-ILL-LOC-COM = WORD - Adv - Pcle - Ill - Loc - Com;
SET NOT-A-ADV-PCLE = WORD - Pcle - A - Adv ; #
#!! !Sets of elements with common syntactic behaviour
# ================================================
SETS
#!! !NP sets defined according to their morphosyntactic features
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LIST N-SG-NOM = (N Sg Nom);
LIST PROP = (N Prop);
SET COMMON-N = N - Prop;
SET HEAD-N = N - Cmp/SplitR ;
SET HEAD-N-NOM = (N Nom) - Cmp/SplitR ;
# SET SUBJECTHEAD = N OR A OR Pron - Refl ; # These, can be subject heads
SET NP = N OR A ; # anything that can take except numerals
SET NP-HEAD = Pron OR HEAD-N ;
SET NP-HEAD-SG = SG-PRON OR (N Sg) OR (A Sg) - Cmp/SplitR ;
SET NP-HEAD-PL = PL-PRON OR (N Pl) OR (A Pl) - Cmp/SplitR ;
SET NP-HEAD-SG-NOM = SG-PRON + Nom OR (N Sg Nom) OR (A Sg Nom) - Cmp/SplitR ;
SET NP-HEAD-PL-NOM = PL-PRON + Nom OR (N Pl Nom) OR (N Coll Nom) OR (A Pl Nom) - Cmp/SplitR ;
SET NP-HEAD-NOM = NP-HEAD-SG-NOM OR NP-HEAD-PL-NOM ;
SET NP-HEAD-ACC = (Pron Acc) OR (N Acc) OR (A Acc) - Cmp/SplitR - (Dem Attr);
SET NP-HEAD-GEN = (Pron Gen) OR (N Gen) OR (A Gen) - Cmp/SplitR - (Dem Attr) ;
#!! !The PRE-NP-HEAD family of sets
#!! These sets model noun phrases (NPs). The idea is to first define whatever can
#!! occur in front of the head of the NP, and thereafter negate that with the
#!! expression __WORD - premodifiers__.
SET PRE-NP-HEAD = (Prop Attr) OR (Prop @>N) OR (A Attr) OR (ABBR Attr)
OR (Pron Pers Gen) OR (N Gen) OR
Num OR Cmp/SplitR OR CC OR (Pron Dem) OR (Pron Refl Gen) OR (Indef Attr) OR
(PrfPrc @>N) OR PrsPrc OR (A Ord) ;
# The strict version of items that can only be premodifiers, not parts of the predicate
SET PRE-A-N = (Pron Pers Gen) OR (Pron Pers Acc) OR (Pron Indef) OR Num OR (A Ord) OR (Pron Dem) OR (Pron Refl Gen) OR (Pron Refl Acc) ;
SET NOT-PRE-A-N = WORD - PRE-A-N ;
LIST PUNCT-LEFT = (PUNCT LEFT) ;
LIST PUNCT-RIGHT = (PUNCT RIGHT) ;
SET NOT-NPMOD = WORD - PRE-NP-HEAD OR ABBR OR @CVP ;
# This is the previous NPNH (npnh) set.
# NOT-NPMOD = "NOT-PRE-NP-HEAD"
SET NOT-NPMOD-ACC = NOT-NPMOD - Acc OR ABBR ;
SET NOT-NPMOD-ACC-ADV = NOT-NPMOD - Acc - Adv OR ABBR ;
SET NOT-NPMODADV = WORD - PRE-NP-HEAD - Adv ;
SET NOT-NPMODADV-INDEF = WORD - PRE-NP-HEAD - Adv - Indef ;
SET NOT-N = WORD - N ;
SET NOT-N-A = WORD - N - A ;
SET NOT-NP = Inf OR Pcle OR Interj OR CS ;
SET NUM = Num ;
SET NOT-NUM = WORD - Num ;
SET NOT-CC = WORD - CC ;
SET NOT-PCLE = WORD - Pcle ;
SET REAL-CLB = CLB - COMMA ;
#!! !Border sets and their complements
# ---------------------------------
SET CP = (Pron Interr) OR (Pron Rel) ;
LIST BOUNDARYSYMBOLS = "\;" ":" "-" "–" ;
SET S-BOUNDARY = BOUNDARYSYMBOLS OR (@CVP) ;
SET BOC = S-BOUNDARY OR BOS ;
SET BOC-PUNCT = BOC - ("-") - ("–") ;
SET EOC = S-BOUNDARY OR EOS ;
SET NP-BOUNDARY = BOS OR EOS OR REAL-CLB OR Inf OR VGen OR Sup OR PPRON-NOT-GEN OR Recipr OR Po OR Pr OR Pcle OR Interj OR CS OR CP OR @CVP ;
SET SV-BOUNDARY = S-BOUNDARY OR Inf OR Sup OR FMAINV ;
SET CCCOMMA = CC OR COMMA ;
# remember that those are potential sentence boundaries, too
#!! !Grammarchecker sets
LIST &err-agr = &err-agr ;
LIST &err-gen-po = &err-gen-po ;
LIST &err-no-conneg = &err-no-conneg ;
LIST &err-orrood-inf = &err-orrood-inf ;
LIST &err-ext-agr = &err-ext-agr ;
LIST &err-ext-vagr = &err-ext-vagr ;
MAPPING-PREFIX = & ;
SECTION
# Speller suggestions rule – add &SUGGESTWF to any spelling suggestion
# that we actually want to suggest to the user.
# The simplest is to just add it to all spelled words:
ADD:spell-it-all (&typo &SUGGESTWF) () ;
# But perhaps you want to only suggest spellings of words that are not inside "quotes":
ADD:spell-conservatively (&typo &SUGGESTWF) () IF (NEGATE -1 QMARK LINK 2 QMARK);
# A simple grammar checker rule without suggestions: Ensure preceding nominal agrees with the verb
ADD:err-agr (&err-agr) TARGET V IF (-1C Sg + Nom) (0 V) (NOT 0 Sg3);
ADD:err-agr (&err-agr) TARGET V IF (-1C Pron + Sg1 + Nom) (0 V) (NOT 0 Sg1);
ADD:err-agr (&err-agr) TARGET V IF (-1C Pron + Sg2 + Nom) (0 V) (NOT 0 Sg2);
ADD:err-agr (&err-agr) TARGET V IF (-1C Pron + Pl1 + Nom) (0 V) (NOT 0 Pl1);
ADD:err-agr (&err-agr) TARGET V IF (-1C Pron + Pl2 + Nom) (0 V) (NOT 0 Pl2);
# And one with a suggestion where we simply change the tag Sg into Attr:
ADD:attr-not-pred (&attr-not-pred) TARGET (A Sg) IF (NOT 0 Attr OR Gen) (1 CC LINK *1 COMMON-N) ;
COPY:attr-not-pred (Attr &SUGGEST) EXCEPT (Sg) TARGET (&attr-not-pred) ;
# The method is: Add &SUGGEST to a copied reading to *generate* a
# suggestion form from that reading. The copy should contain the error
# tag too – &-prefixed error tags are ignored when generating, but
# used to create human-readable messages.
# Simple punctuation rules showing how to change the lemma in the suggestions:
ADD:use-guillemets (&guillemets) TARGET (""");
COPY:left-guillemet ("«" &SUGGEST) EXCEPT (""") TARGET (&guillemets) ;
COPY:right-guillemet ("»" &SUGGEST) EXCEPT (""") TARGET (&guillemets) ;
ADD:use-ellipsis (&ellipsis) TARGET ("...");
COPY:use-ellipsis ("…" &SUGGEST) EXCEPT ("...") TARGET (&ellipsis) ;