mmorph-2.3.4.2.orig/0040755000175000001440000000000006355143141013152 5ustar mvelausersmmorph-2.3.4.2.orig/data/0040755000175000001440000000000006265175606014076 5ustar mvelausersmmorph-2.3.4.2.orig/data/english0100644000175000001440000002640706046143510015442 0ustar mvelausers; MULTEXT morphology tool ; English morphology description for mmorph ; Version 2.3, October 1995 ; Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland ;; Rules for English inflection ;; Author: Graham Russell ;; Additions by: Susan Armstrong ;; ;; GJR ISSCO 20-1-95 ;; ;; SA ISSCO last change 16-5-95 ;;--------------------------------------------------------------- ;; Declare the surface and lexical alphabets. @ Alphabets lexical : 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 ; complex lexical symbols u_a u_e u_i u_o u_u x_o y_o ch qu "-" "'" "/" "." "_" "$" "%" 0 1 2 3 4 5 6 7 8 9 é î ï è ê ç â à ü á ô ä û £ 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 surface : 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 "-" "'" "/" "." "_" "$" "%" 0 1 2 3 4 5 6 7 8 9 é î ï è ê ç â à ü á ô ä û £ 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 ;; We could have a spelling rule that allowed e.g. lexical "â" ;; to match both surface "â" and surface "a". ;;--------------------------------------------------------------- ;; Declare the attributes we'll be using, together with their ;; possible values. @ Attributes ;; NUMber: SinGular and PLural ;; num : sg pl ;; PERson: 1st, 2nd, 3rd ;; per : 1 2 3 ;; GENder: masculine, feminine, neuter ;; gen : m f n ;; VFM (Verb ForM) values: ;; bse - "base" (read, eat, walk, etc.) ;; prp - "present participle" (reading, eating, walking, etc.) ;; psp - "past participle" (read, ate, walked, etc.) ;; pres - "present finite" (read, reads, eat, eats, etc.) ;; past - "past finite" (read, ate, walked, etc.) ;; ; vfm : pres past bse psp prp ; vfm : fin bse psp prp vfm : fin pres past bse psp prp tns : pres past ;; DEGree of adjectives: BaSE, COMParative, and SUPerlative ;; deg : pos comp sup ;; INFLectable (i.e. complete word)? ;; infl : yes no ;; Classification of (ir)regular items. ;; ;; Verbs: ;; r regular: past tense in -(e)d - past participle in -(e)d ;; i1 regular past tense, irregular past participle ;; i2 irregular past tense and past participle ;; i3 dual form past tense and past participle ;; ;; Nouns: ;; r regular plural in -(e)s ;; i irregular/non-existent plural ;; ;; Adjectives: ;; r comparative/superlative in -(e)r/-(e)st, adverb in -ly ;; r1 comparative/superlative in -(e)r/-(e)st, adverb in -ally (none?) ;; r2 comparative/superlative in -(e)r/-(e)st, no -ly adverb ;; i no lexical comparative/superlative, adverb in -ly ;; i1 no lexical comparative/superlative, adverb in -ally ;; i2 no lexical comparative/superlative, no -(al)ly adverb r : r r1 r2 i1 i2 i3 i ;; TYP is where we put things we don't know what to call... ;; SA - added dummy to get any disjunction to print out typ : c p p1 p2 v a m per ref gen poss sub crd ind def ord card cmp dummy ;; type of complement for a subordinating conjunction: ;; finite (tensed sentence), infinitival, subjunctive, obligatory "that" ctyp: f i s t ;; position of a coordinating conjunction: ;; initial (both, neither, either), medial (and, but, or, nor) cpos: i m case: nom acc ;; number, person gender of "possessor": ;; p_num: sg pl p_per: 1 2 3 p_gen: m f n ;; "function" of an adverb: ;; modifier (quickly, soon,...), specifier (very, too, how,...) fn : mod spe ;; q: questions only; r: relatives only (q|r for both, obviously) wh : no q r ;; POSition of a coordinating conjunction pos : pre post ;; all types need to be declared with at least one attribute, ;; which must have at least one value. Use this when they are ;; not needed in the description dummy : perhaps ;; TEMPORARY NEW ATTRIBUTES FOR FULL CORPUS COVERAGE ;; SA - ADDED char for single character symbols, acro(nym), code, for(eign) ;; and "s" for the possessive "'s" marker ;; ttyp for temporary type ttyp : char acro code for s ;;--------------------------------------------------------------- ;; Declare the "types" we'll be using, together with their ;; attributes. Attributes following "|" won't be printed out ;; SA added a few new (perhaps temporary) attributes @ Types N : num typ gen | r A : deg | r ; V : vfm num per typ | infl r V : tns vfm num per typ | r Adv : deg fn wh nsuf : num adjsuf : deg ; vsuf : num per vfm r vsuf : tns num per vfm | r advsuf : r Det : typ wh num p_num p_per p_gen C : typ ctyp cpos Pro : typ wh per num gen case p_num p_gen p_per Num : typ Adp : pos ;; ;; SA - new ;; ABBR : ttyp POSS : ttyp MISC : ttyp SYMB : ttyp ;;--------------------------------------------------------------- ;; Word-structure rules. @ Grammar ;; Goal rules define what counts as a good complete word: ;; GoalN: N[] GoalA: A[] GoalV: V[] GoalAdv: Adv[] ;; No other rules for subsequent categories: GoalC: C[] GoalPro: Pro[] GoalDet: Det[] GoalNum: Num[] GoalAdp: Adp[] ;; SA added some new "words" GoalABBR: ABBR[] GoalPOS: POSS[] GoalMISC: MISC[] GoalSYMB: SYMB[] ;; ;; Plural nouns. The RHS noun feature structure will not ;; unify with lexical entries marked as 'r=i', so nouns ;; with irregular or non-existent plurals are not accepted. ;; NPL : N[num=pl typ=c gen=$g] <- N[num=sg typ=c gen=$g r=r] nsuf[num=pl] ;; affixes for this rule: ;; N.plural : "s" nsuf[num=pl] ;; ;; Comparative and superlative adjectives. The value of 'deg' ;; in the LHS and the suffix is unified - and restricted to ;; 'comp' or 'sup' ;; ADJ1 : A[deg=$deg=comp|sup] <- A[deg=pos r=r|r2] adjsuf[deg=$deg] ADJ.comparative : "er" adjsuf[deg=comp] ADJ.superlative : "est" adjsuf[deg=sup] ;; Adverb from adjective. The 'r' value in the stem controls ;; whether this rule can apply, and if it does which suffix is ;; involved. ADV : Adv[fn=mod deg=pos wh=no] <- A[deg=pos r=$r] advsuf[r=$r] ADV.ly1 : "ly" advsuf[r=r|i] ADV.ly2 : "ally" advsuf[r=r1|i1] ;; ;; Various verb forms. Again we restrict application by referring ;; to the value of 'r'. ;; ; VB1 : V[vfm=pres num=sg per=3 typ=v] ; <- V[vfm=bse typ=v] ; vsuf[vfm=pres] VB1 : V[vfm=fin tns=$tns num=$num per=$per typ=v] <- V[vfm=bse typ=v r=$r] vsuf[vfm=fin tns=$tns num=$num per=$per r=$r] ; VB2 : V[vfm=$vfm typ=v] ; <- V[vfm=bse typ=v r=$r] ; vsuf[vfm=$vfm!=pres r=$r] VB2 : V[vfm=$vfm typ=v] <- V[vfm=bse typ=v r=$r] vsuf[vfm=$vfm=prp|psp r=$r] ;; affixes ; VB.pres : "s" vsuf[vfm=pres] ; VB.past.reg : "ed" vsuf[vfm=psp|past r=r|i3] ; VB.past.i1 : "ed" vsuf[vfm=past r=i1] VB.pres : "s" vsuf[vfm=fin tns=pres per=3 num=sg] VB.prp : "ing" vsuf[vfm=prp] VB.psp : "ed" vsuf[vfm=psp r=r|i3] VB.pfin : "ed" vsuf[vfm=fin tns=past r=r|i1] ;;=============================================================== ;; ;; Spelling Rules ;; ;;--------------------------------------------------------------- ;; Define character classes and give them names. @ Classes CO: b c d f g h j k l m n p q r s t v w x z SC: s c ;;--------------------------------------------------------------- ;; Define names for sets of pairs of characters. ;; "X/Y" matches X in surface string and Y in lexical string. ;; "/Z" matches surface string XY and lexical string Y. ;; "<>" matches the empty string. @ Pairs l1_s2_SZ: /s /z l1_s2: /b /c /d /g /k /l /m /n

/p /r /t /v SXZ: s/s x/x z/z ;; We can "inherit" from other pair sets, provided that they have ;; already been defined (i.e. before the compiler sees this): I_YSXZ: i/y SXZ EI: e/e i/i ;; Plain vowel character matches, inherited by "VV": V_no_u_V: a/a e/e i/i o/o u/u o/x_o o/y_o ;; Lexical unstressed vowel characters matched with surface plain: lUnStr_sPlain: a/u_a e/u_e i/u_i o/u_o u/u_u ;; Complex lexical symbols corresponding to surface character ;; sequences: lComplex_sSimple: lUnStr_sPlain /qu /ch ;; The general "VV" pair set includes the lexical "u_V" symbols, ;; representing the "unstressed Vs" used in rules lex_1_surf_2[ab]. VV: lUnStr_sPlain V_no_u_V ;; Consonant pairs augmented with a match for /qu. Lexical ;; "qu" behaves like a consonant and not a consonant-vowel ;; sequence for the purpose of rules lex_1_surf_2[ab]. CC: b/b c/c d/d f/f g/g h/h j/j k/k l/l m/m n/n p/p q/q r/r s/s t/t v/v w/w x/x z/z ?/qu ?/ch lO2_sOE: /x_o /y_o lO2_sO: o/x_o o/y_o LE: e/e l/l V_no_a: e/e i/i o/o u/u y/y LNR: l/l n/n r/r CC_no_LNR: b/b c/c d/d f/f g/g h/h j/j k/k m/m p/p q/q s/s t/t v/v w/w x/x z/z ?/qu l1_s2_no_c: /b /d /g /k /l /m /n

/p /r /s /t /v /z SS_or_VV: VV s/s VV_no_u: a/a e/e i/i o/o o/x_o o/y_o CC_no_q: b/b c/c d/d f/f g/g h/h j/j k/k l/l m/m n/n p/p r/r s/s t/t v/v w/w x/x z/z not_E: CC lUnStr_sPlain a/a i/i o/o u/u y/y ;;--------------------------------------------------------------- ;; The spelling rules. ;; ;; left_context - focus - right_context ;; "*" matches morpheme boundary ;; "?" matches anything @ Spelling ; lex_1_surf_2a: ; ;; big+er->bigger, hop+ing->hopping, tap+ed->tapped, etc. ; ;; Preceding vowel pair must not be e/u_e - see lexical entries ; ;; for "offer" and "prefer" ; <=> CC V_no_u_V - l1_s2 - * VV lex_1_surf_2b: ;; bus+s->busses, fez+s->fezzes, quiz+s->quizzes, etc <=> CC V_no_u_V - l1_s2_SZ * - s/s Gem_1: <=> CC V_no_u_V - l1_s2_no_c - * VV Gem_2: <=> CC V_no_u_V - /c - * V_no_a Gem_3: <=> CC V_no_u_V - /c - * a/a CC_no_LNR lex_Odd_surf_Plain: ;; Complex lexical symbols match their associated surface sequences ;; everywhere <=> - lComplex_sSimple - surfonly_E_1: ;; boss+s<->bosses, box+s<->boxes <=> SXZ * - e/<> - s/s surfonly_E_2: ;; dish+s<->dishes, catch+s<->catches <=> SC h/h * - e/<> - s/s surfonly_E_3: ;; potato+s<->potatoes, avocado+s<->avocadoes (e optional) => CO - lO2_sOE - * s allow_lO2_sO: ;; avocado+s<-> avocados, echo<->echo => - lO2_sO - block_lO2_nosE: ;; echo+s<->echoes (e not optional) <= - /y_o - * s ; lexonly_E1: ; ;; large+est<->largest, agree+ed<->agreed ; <=> - <>/e - * EI lexonly_E1a: ;; large+est<->largest, agree+ed<->agreed <=> e/e - <>/e - * e/e lexonly_E1b: ;; large+est<->largest, agree+ed<->agreed <=> not_E - <>/e - * EI ;; Because of the behaviour of qu, we must split the next one into ;; two parts, one for left contexts without a u/u pair, and one for ;; u/u preceded by a non-q: ;; true+ly<->truly, but oblique+ly<->obliquely lexonly_E2a: <=> VV_no_u - <>/e - * l/l lexonly_E2b: <=> CC_no_q u/u - <>/e - * l/l lex_Y_surf_I: ;; easy+er<->easier, carry+s<->carries, heavy+ly<->heavily <=> CO - i/y - * LE lex_Y_surf_IE: ;; fry+s<->fries <=> CO - /y - * s/s lex_I_surf_Y: ;; lie+ing<->lying, etc. <=> - y/i <>/e - * i/i lex_LE_surf_0: <=> CC - <>/l <>/e - * l y lex_only_L: ;; full+ly<->fully <=> l/l - <>/l - * l/l ;;--------------------------------------------------------------- @ Lexicon #include "lex.proper" #include "lex.exp.N" #include "lex.exp.A" #include "lex.exp.V" #include "lex.exp.minor" ;;--------------------------------------------------------------- mmorph-2.3.4.2.orig/data/example0100644000175000001440000000565706045657371015466 0ustar mvelausers; mmorph, MULTEXT morphology tool ; Version 2.3, October 1995 ; Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland ; This file shows various constructs possible in the declarations. ; It is also an small example to show how Grammar and Spelling interact ; for the morphology of French adjectives. ; It makes no claim as for the linguistic soundness of the approach :-) ; declaration of lexical and surface alphabet @ Alphabets lexical : 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 à é è ê ä ü ö " " "\"" "." "," "?" "!" surface : 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 à é è ê ä ü ö " " "\"" "." "," "?" "!" ; Declarations of attribute with their possible values @ Attributes gender : masculine feminine none number : singular plural none person : 1 2 3 form : stem surface ; Declarations of category types with their associated attribute list ; the bar | separates the attributes to keep from those to throw away @ Types Adjective : gender number | form Noun : gender number | form AdjSuffix : gender number NounSuffix : number ; Composition rules @ Grammar SurfaceA : Adjective[form=surface] Plural : Adjective[ gender=$1 number=plural form=surface ] <- Adjective[number=singular gender=$1] AdjSuffix[number=plural] s : "s" AdjSuffix[number=plural gender=none] ; make females out of males Feminine : Adjective[ gender=feminine number=singular form=$A=surface|stem] <- Adjective[gender=masculine number=singular form=$A] AdjSuffix[gender=feminine] e : "e" AdjSuffix[gender=feminine number=none] @ Classes Vowel : a e i o u y Punct : " " "." "\"" "," "?" "!" Vowel_not_a : e i o u y Consonnant: b c d f g h j k l m n p q r s t v w x z cs : c s @ Pairs ; showing explicit pair declarations Vowel1: a / a e / e i / i ; abbreviated notation Consonnant2: c d ; question mark indicates any match (its like the = found in some literature) SurfaceVowel: Vowel/? Double_n_s_t: " " / " " / t / s / n Double_l: / l s_x: s x Insert_d: d / <> Insert_e: e / <> Delete_s: <>/s Boundary: <>/? ; hack to match either morpheme (+) or word (~) boundary @ Spelling ; grosse/gros+e Double : <=> Vowel - Double_n_s_t - * e ; Vowel - Double_n_s_t - * e Boundary ; nulle/nul+e Double_l: <=> Vowel_not_a - Double_l - * e ; creux/creux+s Delete_s: <=> s_x * - Delete_s - ~ ; test test: <=> a * - " " /" " - ~ ; égaux/égal+s al_aux: <=> a - u/l * x/s - ~ ; creuse/creux+e eux_euse: <=> e u - s/x - * e ; belle/beau+e eau_elle: <=> e - l/a l/u - * ?/e ; beaux/beau+s au_aux: <=> a/? u/? * - x/s - ~ ; esquimaude/esquimau+e au_aude: <=> a u * - Insert_d - ?/e ; Lexical entries (stems and also some surface forms) @ Lexicon Adjective[ gender=masculine number=singular form=surface ] "beau" "égal" "bas" "sot" "creux" "bon" "nul" "esquimau" mmorph-2.3.4.2.orig/data/example.lookup0100644000175000001440000000377606000476462016765 0ustar mvelausers"\0351gal" = "\0351gal" Adjective[ gender=masculine number=singular ] "\0351gale" = "\0351gal" Adjective[ gender=feminine number=singular ] "\0351gales" = "\0351gal" Adjective[ gender=feminine number=plural ] "\0351gaux" = "\0351gal" Adjective[ gender=masculine number=plural ] "bas" = "bas" Adjective[ gender=masculine number=plural ] "bas" = "bas" Adjective[ gender=masculine number=singular ] "basse" = "bas" Adjective[ gender=feminine number=singular ] "basses" = "bas" Adjective[ gender=feminine number=plural ] "beau" = "beau" Adjective[ gender=masculine number=singular ] "beaux" = "beau" Adjective[ gender=masculine number=plural ] "belle" = "beau" Adjective[ gender=feminine number=singular ] "belles" = "beau" Adjective[ gender=feminine number=plural ] "bon" = "bon" Adjective[ gender=masculine number=singular ] "bonne" = "bon" Adjective[ gender=feminine number=singular ] "bonnes" = "bon" Adjective[ gender=feminine number=plural ] "bons" = "bon" Adjective[ gender=masculine number=plural ] "creuse" = "creux" Adjective[ gender=feminine number=singular ] "creuses" = "creux" Adjective[ gender=feminine number=plural ] "creux" = "creux" Adjective[ gender=masculine number=plural ] "creux" = "creux" Adjective[ gender=masculine number=singular ] "esquimau" = "esquimau" Adjective[ gender=masculine number=singular ] "esquimaude" = "esquimau" Adjective[ gender=feminine number=singular ] "esquimaudes" = "esquimau" Adjective[ gender=feminine number=plural ] "esquimaux" = "esquimau" Adjective[ gender=masculine number=plural ] "nul" = "nul" Adjective[ gender=masculine number=singular ] "nulle" = "nul" Adjective[ gender=feminine number=singular ] "nulles" = "nul" Adjective[ gender=feminine number=plural ] "nuls" = "nul" Adjective[ gender=masculine number=plural ] "sot" = "sot" Adjective[ gender=masculine number=singular ] "sots" = "sot" Adjective[ gender=masculine number=plural ] "sotte" = "sot" Adjective[ gender=feminine number=singular ] "sottes" = "sot" Adjective[ gender=feminine number=plural ] mmorph-2.3.4.2.orig/data/example.test0100644000175000001440000000460005767526406016433 0ustar mvelausers"beaux" = "beau" Adjective[ gender=masculine number=plural form=surface ] "belles" = "beau" Adjective[ gender=feminine number=plural form=surface ] "belle" = "beau" Adjective[ gender=feminine number=singular form=surface ] "beau" = "beau" Adjective[ gender=masculine number=singular form=surface ] "\0351gaux" = "\0351gal" Adjective[ gender=masculine number=plural form=surface ] "\0351gales" = "\0351gal" Adjective[ gender=feminine number=plural form=surface ] "\0351gale" = "\0351gal" Adjective[ gender=feminine number=singular form=surface ] "\0351gal" = "\0351gal" Adjective[ gender=masculine number=singular form=surface ] "bas" = "bas" Adjective[ gender=masculine number=plural form=surface ] "basses" = "bas" Adjective[ gender=feminine number=plural form=surface ] "basse" = "bas" Adjective[ gender=feminine number=singular form=surface ] "bas" = "bas" Adjective[ gender=masculine number=singular form=surface ] "sots" = "sot" Adjective[ gender=masculine number=plural form=surface ] "sottes" = "sot" Adjective[ gender=feminine number=plural form=surface ] "sotte" = "sot" Adjective[ gender=feminine number=singular form=surface ] "sot" = "sot" Adjective[ gender=masculine number=singular form=surface ] "creux" = "creux" Adjective[ gender=masculine number=plural form=surface ] "creuses" = "creux" Adjective[ gender=feminine number=plural form=surface ] "creuse" = "creux" Adjective[ gender=feminine number=singular form=surface ] "creux" = "creux" Adjective[ gender=masculine number=singular form=surface ] "bons" = "bon" Adjective[ gender=masculine number=plural form=surface ] "bonnes" = "bon" Adjective[ gender=feminine number=plural form=surface ] "bonne" = "bon" Adjective[ gender=feminine number=singular form=surface ] "bon" = "bon" Adjective[ gender=masculine number=singular form=surface ] "nuls" = "nul" Adjective[ gender=masculine number=plural form=surface ] "nulles" = "nul" Adjective[ gender=feminine number=plural form=surface ] "nulle" = "nul" Adjective[ gender=feminine number=singular form=surface ] "nul" = "nul" Adjective[ gender=masculine number=singular form=surface ] "esquimaux" = "esquimau" Adjective[ gender=masculine number=plural form=surface ] "esquimaudes" = "esquimau" Adjective[ gender=feminine number=plural form=surface ] "esquimaude" = "esquimau" Adjective[ gender=feminine number=singular form=surface ] "esquimau" = "esquimau" Adjective[ gender=masculine number=singular form=surface ] mmorph-2.3.4.2.orig/data/example.words0100644000175000001440000000030206000476464016572 0ustar mvelauserségal égale égales égaux bas basse basses beau beaux belle belles bon bonne bonnes bons creuse creuses creux esquimau esquimaude esquimaudes esquimaux nul nulle nulles nuls sot sots sotte sottes mmorph-2.3.4.2.orig/data/german0100644000175000001440000002131206045657410015260 0ustar mvelausers; mmorph, MULTEXT morphology tool ; Version 2.3, October 1995 ; Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland ; Dominique Petitpierre, ; Example rules for a german: substantives ; declaration of lexical and surface alphabet @ Alphabets lexical : 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 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 ä ö ü ß Ä Ö Ü umlautable_a umlautable_o umlautable_u umlautable_A umlautable_O umlautable_U surface : 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 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 ä ö ü ß Ä Ö Ü ; Declarations of attribute with their possible values @ Attributes Genus : maskulinum femininum neutrum none Numerus : singular plural none Kasus : nominativ genitiv dativ akkusativ none Form : stem surface Singulartyp : s1 s2 s3 ; Duden s. 234 Pluraltyp : p1 p2 p3 p4 p5 ; Duden s. 239 AdjKlasse : farbe none CausesUmlaut : yes no ; Declarations of category types with their associated attribute list ; the bar | separates the attributes to keep from those to throw away @ Types Substantiv : Genus Numerus Kasus | Singulartyp Pluraltyp Form SubstantivFlexion : Genus Numerus Kasus Singulartyp Pluraltyp Adjektiv : Genus Numerus Kasus | AdjKlasse Form AdjSubstSuffix : Singulartyp Pluraltyp AdjKlasse CausesUmlaut ; Composition rules @ Grammar Substantiv : Substantiv[Form=surface] Adjektiv : Adjektiv[Form=surface] Deklination : Substantiv[ Genus=$1 Numerus=$2 Kasus=$3 Singulartyp=$4 Pluraltyp=$5 Form=surface ] <- Substantiv[ Numerus=singular Kasus=nominativ Genus=$1 Singulartyp=$4 Pluraltyp=$5 ] SubstantivFlexion[ Numerus=$2 Kasus=$3 Singulartyp=$4 Pluraltyp=$5] Derivation : Substantiv[ Genus=$1 Numerus=singular Kasus=nominativ Singulartyp=$4 Pluraltyp=$5 Form=surface ] <- Adjektiv[ Numerus=singular Kasus=nominativ Genus=$1 AdjKlasse=$6 ] AdjSubstSuffix[ AdjKlasse=$6 Singulartyp=$4 Pluraltyp=$5 ] FarbAdj : Substantiv[ Genus=$1 Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p3 Form=surface ] <- Adjektiv[ Numerus=singular Kasus=nominativ Genus=$1 AdjKlasse=farbe Form=surface ] ;FarbNoun : Adjektiv[ Numerus=singular Kasus=nominativ Genus=maskulinum ; AdjKlasse=farbe Form=surface ] ; <- Substantiv[ Genus=maskulinum Numerus=singular Kasus=nominativ ; Singulartyp=s1 Pluraltyp=p3 Form=surface ] ; singular Duden s. 234 s1_genitiv : "es" SubstantivFlexion[ Numerus=singular Kasus=genitiv Singulartyp=s1] s1_dativ : "e" SubstantivFlexion[ Numerus=singular Kasus=dativ Singulartyp=s1] s1_akkusativ: "" SubstantivFlexion[ Numerus=singular Kasus=akkusativ Singulartyp=s1] s2_genitiv : "en" SubstantivFlexion[ Numerus=singular Kasus=genitiv Singulartyp=s2] s2_dativ : "en" SubstantivFlexion[ Numerus=singular Kasus=dativ Singulartyp=s2] s2_akkusativ: "en" SubstantivFlexion[ Numerus=singular Kasus=akkusativ Singulartyp=s2] s3_genitiv : "" SubstantivFlexion[ Numerus=singular Kasus=genitiv Singulartyp=s3] s3_dativ : "" SubstantivFlexion[ Numerus=singular Kasus=dativ Singulartyp=s3] s3_akkusativ: "" SubstantivFlexion[ Numerus=singular Kasus=akkusativ Singulartyp=s3] ; plural Duden s. 238 p1_nominativ: "e" SubstantivFlexion[ Numerus=plural Kasus=nominativ Pluraltyp=p1] p1_genitiv : "e" SubstantivFlexion[ Numerus=plural Kasus=genitiv Pluraltyp=p1] p1_dativ : "en" SubstantivFlexion[ Numerus=plural Kasus=dativ Pluraltyp=p1] p1_akkusativ: "e" SubstantivFlexion[ Numerus=plural Kasus=akkusativ Pluraltyp=p1] p2_nominativ: "" SubstantivFlexion[ Numerus=plural Kasus=nominativ Pluraltyp=p2] p2_genitiv : "" SubstantivFlexion[ Numerus=plural Kasus=genitiv Pluraltyp=p2] p2_dativ : "n" SubstantivFlexion[ Numerus=plural Kasus=dativ Pluraltyp=p2] p2_akkusativ: "" SubstantivFlexion[ Numerus=plural Kasus=akkusativ Pluraltyp=p2] p3_nominativ: "en" SubstantivFlexion[ Numerus=plural Kasus=nominativ Pluraltyp=p3] p3_genitiv : "en" SubstantivFlexion[ Numerus=plural Kasus=genitiv Pluraltyp=p3] p3_dativ : "en" SubstantivFlexion[ Numerus=plural Kasus=dativ Pluraltyp=p3] p3_akkusativ: "en" SubstantivFlexion[ Numerus=plural Kasus=akkusativ Pluraltyp=p3] p4_nominativ: "er" SubstantivFlexion[ Numerus=plural Kasus=nominativ Pluraltyp=p4] p4_genitiv : "er" SubstantivFlexion[ Numerus=plural Kasus=genitiv Pluraltyp=p4] p4_dativ : "ern" SubstantivFlexion[ Numerus=plural Kasus=dativ Pluraltyp=p4] p4_akkusativ: "er" SubstantivFlexion[ Numerus=plural Kasus=akkusativ Pluraltyp=p4] p5_nominativ: "s" SubstantivFlexion[ Numerus=plural Kasus=nominativ Pluraltyp=p5] p5_genitiv : "s" SubstantivFlexion[ Numerus=plural Kasus=genitiv Pluraltyp=p5] p5_dativ : "s" SubstantivFlexion[ Numerus=plural Kasus=dativ Pluraltyp=p5] p5_akkusativ: "s" SubstantivFlexion[ Numerus=plural Kasus=akkusativ Pluraltyp=p5] adjderiv1 : "" AdjSubstSuffix[ AdjKlasse=farbe CausesUmlaut=no Singulartyp=s1 Pluraltyp=p3] adjderiv2 : "heit" AdjSubstSuffix[ AdjKlasse=none CausesUmlaut=no Singulartyp=s3 Pluraltyp=p3 ] @ Classes lnr: l n r @ Pairs Dont_umlaut: a/umlautable_a u/umlautable_u o/umlautable_o A/umlautable_A U/umlautable_U O/umlautable_O Do_umlaut: ä/umlautable_a ü/umlautable_u ö/umlautable_o Ä/umlautable_A Ü/umlautable_U Ö/umlautable_O Vokal: a e i o u ä ö ü ä/umlautable_a ü/umlautable_u ö/umlautable_o Delete_e: <>/e Capitalize: A/a B/b C/c D/d E/e F/f G/g H/h I/i J/j K/k L/l M/m N/n O/o P/p Q/q R/r S/s T/t U/u V/v W/w X/x Y/y Z/z @ Spelling Default_umlautable: => - Dont_umlaut - Umlauting: <=> - Do_umlaut - SubstantivFlexion[Numerus=plural] AdjSubstSuffix[CausesUmlaut=yes] Delete_e: <=> e * - Delete_e - D2: <=> l i n g * - Delete_e - D3: <=> l e i n * - Delete_e - D4: <=> e lnr * - Delete_e - D5: <=> Vokal h * - Delete_e - D6: <=> Vokal * - Delete_e - s D7: <=> c k * - Delete_e - D8: <=> * + - Delete_e - s AdjSubstSuffix[AdjKlasse=farbe] D9: <=> * + - Delete_e - ~ AdjSubstSuffix[AdjKlasse=farbe] Capitalize: <=> ~ - Capitalize - AdjSubstSuffix[] ; Lexical entries (stems and also some surface Forms) @ Lexicon Adjektiv[ Genus=maskulinum Numerus=singular Kasus=nominativ AdjKlasse=farbe Form=surface ] "grün" Adjektiv[ Genus=maskulinum Numerus=singular Kasus=nominativ AdjKlasse=none Form=surface ] "kl¨autable_a;r" = "klar" Substantiv[ Genus=femininum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p1 Form=surface ] "H¨autable_a;nd" = "Hand" Substantiv[ Genus=femininum Numerus=singular Kasus=nominativ Singulartyp=s3 Pluraltyp=p2 Form=surface ] "M¨autable_u;tter" = "Mutter" Substantiv[ Genus=femininum Numerus=singular Kasus=nominativ Singulartyp=s3 Pluraltyp=p3 Form=surface ] "Frau" Substantiv[ Genus=femininum Numerus=singular Kasus=nominativ Singulartyp=s3 Pluraltyp=p5 Form=surface ] "Oma" Substantiv[ Genus=maskulinum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p1 Form=surface ] "Tag" Substantiv[ Genus=maskulinum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p2 Form=surface ] "¨autable_A;pfel" = "Apfel" Substantiv[ Genus=maskulinum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p3 Form=surface ] "Staat" Substantiv[ Genus=maskulinum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p4 Form=surface ] "M¨autable_a;nn" = "Mann" "W¨autable_a;ld" = "Wald" Substantiv[ Genus=maskulinum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p5 Form=surface ] "Opa" Substantiv[ Genus=maskulinum Numerus=singular Kasus=nominativ Singulartyp=s2 Pluraltyp=p3 Form=surface ] "Mensch" Substantiv[ Genus=neutrum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p1 Form=surface ] "Jahr" Substantiv[ Genus=neutrum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p2 Form=surface ] "Segel" Substantiv[ Genus=neutrum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p3 Form=surface ] "Auge" Substantiv[ Genus=neutrum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p4 Form=surface ] "Bild" Substantiv[ Genus=neutrum Numerus=singular Kasus=nominativ Singulartyp=s1 Pluraltyp=p5 Form=surface ] "Deck" Substantiv[ Genus=neutrum Numerus=singular Kasus=nominativ Singulartyp=s3 Pluraltyp=p1 Form=surface ] "Kr¨autable_a;ft" = "Kraft" mmorph-2.3.4.2.orig/data/lex.exp.A0100644000175000001440000016444106046143512015556 0ustar mvelausers; MULTEXT morphology tool ; English morphology description for mmorph ; Version 2.3, October 1995 ; Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland ;; Lexical entries for English; Adjectives. ;; Author: Graham Russell ;; Additions by: Susan Armstrong ;; ;; GJR ISSCO 20-1-95 ;; ;; SA ISSCO last change 16-5-95 ;;--------------------------------------------------------------- A[ deg=comp ] "better" = "good" "elder" "further" "lesser" "squatter" = "squat" "squattest" = "squat" "worse" = "bad" A[ deg=pos r=i ] "abashed" "abdominal" "aberrant" "abhorrent" "abnormal" "abominable" "abortive" "above-average" "abrasive" "absent-minded" "absolute" "absorbent" "absorbing" "abstemious" "abstract" "absurd" "abundant" "abusive" "abysmal" "acceptable" "accessible" "accident-prone" "accidental" "accommodating" "accountable" "accurate" "achievable" "acid" "acoustic" "acquisitive" "acrimonious" "active" "actual" "actuarial" "adamant" "adaptable" "additional" "adept" "adequate" "adhesive" "adjacent" "adjectival" "adjustable" "administrative" "admirable" "admissible" "adorable" "advantageous" "adventurous" "adverbial" "adverse" "advisable" "aerial" "aeronautical" "affable" "affected" "affectionate" "affirmative" "affluent" "affordable" "affronted" "ageless" "aggregate" "aggressive" "aggrieved" "agile" "agonizing" "agreeable" "agricultural" "aimless" "all-embracing" "all-important" "allegorical" "allowable" "alluring" "almighty" "aloof" "alphabetical" "alternate" "alternative" "amateurish" "amazing" "ambidextrous" "ambient" "ambiguous" "ambitious" "ambivalent" "ambulatory" "amenable" "amiable" "amicable" "amoral" "amorous" "amorphous" "amphibious" "amusing" "anal" "analogous" "analytical" "anarchical" "anatomical" "ancestral" "angular" "animated" "annoying" "annual" "anomalous" "anonymous" "answerable" "antenatal" "anterior" "antiquated" "antisocial" "anxious" "apolitical" "appalling" "appealing" "appetizing" "applicable" "appreciable" "appreciative" "apprehensive" "approachable" "appropriate" "approximate" "arbitrary" "archaeological" "archeological" "architectural" "ardent" "arduous" "arguable" "argumentative" "arid" "arrogant" "arterial" "artful" "articulate" "artificial" "artless" "asexual" "ashamed" "ashen" "assertive" "assiduous" "astonishing" "astounding" "astringent" "astrological" "astute" "asymmetrical" "atrocious" "attachable" "attainable" "attendant" "attentive" "attractive" "attributable" "audacious" "audible" "audio-visual" "audiovisual" "auditory" "august" "aural" "auspicious" "authoritarian" "authoritative" "autobiographical" "automotive" "autonomous" "available" "avant-garde" "avaricious" "average" "avid" "avoidable" "awe-inspiring" "awesome" "babyish" "backward" "bacterial" "bad" "bad-tempered" "baleful" "banal" "bandy-legged" "bankrupt" "barbarous" "baroque" "bashful" "beaming" "bearable" "beautiful" "becoming" "belated" "believable" "belligerent" "beloved" "beneficial" "benevolent" "bent" "bewildered" "bewitching" "biannual" "biblical" "bibliographical" "big-hearted" "bigheaded" "bigoted" "bilateral" "bilingual" "bilious" "binary" "binocular" "biochemical" "biocidal" "biodegradable" "biological" "biotechnological" "bisexual" "biting" "bittersweet" "bituminous" "blameless" "blasphemous" "blatant" "blinking" "blissful" "bloated" "bloodless" "bloody-minded" "blooming" "blotchy" "blustering" "blustery" "boastful" "bogus" "boisterous" "boldface" "bookable" "boorish" "boring" "botanical" "bothersome" "bottomless" "boundless" "bounteous" "bountiful" "bovine" "boyish" "bracing" "brainless" "brazen" "breakable" "breath-taking" "breathless" "bridal" "brilliant" "broad-minded" "broken" "broken-hearted" "bronchial" "bronzed" "brutal" "brutish" "budgetary" "bulky" "bumptious" "buoyant" "burdensome" "burning" "bustling" "busy" "calamitous" "calculable" "callous" "callow" "candid" "cantankerous" "capable" "capital" "capricious" "captive" "cardinal" "careful" "careless" "carnal" "casual" "categorial" "categorical" "causal" "cautious" "cavalier" "ceaseless" "celebrated" "celestial" "centennial" "central" "centrifugal" "ceremonial" "certain" "challenging" "changeable" "changing" "charitable" "charming" "cheerful" "cheerless" "chemical" "chewable" "chic" "chief" "childish" "chivalrous" "choral" "chronological" "churlish" "circuitous" "circular" "circumspect" "civilized" "clandestine" "classical" "clerical" "clinical" "coeducational" "cogent" "cohesive" "cold-blooded" "collapsible" "collateral" "collected" "collective" "collegiate" "colloquial" "colonial" "colorful" "colossal" "colourful" "combustible" "comfortable" "commemorative" "commendable" "commensurate" "commercial" "communal" "communicative" "comparable" "comparative" "compassionate" "compatible" "compelling" "compensatory" "competent" "competitive" "complacent" "complementary" "complete" "complex" "compliant" "complicated" "composed" "composite" "compound" "comprehensive" "compulsive" "compulsory" "computable" "concave" "conceited" "conceivable" "conceptual" "concerted" "concessionary" "conciliatory" "concise" "conclusive" "concrete" "concurrent" "condescending" "conditional" "conducive" "conductive" "confederate" "confident" "confidential" "conflicting" "confounded" "confused" "confusing" "congenial" "congenital" "congested" "congregational" "congressional" "congruent" "conical" "conjugal" "connective" "connubial" "conscientious" "conscious" "consecutive" "consequent" "conservative" "considerable" "considerate" "consistent" "consonantal" "conspicuous" "constant" "constipated" "constitutional" "constrained" "constructive" "consultative" "contagious" "contemporary" "contemptible" "contemptuous" "content" "contented" "contentious" "contiguous" "continental" "contingent" "continual" "continuous" "contractual" "contradictory" "contrary" "contrasting" "contributory" "contrite" "controversial" "convenient" "conventional" "conversational" "converse" "convertible" "convex" "convincing" "convivial" "cooperative" "copious" "coral" "cordial" "corporal" "corporate" "correct" "corresponding" "corrosive" "corrupt" "corruptible" "coruscating" "cosmopolitan" "cost-effective" "countervailing" "countless" "courageous" "courteous" "creative" "credible" "creditable" "criminal" "critical" "crooked" "crucial" "cruciform" "crushing" "culinary" "culpable" "cultural" "cultured" "cumbersome" "cumulative" "cunning" "curable" "curious" "current" "cursory" "customary" "cutting" "cyclical" "cylindrical" "cynical" "damned" "damning" "dangerous" "dapper" "daring" "dashing" "dated" "dauntless" "deafening" "debatable" "deceitful" "decent" "deceptive" "decided" "deciduous" "decimal" "decisive" "declarative" "decorative" "decrepit" "deep-seated" "defective" "defenceless" "defensive" "defiant" "deficient" "definite" "definitive" "degenerate" "degrading" "dehydrated" "dejected" "deliberate" "delicate" "delicious" "delightful" "delirious" "demanding" "demented" "demonstrative" "denominational" "dental" "departmental" "dependable" "dependent" "deplorable" "depressed" "depressing" "deranged" "derisive" "derisory" "derivative" "derogatory" "descriptive" "deserving" "desirable" "desirous" "desolate" "desperate" "despicable" "despondent" "destitute" "destructive" "detachable" "detectable" "determined" "detestable" "detrimental" "devastating" "developmental" "deviant" "devilish" "devious" "devoted" "diagonal" "dictatorial" "diesel" "diesel-powered" "dietary" "different" "differential" "diffident" "diffuse" "digestible" "digestive" "digital" "dignified" "dilatory" "diligent" "dimensional" "direct" "directional" "disadvantageous" "disagreeable" "disastrous" "discernible" "discerning" "disciplinary" "disconnected" "disconsolate" "discontented" "discordant" "discouraging" "discourteous" "discreet" "discrete" "discriminating" "discriminatory" "disenchanted" "disgraceful" "disgusting" "dishonest" "dishonourable" "disinterested" "disjointed" "disloyal" "disobedient" "disparaging" "dispassionate" "dispirited" "disposable" "disproportionate" "disreputable" "disrespectful" "dissatisfied" "dissimilar" "dissipated" "dissolute" "distant" "distasteful" "distinct" "distinctive" "distinguished" "distracted" "distraught" "distressing" "disturbing" "divergent" "diverse" "docile" "doctoral" "doddering" "dogged" "doleful" "domesticated" "dominant" "domineering" "dormant" "double" "doubtful" "downhearted" "dreadful" "drunken" "dual" "dubious" "due" "dumbfounded" "durable" "eager" "earnest" "earthy" "easterly" "ebullient" "ecclesiastical" "ecological" "economical" "ecumenical" "edible" "editorial" "educational" "effective" "effeminate" "effervescent" "efficient" "effortless" "egalitarian" "elaborate" "elated" "electoral" "electrical" "elegant" "elemental" "elementary" "eligible" "elliptical" "elongated" "eloquent" "elusive" "emaciated" "embarrassing" "eminent" "emotional" "emotive" "empirical" "enamoured" "enchanting" "endearing" "endless" "endurable" "enervating" "enforced" "engaging" "engrossed" "enjoyable" "enormous" "enterprising" "entertaining" "enthralled" "enticing" "entire" "entrenched" "envious" "environmental" "ephemeral" "epidemiological" "episcopal" "equable" "equal" "equatorial" "equitable" "equivalent" "equivocal" "erect" "erroneous" "erudite" "essential" "eternal" "ethical" "evasive" "eventful" "eventual" "everlasting" "evident" "evocative" "excellent" "exceptional" "excessive" "excisable" "exciting" "exclusive" "excruciating" "excusable" "executive" "exemplary" "exhausted" "exhaustive" "exhilarating" "existing" "expansive" "expectant" "expedient" "expeditious" "expendable" "expensive" "experimental" "expert" "explanatory" "explicit" "explosive" "exponential" "express" "expressive" "exquisite" "extensive" "exterior" "external" "extortionate" "extra-territorial" "extrajudicial" "extramarital" "extramural" "extraneous" "extraordinary" "extraterritorial" "extravagant" "exuberant" "eye-catching" "fabulous" "facetious" "facial" "facile" "factual" "faecal" "faint-hearted" "faithful" "fallible" "fallow" "familiar" "famous" "fanatical" "fanciful" "far-reaching" "far-sighted" "farcical" "fascinating" "fashionable" "fastidious" "fatal" "fatuous" "faultless" "favorable" "favourable" "fearful" "fearless" "feasible" "federal" "feeble-minded" "felicitous" "felt-tipped" "feminine" "ferocious" "fertile" "fervent" "festive" "fetching" "feudal" "feverish" "fictional" "fictitious" "fiendish" "figurative" "final" "financial" "finite" "first" "fiscal" "fishy" "fitting" "fixed" "flabbergasted" "flagrant" "flamboyant" "flammable" "flattering" "flawless" "fleeting" "flexible" "flippant" "floral" "florid" "flourishing" "fluent" "fluid" "fluorescent" "flushed" "flustered" "focal" "foolhardy" "foolish" "forbearing" "forbidding" "forced" "forceful" "forcible" "foreign" "foreseeable" "forgetful" "formal" "formative" "former" "formidable" "forthright" "fortuitous" "fortunate" "fractional" "fragile" "fragmentary" "fragrant" "fraternal" "fraudulent" "freezing" "frequent" "frightening" "frightful" "frivolous" "frontal" "frugal" "fruitful" "frustrated" "functional" "fundamental" "funereal" "furious" "futile" "future" "gainful" "gallant" "game" "gaping" "garish" "garrulous" "gaseous" "general" "generous" "genial" "genital" "gentile" "genuine" "geographical" "geological" "geometrical" "geostationary" "gifted" "girlish" "glamorous" "glaring" "glazed" "gleaming" "gleeful" "global" "glorious" "gluttonous" "golden" "gorgeous" "governmental" "graceful" "gracious" "gradual" "grammatical" "grandiose" "grasping" "grateful" "gratifying" "grating" "greenish" "gregarious" "grey-haired" "grievous" "gripping" "grotesque" "groundless" "grudging" "gruelling" "gruesome" "guarded" "guileless" "gullible" "guttural" "habitable" "habitual" "haggard" "hair-raising" "half-hearted" "haphazard" "hard-headed" "harmful" "harmless" "harmonious" "harrowing" "hateful" "hazardous" "headstrong" "heartbreaking" "heartless" "heartwarming" "heated" "heedless" "hellish" "helpful" "helpless" "herbal" "hereditary" "heretical" "hesitant" "heterogeneous" "heterosexual" "hexagonal" "hideous" "hierarchical" "high-handed" "hilarious" "historical" "hoarse" "homogeneous" "homogenous" "homosexual" "honest" "honorable" "honorary" "honourable" "hopeful" "hopeless" "horizontal" "hormonal" "horned" "horrible" "horrid" "horticultural" "hospitable" "hostile" "hotheaded" "hulking" "human" "humid" "humorous" "hurried" "hurtful" "hydrological" "hypocritical" "hypothetical" "hysterical" "ideal" "identical" "identifiable" "ideological" "ignorant" "ill-advised" "ill-fated" "ill-mannered" "illegal" "illegible" "illegitimate" "illicit" "illiterate" "illogical" "illusive" "illusory" "illustrative" "illustrious" "imaginative" "immaculate" "immaterial" "immediate" "imminent" "immobile" "immoderate" "immoral" "immortal" "immovable" "immune" "impartial" "impassable" "impassioned" "impatient" "impeccable" "impenetrable" "imperative" "imperceptible" "imperfect" "imperial" "impermeable" "impersonal" "impertinent" "impervious" "impetuous" "implausible" "implicit" "impolite" "imponderable" "important" "imposing" "impossible" "impotent" "impracticable" "impractical" "imprecise" "impregnable" "impressionable" "impressive" "improbable" "impromptu" "improper" "imprudent" "impudent" "impulsive" "inaccessible" "inaccurate" "inactive" "inadequate" "inadmissible" "inadvertent" "inadvisable" "inane" "inanimate" "inappropriate" "inapt" "inarticulate" "inattentive" "inaudible" "inaugural" "incalculable" "incandescent" "incapable" "incendiary" "incessant" "incidental" "incipient" "incisive" "inclement" "inclusive" "incoherent" "incompatible" "incompetent" "incomplete" "incomprehensible" "inconceivable" "inconclusive" "incongruous" "inconsequential" "inconsiderate" "inconsistent" "inconspicuous" "inconstant" "incontinent" "incontrovertible" "inconvenient" "incorporated" "incorrect" "incorrigible" "incorruptible" "increasing" "incredible" "incredulous" "incurable" "indebted" "indecent" "indecisive" "indefinable" "indefinite" "indelible" "independent" "indescribable" "indestructible" "indeterminate" "indictable" "indifferent" "indigenous" "indigestible" "indignant" "indiscreet" "indiscriminate" "indispensable" "indisputable" "indistinct" "indistinguishable" "individual" "indolent" "indoor" "indubitable" "indulgent" "industrial" "industrious" "inebriated" "inedible" "ineffective" "ineffectual" "inefficient" "inelegant" "ineligible" "ineradicable" "inert" "inescapable" "inessential" "inestimable" "inevitable" "inexact" "inexhaustible" "inexorable" "inexpensive" "inexperienced" "inexplicable" "inexpressible" "inextricable" "infallible" "infamous" "infatuated" "infectious" "inferior" "infernal" "infertile" "infinite" "infirm" "inflammable" "inflatable" "inflated" "inflexible" "influential" "informal" "informative" "infrastructural" "infrequent" "infuriating" "ingenious" "ingenuous" "inherent" "inhospitable" "inhuman" "inimitable" "initial" "inlaid" "inland" "innate" "innocent" "innocuous" "innovative" "innumerable" "inoperable" "inopportune" "inordinate" "inquiring" "inquisitive" "insanitary" "insatiable" "inscrutable" "insecure" "insensible" "insensitive" "inseparable" "insidious" "insignificant" "insincere" "insipid" "insistent" "insolent" "insoluble" "insolvent" "inspiring" "instant" "instantaneous" "instinctive" "institutional" "instructional" "instructive" "instrumental" "insubordinate" "insufferable" "insufficient" "insulting" "insuperable" "intangible" "integral" "intellectual" "intelligent" "intelligible" "intemperate" "intense" "intensive" "intent" "intentional" "interactive" "interchangeable" "interdepartmental" "interdependent" "interesting" "intergovernmental" "interior" "intermediate" "interminable" "intermittent" "intermodal" "internal" "international" "interregional" "interrelated" "interrogative" "intimate" "intimidatory" "intolerable" "intolerant" "intoxicated" "intractable" "intransigent" "intransitive" "intravenous" "intrepid" "intricate" "intriguing" "intrinsic" "introspective" "intrusive" "intuitive" "invalid" "invaluable" "invariable" "invariant" "inventive" "inverse" "invertebrate" "investigative" "inveterate" "invidious" "invigorating" "invincible" "inviolate" "invisible" "involuntary" "involved" "invulnerable" "inward" "irascible" "irate" "irksome" "ironical" "irrational" "irreconcilable" "irredeemable" "irrefutable" "irregular" "irrelevant" "irreligious" "irreparable" "irreplaceable" "irrepressible" "irreproachable" "irresistible" "irresolute" "irrespective" "irresponsible" "irretrievable" "irreverent" "irreversible" "irrevocable" "irritable" "isolated" "iterative" "itinerant" "jaded" "jagged" "jealous" "jocular" "joint" "joyful" "joyous" "jubilant" "judicial" "judicious" "justifiable" "kind-hearted" "knowing" "knowledgeable" "laborious" "lackadaisical" "lamentable" "languid" "lascivious" "last" "lasting" "latent" "lateral" "latter" "laudable" "laudatory" "laughable" "laughing" "lavish" "law-abiding" "lawful" "lawless" "leaden" "learned" "lecherous" "legal" "legendary" "legible" "legislative" "legitimate" "lenient" "lethal" "level-headed" "lexical" "liberal" "licentious" "lifeless" "light-headed" "light-hearted" "likeable" "lilting" "limber" "linear" "lingering" "liquid" "listless" "literal" "literary" "literate" "local" "logical" "long-sighted" "long-suffering" "long-winded" "longing" "longitudinal" "lop-sided" "lovable" "loving" "loyal" "lucid" "lucrative" "ludicrous" "lugubrious" "luminous" "lurid" "luscious" "lustful" "lustrous" "luxuriant" "luxurious" "lyrical" "magical" "magnanimous" "magnificent" "main" "malevolent" "malicious" "malignant" "malleable" "manageable" "managerial" "mandatory" "maneuverable" "manful" "manifest" "manual" "marginal" "marital" "marked" "marketable" "martial" "marvellous" "marvelous" "masculine" "massive" "matchless" "material" "maternal" "mathematical" "matriarchal" "matrimonial" "matter-of-fact" "maudlin" "mawkish" "maximal" "meager" "meagre" "mealy-mouthed" "meaningful" "meaningless" "measurable" "mechanical" "meddlesome" "mediaeval" "medical" "medicinal" "medieval" "mediocre" "melodious" "memorable" "memorial" "menacing" "menial" "mental" "mercenary" "merciful" "merciless" "mercurial" "metaphysical" "meteorological" "methodical" "meticulous" "metrical" "microbial" "middling" "migratory" "militant" "military" "milky" "mindful" "mindless" "mineral" "mingy" "minimal" "ministerial" "minuscule" "minute" "miraculous" "miscellaneous" "mischievous" "miserable" "misguided" "misleading" "misshapen" "mistaken" "mobile" "mocking" "moderate" "modest" "modular" "molecular" "momentary" "momentous" "monotonous" "monstrous" "monumental" "moral" "morbid" "moribund" "morose" "morphological" "mortal" "mortified" "motionless" "motivated" "mountainous" "mournful" "mouth-watering" "movable" "moving" "multidisciplinary" "multifarious" "multilateral" "multilingual" "multinational" "multiple" "mundane" "municipal" "murderous" "muscular" "musical" "muted" "mutinous" "mutual" "mysterious" "mystical" "mythical" "mythological" "nagging" "naked" "nameless" "narrow-minded" "nasal" "national" "natural" "nautical" "naval" "navigable" "near-sighted" "nebulous" "necessary" "needless" "negative" "negligent" "negligible" "negotiable" "nerve-racking" "nervous" "neuter" "neutral" "never-ending" "niggling" "ninth" "noble" "nocturnal" "noiseless" "nominal" "non-breakable" "non-committal" "non-existent" "non-flammable" "non-verbal" "nondescript" "normal" "notable" "noteworthy" "noticeable" "notorious" "nourishing" "novel" "noxious" "numerical" "nutritional" "nutritious" "obedient" "objectionable" "objective" "obligatory" "obliging" "oblique" "oblivious" "obnoxious" "obscene" "obscure" "obsequious" "observable" "observant" "observational" "obsessive" "obsolete" "obstinate" "obstreperous" "obstructive" "obtrusive" "obtuse" "obvious" "occasional" "occidental" "occupational" "octagonal" "odious" "odourless" "off-putting" "offensive" "official" "officious" "old-fashioned" "ominous" "omnipotent" "omniscient" "one-sided" "ontological" "opaque" "open" "open-minded" "operable" "operational" "operative" "opinionated" "opportune" "oppressive" "optical" "optimal" "optional" "opulent" "oral" "orchestral" "ordinal" "ordinary" "organizational" "oriental" "original" "ornamental" "ornate" "orthogonal" "ostensible" "ostentatious" "outlandish" "outmoded" "outrageous" "outright" "outspoken" "outstanding" "outward" "over" "overbearing" "overexcited" "overpowering" "overt" "overwhelming" "overwrought" "own" "pagan" "pained" "painful" "painless" "painstaking" "palatable" "pallid" "palpable" "panicky" "papal" "paradoxical" "parallel" "parental" "parliamentary" "parochial" "parsimonious" "part" "partial" "particular" "parting" "partisan" "passable" "passionate" "passive" "pastoral" "patent" "paternal" "pathetic" "pathological" "patient" "payable" "peaceable" "peaceful" "peckish" "peculiar" "pecuniary" "pedestrian" "peevish" "pejorative" "penal" "penitent" "penniless" "pensionable" "pensive" "penultimate" "perceptible" "perceptive" "perceptual" "percussive" "peremptory" "perennial" "perfect" "perfunctory" "perilous" "perinatal" "periodical" "perishable" "perishing" "permanent" "permeable" "permissible" "permissive" "pernicious" "pernickety" "perpendicular" "perpetual" "persistent" "personal" "persuasive" "pertinent" "pervasive" "perverse" "petulant" "pharmaceutical" "pharmacological" "phenomenal" "philosophical" "physical" "physiological" "pictorial" "picturesque" "piddling" "pidgin" "piercing" "pigheaded" "pious" "piquant" "piteous" "pitiable" "pitiful" "pitiless" "pitying" "placid" "plausible" "playful" "pleased" "pleasing" "pleasurable" "plentiful" "pliable" "plodding" "plum" "plumb" "poignant" "pointed" "pointless" "poisonous" "polar" "political" "polynomial" "pompous" "ponderous" "popular" "populous" "porous" "portable" "positive" "possessive" "possible" "postal" "posthumous" "potent" "potential" "powerful" "powerless" "practicable" "practical" "pre-eminent" "prearranged" "precarious" "precious" "precipitate" "precipitous" "precise" "precocious" "predatory" "predictable" "predominant" "prefabricated" "preferable" "preferential" "pregnant" "preliminary" "premarital" "premature" "premeditated" "preoccupied" "preposterous" "prerequisite" "prescriptive" "present" "presentable" "presidential" "pressing" "pressurized" "prestigious" "presumptuous" "pretentious" "prevalent" "preventable" "preventative" "preventive" "previous" "priceless" "primary" "primeval" "primitive" "principal" "pristine" "private" "probable" "procedural" "prodigal" "prodigious" "productive" "profane" "professional" "proficient" "profitable" "profuse" "progressive" "prohibitive" "prominent" "promiscuous" "promising" "promotional" "proper" "propicious" "proportional" "proportionate" "proprietary" "prospective" "prosperous" "prostrate" "protective" "protracted" "proverbial" "provincial" "provisional" "provocative" "prudent" "prudential" "prudish" "psychological" "public" "public-spirited" "puerile" "pugnacious" "punctilious" "punctual" "pungent" "punishable" "puritanical" "purposeful" "putrid" "puzzling" "quadruple" "qualitative" "quantitative" "quarrelsome" "quarterly" "questionable" "questioning" "quick-witted" "quizzical" "rabid" "racial" "radial" "radiant" "radical" "radioactive" "radiological" "raffish" "ragged" "rakish" "rambling" "rampant" "ramshackle" "rancid" "random" "rapturous" "rasping" "rational" "raucous" "ravenous" "ravishing" "readable" "real" "reasonable" "reassuring" "rebellious" "receding" "recent" "receptive" "reciprocal" "reckless" "recognizable" "recreational" "rectangular" "recurrent" "recurring" "reddish" "redeeming" "redundant" "refined" "reflective" "reflexive" "regal" "regional" "regretful" "regrettable" "regular" "regulatory" "relative" "relaxed" "relaxing" "relentless" "relevant" "reliable" "religious" "reluctant" "remarkable" "remedial" "remorseful" "remorseless" "removable" "renewable" "repairable" "repayable" "repellent" "repetitious" "repetitive" "replaceable" "replete" "reprehensible" "representative" "repressive" "reproachful" "reproducible" "reproductive" "reproving" "repugnant" "repulsive" "reputable" "reputed" "requisite" "resentful" "reserved" "resident" "residential" "residual" "resigned" "resilient" "resistant" "resolute" "resonant" "resounding" "resourceful" "respectable" "respectful" "respective" "resplendent" "responsible" "responsive" "restful" "restive" "restless" "restrained" "restrictive" "retentive" "reticent" "retiring" "retroactive" "retrospective" "revealing" "revengeful" "reverent" "reversible" "revolting" "revolving" "rewarding" "rhetorical" "rhythmical" "ribald" "ridiculous" "right-handed" "righteous" "rightful" "rigid" "rigorous" "rimmed" "riotous" "ritual" "robust" "roguish" "rollicking" "rolling" "rotten" "routine" "rudimentary" "rueful" "ruinous" "rural" "ruthless" "salient" "sanctimonious" "sanguine" "sanitary" "sartorial" "satisfactory" "satisfying" "savage" "scalding" "scandalous" "scathing" "sceptical" "scintillating" "scornful" "scrupulous" "scurrilous" "searching" "seasonal" "secluded" "secondary" "secret" "secretarial" "secretive" "sectional" "secular" "sedate" "sedentary" "seductive" "seeming" "selective" "self-adhesive" "self-assertive" "self-assured" "self-confident" "self-conscious" "self-defeating" "self-evident" "self-explanatory" "self-indulgent" "self-reliant" "self-respecting" "self-righteous" "self-satisfied" "self-sufficient" "self-supporting" "selfish" "selfless" "semiconscious" "senile" "sensational" "senseless" "sensible" "sensitive" "sensory" "sensual" "sentimental" "separable" "separate" "sequential" "serial" "serious" "serviceable" "servile" "several" "sexual" "shamefaced" "shameful" "shameless" "shapeless" "sharp-witted" "sheepish" "shocking" "short-sighted" "short-tempered" "shortsighted" "shrunken" "significant" "silent" "similar" "simultaneous" "sinful" "single" "single-minded" "singular" "sinister" "sinuous" "sizable" "sizeable" "skeletal" "skeptical" "skilful" "skillful" "slanderous" "slanting" "sloping" "sluggish" "smiling" "snobbish" "sociable" "social" "socialist" "sociological" "sodden" "soft-hearted" "sole" "solitary" "soluble" "solvent" "somber" "sombre" "sophisticated" "sordid" "sorrowful" "soul-destroying" "soulful" "soulless" "spacious" "spare" "sparing" "sparkling" "sparse" "spatial" "special" "spectacular" "spectral" "speculative" "speechless" "spherical" "spineless" "spiral" "spirited" "spiritual" "spiteful" "splendid" "spontaneous" "sporting" "spotless" "spruce" "spurious" "squat" "squeamish" "staggering" "stagnant" "stalwart" "stand-offish" "standard" "staple" "startling" "statistical" "statutory" "steadfast" "sterile" "stifling" "stilted" "stimulating" "stirring" "straightforward" "strait-laced" "strange" "strenuous" "striking" "stringent" "structural" "studied" "studious" "stunning" "stunted" "stupendous" "stylish" "subconscious" "subdued" "subdural" "subhuman" "subjective" "subjunctive" "submissive" "subordinate" "subsequent" "substantial" "substantive" "subtropical" "subversive" "successful" "successive" "succinct" "succulent" "sudden" "sufficient" "suggestive" "suicidal" "suitable" "sullen" "summary" "sumptuous" "supercilious" "superficial" "superfluous" "superhuman" "superlative" "supernatural" "superstitious" "supplemental" "supportive" "supreme" "surgical" "surprising" "surreptitious" "susceptible" "suspicious" "sustainable" "sustained" "sweltering" "swingeing" "swish" "swollen" "sycophantic" "symmetrical" "synchronous" "syncopated" "synonymous" "taciturn" "tactful" "tactical" "tactless" "talkative" "tangential" "tangible" "tantalizing" "tasteful" "tasteless" "tax-deductible" "taxable" "tearful" "technical" "technological" "tedious" "teetotal" "temperate" "temporal" "temporary" "tempting" "tenable" "tenacious" "tentative" "tenuous" "tepid" "terminal" "terrestrial" "terrible" "territorial" "thankful" "thankless" "theatrical" "theological" "theoretical" "therapeutical" "thermal" "thorough" "thoughtful" "thoughtless" "three-dimensional" "thrusting" "thunderous" "ticklish" "tidal" "time-consuming" "timeless" "tired" "tireless" "tiresome" "tiring" "tolerable" "tolerant" "tonal" "top-heavy" "topical" "topsy-turvy" "torrential" "torrid" "tortuous" "total" "touching" "toxicological" "traceable" "traditional" "tranquil" "trans-national" "transient" "transitional" "transitive" "transitory" "translucent" "transmissible" "transparent" "transportable" "transverse" "treacherous" "treble" "tremendous" "triangular" "tribal" "trifling" "trilateral" "trim" "triple" "triumphal" "triumphant" "trivial" "tropical" "troublesome" "truculent" "truncated" "trusted" "trustful" "trusting" "trustworthy" "truthful" "trying" "tumultuous" "tuneful" "turbid" "turbulent" "turgid" "two-dimensional" "typical" "typographical" "tyrannical" "ubiquitous" "ultimate" "unabashed" "unabated" "unacceptable" "unaccountable" "unanimous" "unappealing" "unashamed" "unassuming" "unattainable" "unattractive" "unavailable" "unavoidable" "unbalanced" "unbearable" "unbeatable" "unbelievable" "unbounded" "unbreakable" "unbroken" "unceasing" "uncertain" "unchanged" "uncharitable" "uncomfortable" "uncomplicated" "uncompromising" "unconcerned" "unconditional" "uncongenial" "unconscious" "uncontrollable" "uncontrolled" "uncooperative" "uncouth" "unctuous" "undeniable" "undependable" "underhanded" "underlying" "understandable" "understanding" "undesirable" "undetectable" "undisputed" "undistinguished" "undoubted" "undue" "uneconomical" "unending" "unenviable" "unequal" "unequivocal" "unerring" "uneven" "uneventful" "unexpected" "unexplainable" "unfailing" "unfaithful" "unfamiliar" "unfathomable" "unfavorable" "unfavourable" "unfeeling" "unflagging" "unflappable" "unflinching" "unforeseeable" "unforgettable" "unforgivable" "unforgiving" "unfortunate" "unfounded" "unfruitful" "ungrateful" "unguarded" "unhappy" "unhealthy" "uniform" "unilateral" "unimaginable" "unimportant" "uninhibited" "unintentional" "uninteresting" "uninterrupted" "unique" "universal" "unjust" "unjustifiable" "unkempt" "unlawful" "unmanageable" "unmistakable" "unmitigated" "unnatural" "unnecessary" "unobservable" "unobtainable" "unobtrusive" "unofficial" "unorthodox" "unpalatable" "unpleasant" "unpopular" "unprecedented" "unpredictable" "unprepossessing" "unpretentious" "unproductive" "unprofitable" "unquestionable" "unreal" "unreasonable" "unrelenting" "unreliable" "unrelieved" "unremitting" "unrepeatable" "unrepentant" "unrepresentative" "unrestricted" "unsafe" "unsatisfactory" "unscrupulous" "unselfish" "unsentimental" "unshakable" "unsophisticated" "unsound" "unspeakable" "unstable" "unsteady" "unsuccessful" "unsuitable" "unsure" "unsuspecting" "unswerving" "unthinkable" "untiring" "untoward" "untranslatable" "untrue" "untruthful" "unusable" "unusual" "unwarranted" "unwavering" "unwelcome" "unwilling" "unwise" "unwitting" "unworthy" "unyielding" "upright" "urbane" "urgent" "usable" "useful" "useless" "usual" "utter" "vacant" "valedictory" "valiant" "valid" "valuable" "variable" "various" "vaunted" "vehement" "venerable" "venereal" "vengeful" "venomous" "verbal" "verifiable" "versatile" "vertical" "vexed" "viable" "vibrant" "vicarious" "vicious" "victorious" "vigilant" "vigorous" "vindictive" "violent" "viral" "virile" "virtual" "virtuous" "virulent" "visual" "vital" "vivacious" "vocal" "vocational" "vociferous" "volatile" "voluble" "voluminous" "voluntary" "voluptuous" "voracious" "vulgar" "wanton" "warm" "warm-hearted" "washable" "wasteful" "watchful" "watery" "weightless" "whimsical" "wholehearted" "wholesome" "wilful" "willing" "winning" "wishful" "wistful" "wonderful" "wooden" "workable" "worrying" "worthless" "worthwhile" "wretched" "wrong" "wrongful" "youthful" "zealous" "zoological" A[ deg=pos r=i1 ] "Arctic" "Gothic" "academic" "acidic" "acrobatic" "aerodynamic" "aesthetic" "agnostic" "alcoholic" "algebraic" "allergic" "alphabetic" "alphanumeric" "altruistic" "anaemic" "anaesthetic" "analgesic" "analytic" "anemic" "anesthetic" "angelic" "antagonistic" "antarctic" "antibiotic" "antiseptic" "apathetic" "aphrodisiac" "apologetic" "aquatic" "archaic" "aristocratic" "arithmetic" "aromatic" "arthritic" "artistic" "ascetic" "asthmatic" "astronomic" "atheistic" "athletic" "atmospheric" "atomic" "authentic" "autistic" "autocratic" "automatic" "ballistic" "barbaric" "barometric" "basic" "biographic" "bombastic" "bureaucratic" "carcinogenic" "catalytic" "catastrophic" "caustic" "ceramic" "chaotic" "characteristic" "chromatic" "chronic" "cinematographic" "civic" "climatic" "comic" "concentric" "cosmetic" "cosmic" "cryptic" "cryptographic" "crystallographic" "cubic" "democratic" "demographic" "diabetic" "diagnostic" "diplomatic" "dogmatic" "domestic" "dramatic" "drastic" "dynamic" "eccentric" "ecstatic" "elastic" "electromagnetic" "electronic" "emphatic" "energetic" "enigmatic" "enthusiastic" "epic" "epidemic" "epileptic" "erotic" "erratic" "esthetic" "ethnic" "euphemistic" "exotic" "fantastic" "forensic" "frantic" "fungal" "futuristic" "gastric" "generic" "genetic" "gigantic" "gothic" "graphic" "gravimetric" "harmonic" "hectic" "hermetic" "heroic" "hydraulic" "hydro-electric" "hydroelectric" "hygienic" "iconic" "iconoclastic" "idealistic" "idiomatic" "idiotic" "idyllic" "inorganic" "isotopic" "kinetic" "laconic" "lethargic" "linguistic" "logarithmic" "logistic" "macro-economic" "macroeconomic" "magnetic" "majestic" "masonic" "materialistic" "megalomaniac" "melodic" "melodramatic" "metabolic" "metallic" "microscopic" "mnemonic" "monastic" "monosyllabic" "moronic" "myopic" "narcotic" "neurotic" "nomadic" "non-alcoholic" "non-toxic" "nordic" "nostalgic" "numismatic" "oceanographic" "operatic" "optimistic" "organic" "orthodontic" "pacific" "panoramic" "paralytic" "parasitic" "patriotic" "pedantic" "pessimistic" "phallic" "philanthropic" "phlegmatic" "photogenic" "photographic" "plastic" "pneumatic" "poetic" "pornographic" "pragmatic" "prehistoric" "problematic" "prolific" "prophetic" "prosaic" "psychiatric" "psychic" "psychoanalytic" "psychosomatic" "psychotic" "pyrolytic" "realistic" "rheumatic" "romantic" "rustic" "sadistic" "sarcastic" "sardonic" "satanic" "scenic" "schematic" "schizophrenic" "scholastic" "scientific" "seismic" "semantic" "septic" "socioeconomic" "sonic" "soporific" "spasmodic" "specific" "sporadic" "static" "stoic" "strategic" "stylistic" "sulphuric" "supersonic" "symbolic" "sympathetic" "symphonic" "symptomatic" "synoptic" "syntactic" "synthetic" "systematic" "telegraphic" "telepathic" "telescopic" "terrific" "thematic" "thyrostatic" "toxic" "tragic" "transatlantic" "traumatic" "uncharacteristic" "unhygienic" "unsympathetic" "volcanic" A[ deg=pos r=i2 ] "Afghan" "African" "Albanian" "Algerian" "American" "Anglican" "Anglo-Saxon" "Angolan" "Arab" "Arabian" "Arabic" "Argentine" "Argentinian" "Armenian" "Asian" "Asiatic" "Australian" "Austrian" "Baltic" "Belgian" "Bolivian" "Brazilian" "British" "Buddhist" "Bulgarian" "Burmese" "Caesarean" "Cambodian" "Canadian" "Caribbean" "Celtic" "Chilean" "Chinese" "Christian" "Colombian" "Congolese" "Cornish" "Cuban" "Cypriot" "Czech" "Czechoslovakian" "Danish" "Dutch" "Ecuadorian" "Egyptian" "English" "Eskimo" "Ethiopian" "European" "Finnish" "Flemish" "French" "Gaelic" "German" "Ghanaian" "Grecian" "Greek" "Guatemalan" "Haitian" "Hebrew" "Hindu" "Honduran" "Hungarian" "Iceland" "Icelandic" "Indian" "Iranian" "Iraqi" "Irish" "Israeli" "Italian" "Jamaican" "Japanese" "Jewish" "Jordanian" "Jugoslav" "Kenyan" "Korean" "Laotian" "Lapp" "Latin" "Latin-American" "Lebanese" "Liberian" "Libyan" "Malay" "Malayan" "Malaysian" "Maltese" "Martian" "Marxist" "Mediterranean" "Methodist" "Mexican" "Moorish" "Moroccan" "Mosaic" "Moslem" "Muslim" "Negro" "Nepalese" "Nepali" "Nicaraguan" "Nigerian" "Norwegian" "Olympic" "Pakistani" "Palestinian" "Parisian" "Persian" "Peruvian" "Philippino" "Polish" "Portuguese" "Protestant" "Rhodesian" "Roman" "Romanesque" "Romanian" "Rumanian" "Russian" "Samoan" "Scandinavian" "Scots" "Scottish" "Siamese" "Siberian" "Sicilian" "Slav" "Slavic" "Slavonic" "Spanish" "Sudanese" "Swedish" "Swiss" "Syrian" "Tahitian" "Taiwanese" "Tanzanian" "Thai" "Tibetan" "Tory" "Tunisian" "Turkish" "Ugandan" "Ukrainian" "Uruguayan" "Venetian" "Venezuelan" "Victorian" "Vietnamese" "Welsh" "Yiddish" "Yugoslav" "Yugoslavian" "Zairean" "Zambian" "Zimbabwean" "Zionist" "ablaze" "able-bodied" "aboriginal" "aboveboard" "abroad" "absent" "accomplished" "accredited" "accustomed" "acting" "addicted" "addled" "adjoining" "adjunct" "adolescent" "adopted" "adrift" "adult" "advanced" "advisory" "affiliated" "afoot" "aforesaid" "afraid" "african" "age-old" "aged" "aghast" "agrarian" "agreed" "aground" "air-conditioned" "air-cooled" "airborne" "airsick" "airtight" "ajar" "akin" "alert" "alien" "alight" "alike" "alive" "alkaline" "all-in" "all-night" "all-out" "all-round" "all-time" "allied" "alone" "alpine" "alternating" "amateur" "amazonian" "amber" "amiss" "amphibian" "ancient" "ancillary" "anglican" "anglo-saxon" "animal" "animate" "anti-aircraft" "anticlockwise" "antiquarian" "antique" "antitrust" "applied" "apropos" "aquamarine" "arab" "arable" "armed" "armored" "armoured" "asian" "asleep" "aspirate" "assistant" "associate" "assorted" "astronomical" "atlantic" "auburn" "australian" "austrian" "auxiliary" "averse" "awake" "aware" "awash" "away" "awestruck" "awry" "azure" "back" "backhanded" "backwards" "balanced" "ball-point" "baptist" "barefaced" "barefoot" "bareheaded" "bass" "bated" "bathing" "battered" "bay" "bearded" "becalmed" "bedraggled" "bedridden" "berserk" "bespectacled" "best-selling" "biased" "biassed" "bimonthly" "binding" "biographical" "biweekly" "blasé" "bleached" "bleary-eyed" "blindfold" "blithering" "bloodshot" "bloodstained" "bodily" "bone-dry" "born" "both" "bottom" "bound" "bow-legged" "brackish" "brand-new" "brazilian" "brimful" "brotherly" "brownish" "brunette" "brute" "budding" "built-in" "bumper" "businesslike" "bust" "bygone" "caked" "canine" "canned" "capillary" "capitalist" "cardiac" "carefree" "casting" "catching" "categoric" "catholic" "celibate" "cellular" "celsius" "centre" "chance" "chequered" "childlike" "chock-a-block" "chock-full" "circulatory" "citrus" "civilian" "clad" "classic" "clean-shaven" "clear-cut" "clockwise" "closed" "clouded" "co-ordinate" "coastal" "cock-eyed" "cockney" "colour-blind" "coloured" "coming" "commonplace" "communist" "computer-assisted" "conditioning" "confined" "confirmed" "conformant" "conformist" "conic" "coniferous" "consonant" "constituent" "consultant" "contested" "contraceptive" "convalescent" "conversant" "cooling" "coronary" "correspondent" "corrugated" "counter-clockwise" "counterfeit" "countrified" "cowardly" "crack" "cracked" "cramped" "crestfallen" "criss-cross" "cross-border" "cross-eyed" "crowded" "crying" "crystal-clear" "crystalline" "custom-made" "cut-price" "cut-throat" "cut-up" "cutaway" "cyclic" "cyprian" "cyrillic" "daily" "dairy" "damn" "darling" "day-to-day" "deadpan" "deep-sea" "deep-set" "defeatist" "deformed" "defunct" "delayed-action" "delinquent" "depleted" "deprived" "derelict" "detached" "detailed" "deterrent" "devoid" "difficult" "dilapidated" "dilute" "dim-witted" "directive" "dirt-cheap" "disabled" "disadvantaged" "discoloured" "diseased" "disembodied" "disgruntled" "dishevelled" "disinfectant" "disorderly" "disposed" "dissident" "distinguishing" "disused" "divers" "divorced" "documentary" "dog-eared" "domiciled" "double-breasted" "down-at-heel" "down-to-earth" "downcast" "downhill" "downright" "downstairs" "downtown" "downward" "dread" "dried" "drip-dry" "dripping" "drive-in" "driving" "dual-control" "dual-purpose" "dubbed" "dud" "dummy" "duplicate" "dutiable" "duty-free" "dying" "earthenware" "east" "eastbound" "easter" "eastern" "easy-going" "eatable" "economic" "elect" "electric" "eleventh" "elite" "embossed" "emerald" "emergent" "empty-handed" "enamel" "encased" "engaged" "enlightened" "enough" "ensconced" "entitled" "episcopalian" "epoch-making" "everyday" "exacting" "excess" "exempt" "expansionary" "experienced" "exploratory" "extinct" "extra" "extremist" "fact-finding" "fahrenheit" "famine-stricken" "famished" "fanatic" "fancied" "far" "far-fetched" "faraway" "fascist" "fated" "fatherly" "favorite" "favourite" "featureless" "fellow" "female" "fibrous" "fifth-generation" "fireproof" "first-class" "first-hand" "first-rate" "fissile" "flared" "flaxen" "floating" "fluted" "flying" "folding" "following" "foolproof" "footsore" "forbidden" "foregone" "foremost" "forked" "forthcoming" "fortnightly" "forward" "foster" "fraught" "freak" "free" "freelance" "freshwater" "fried" "front" "frosted" "frozen" "fugitive" "full-length" "full-scale" "full-sized" "full-time" "fully-fledged" "garbled" "geographic" "geometric" "germanic" "ghostly" "giant" "gilt" "ginger-haired" "gingerly" "glancing" "glandular" "gnarled" "go-ahead" "god-forsaken" "gold" "good" "good-looking" "governing" "granulated" "groundbreaking" "growing" "grown" "grown-up" "hackneyed" "half" "handicapped" "handmade" "handwritten" "hanging" "hard-up" "hard-wearing" "hard-working" "hare-brained" "haywire" "head-on" "headlong" "heartfelt" "heathen" "heavenly" "heavy-duty" "henpecked" "high-energy" "high-flying" "high-heeled" "high-level" "high-pitched" "high-powered" "high-pressure" "high-quality" "high-speed" "high-technology" "highbrow" "highland" "hind" "hispanic" "historic" "hit-or-miss" "home" "home-made" "homeless" "homesick" "homeward" "horse-drawn" "hourly" "household" "humanitarian" "humdrum" "hunched" "hurt" "hybrid" "hydrochloric" "hypothetic" "ill-at-ease" "ill-defined" "imaginary" "imaging" "impending" "imported" "impoverished" "imprinted" "in-between" "in-depth" "in-house" "inborn" "inbred" "incapacitated" "incarnate" "incident" "incoming" "incumbent" "index-linked" "indicative" "indigo" "indisposed" "indonesian" "infantile" "infested" "inflationary" "infra-red" "ingrained" "inhibiting" "inner" "innermost" "inset" "inshore" "inside" "insular" "intact" "intended" "interested" "interim" "interstate" "intestate" "intestinal" "intra-uterine" "introductory" "introvert" "ironic" "islamic" "italic" "jaundiced" "jet-black" "jobbing" "jobless" "jumbo" "junior" "juvenile" "key" "killing" "kindred" "king-size" "knock-kneed" "korean" "laboured" "laden" "ladylike" "laminated" "landlocked" "landscaped" "laotian" "large-scale" "last-minute" "laureate" "lavender" "lay" "leading" "leaning" "lebanese" "left" "left-hand" "left-handed" "left-wing" "leisurely" "lengthwise" "liable" "licensed" "life-size" "life-sized" "lifelike" "lifelong" "lightweight" "like" "like-minded" "lilac" "limited" "liverish" "living" "loaded" "loath" "lonesome" "long-distance" "long-haired" "long-lost" "long-playing" "long-range" "long-standing" "long-term" "lost" "low-cost" "low-cut" "low-lying" "low-paid" "low-powered" "low-price" "low-risk" "low-temperature" "low-wage" "lower" "lowercase" "lukewarm" "lunar" "lunatic" "lutheran" "lyric" "made-to-measure" "magic" "maiden" "maidenly" "mainstream" "major" "make-believe" "makeshift" "maladjusted" "male" "maltese" "mammoth" "man-made" "managing" "manufacturing" "marine" "maritime" "maroon" "married" "martian" "mashed" "mass" "mass-produced" "master" "masterly" "matching" "matronly" "matted" "maximum" "measured" "median" "medicated" "medium" "medium-range" "medium-sized" "medium-term" "melancholy" "mercantile" "metric" "metropolitan" "mexican" "mid" "midday" "middle" "middle-aged" "middle-class" "middle-of-the-road" "midget" "midway" "midyear" "migrant" "miniature" "minimalist" "minimum" "minor" "miserly" "missing" "misspent" "mixed" "mixed-up" "mock" "mod" "modal" "model" "molten" "moneyed" "mongol" "mongolian" "mono" "monster" "monthly" "moonlit" "moot" "mormon" "moroccan" "moth-eaten" "motherly" "mothproof" "motley" "motoring" "mottled" "muffled" "mulled" "multicoloured" "multipurpose" "multiuser" "mum" "mutant" "mystic" "née" "narrative" "natal" "nation-wide" "nationalist" "native" "nearby" "neighboring" "neighbouring" "neighbourly" "nepalese" "nepali" "net" "nett" "newborn" "next" "nice-looking" "niggardly" "nightly" "nitrogenous" "non-aligned" "non-fiction" "non-profit" "non-stick" "non-stop" "nonplussed" "north" "north-east" "north-eastern" "north-west" "north-western" "northbound" "northeast" "northeastern" "northern" "northwest" "northwestern" "noted" "nuclear" "null" "numeric" "numerous" "oblong" "obtainable" "ocean-going" "ochre" "off" "off-colour" "off-peak" "off-season" "off-white" "offbeat" "offhand" "offshore" "offside" "oil-bearing" "oil-exporting" "oil-fired" "oil-producing" "olive" "omnipresent" "on-line" "on-screen" "on-the-job" "oncoming" "one-man" "one-shot" "one-way" "ongoing" "onshore" "onward" "open-air" "open-and-shut" "open-ended" "open-necked" "operating" "opposing" "opposite" "optimum" "orderly" "orphan" "orthodox" "outdated" "outdoor" "outer" "outgoing" "outlying" "outsize" "outstretched" "oval" "ovenproof" "overall" "overcast" "overcrowded" "overdrawn" "overdue" "overgrown" "overhead" "overjoyed" "overland" "overnight" "overriding" "overseas" "oversize" "overstretched" "overweight" "ovine" "pace-setting" "paediatric" "paid" "panamanian" "paperback" "paraguayan" "paramount" "parched" "parish" "parlous" "part-time" "particulate" "passing" "past" "pastel" "pasteurized" "paying" "peace-keeping" "peaked" "peeved" "pending" "penetrating" "pent-up" "pentecostal" "performing" "periodic" "pertaining" "pet" "petite" "petrified" "pettifogging" "philosophic" "phoney" "phosphorous" "piebald" "piffling" "pigeon-toed" "pitch-black" "pituitary" "planetary" "plastered" "played-out" "pleasant" "plenary" "plunging" "plural" "poached" "pockmarked" "poker-faced" "polished" "politic" "polo-neck" "poorly" "posterior" "postwar" "potted" "pouring" "poverty-stricken" "powdery" "powered" "practising" "precast" "precautionary" "preceding" "preconceived" "prejudiced" "premier" "premiere" "prepackaged" "prepaid" "preparatory" "presbyterian" "preschool" "present-day" "prevailing" "prewar" "prime" "prior" "privileged" "privy" "prize" "probationary" "professorial" "proletarian" "promissory" "prone" "pronounced" "protectionist" "pseudo" "puce" "puffed" "pulmonary" "pulsed" "punch-drunk" "purchasing" "puritan" "pursuant" "pushing" "put-up" "quad" "qualified" "quantum" "quick-frozen" "quits" "racialist" "racist" "rainproof" "rarefied" "ratable" "raving" "reactionary" "ready-made" "rear" "rear-engined" "rear-view" "reasoned" "reclining" "record" "red-haired" "red-handed" "red-hot" "redolent" "reflex" "reformed" "registered" "reigning" "related" "remaining" "reminiscent" "renowned" "rental" "republican" "required" "resolved" "respiratory" "restorative" "resultant" "retarded" "retired" "retractable" "returnable" "reverend" "reverse" "revolutionary" "rhythmic" "ribbed" "rickety" "rife" "right-hand" "right-minded" "right-wing" "rimless" "rival" "roll-off" "roll-on" "roll-on-roll-off" "romance" "rotary" "rotating" "rotting" "round-shouldered" "roundabout" "rounded" "rousing" "roving" "ruled" "ruling" "run-of-the-mill" "runaway" "running" "rustproof" "sabbatical" "sacred" "sacrosanct" "salaried" "saline" "salt-free" "saltwater" "salutary" "same" "satellite" "satin" "saving" "savoury" "scared" "scarlet" "scatterbrained" "scattered" "scheming" "scholarly" "school-age" "scorching" "scot-free" "scratch" "seagoing" "seasick" "secant" "second-class" "second-rate" "secondhand" "sectarian" "sedative" "see-through" "select" "self-catering" "self-centred" "self-coloured" "self-contained" "self-employed" "self-possessed" "self-propelled" "self-sealing" "self-taught" "semiskilled" "senior" "serrated" "set" "sham" "sharp-eyed" "shaven" "sheltered" "shipshape" "shockproof" "shod" "shop-soiled" "shorn" "short-lived" "short-term" "showerproof" "showery" "side" "sidelong" "sideways" "sidewise" "silver" "silver-plated" "silvery" "single-breasted" "sitting" "situated" "skilled" "skin-deep" "skintight" "sky-blue" "slanted" "slapdash" "slavish" "sleeping" "sleeveless" "sliding" "slipshod" "small-scale" "smitten" "smoked" "snivelling" "snowbound" "snub-nosed" "so-called" "societal" "soiled" "solar" "sold" "solid-state" "solo" "sopping" "soundproof" "south" "south-east" "south-eastern" "south-west" "south-western" "southbound" "southeast" "southeastern" "southerly" "southern" "southwest" "southwestern" "sovereign" "soviet" "speckled" "spellbound" "spent" "spick-and-span" "spinal" "splay" "spotted" "staccato" "stainless" "standing" "starched" "starlit" "starry-eyed" "state-of-the-art" "stated" "statewide" "stationary" "stellar" "step-by-step" "stereo" "sterling" "stillborn" "stinking" "stock" "stoical" "stone-cold" "stone-deaf" "straggling" "strained" "stranded" "strapping" "stray" "streamlined" "strewn" "stricken" "striped" "stuck" "stuck-up" "stylized" "sub-zero" "subsidiary" "substandard" "subterranean" "suburban" "succeeding" "sugary" "sunburnt" "sundry" "sunk" "sunken" "sunlit" "super" "superior" "supervisory" "supplementary" "sure-footed" "surplus" "surrealist" "surrounding" "suspect" "sweeping" "swinging" "sworn" "swung" "symmetric" "taboo" "tacit" "tailor-made" "tainted" "takeaway" "talented" "tan" "tanned" "tantamount" "tapered" "tartan" "tattered" "taught" "tax-exempt" "tax-free" "teenage" "teething" "telephoto" "telling" "telltale" "tempered" "tenfold" "tenor" "tensile" "terraced" "terrorist" "thatched" "therapeutic" "thermonuclear" "thermoplastic" "thickset" "thickskinned" "thinskinned" "third-rate" "threadbare" "three-day" "three-ply" "three-point" "three-year" "three-yearly" "threefold" "thriving" "through" "throwaway" "thru" "thunderstruck" "thundery" "tight-fisted" "tiled" "time-saving" "tinned" "tipped" "tiptop" "titled" "titular" "tone-deaf" "tongue-tied" "top" "top-level" "topless" "topmost" "torn" "totalitarian" "touch-and-go" "touched" "tousled" "towering" "tracked" "trade-related" "trade-weighted" "traditionalist" "trained" "trans-European" "transvestite" "tree-lined" "trial-and-error" "trouble-free" "troubled" "trumped-up" "tubular" "tumbledown" "turned-up" "turquoise" "tweed" "twice-daily" "twice-yearly" "twin" "two-door" "two-faced" "two-storey" "two-way" "two-year" "type-cast" "typewritten" "typographic" "ulterior" "ultraviolet" "umbilical" "umpteen" "unable" "unaccompanied" "unaccustomed" "unadulterated" "unaffected" "unafraid" "unaided" "unaltered" "unarmed" "unassisted" "unattached" "unattended" "unauthorized" "unaware" "unbeaten" "unbecoming" "unborn" "unbridled" "uncalled-for" "uncharted" "unchecked" "unclear" "undamaged" "undaunted" "undecided" "undefeated" "undefined" "under-age" "under-developed" "undercover" "underdeveloped" "underdone" "underexposed" "underfed" "underground" "underhand" "underpaid" "underprivileged" "understood" "underwater" "underway" "underweight" "undeveloped" "undiminished" "undisciplined" "undisturbed" "undocumented" "undulating" "unearned" "uneconomic" "uneducated" "unemployed" "unexplained" "unexploded" "unfinished" "unforeseen" "unformed" "unfriendly" "unfunded" "unfurnished" "ungodly" "unharmed" "unheard-of" "unhurt" "unidentified" "uniformed" "unimpaired" "unimpeded" "uninjured" "united" "unjustified" "unknown" "unladen" "unleaded" "unleavened" "unlicensed" "unlike" "unlikely" "unlimited" "unlisted" "unmannerly" "unmarried" "unmatched" "unmodified" "unneeded" "unoccupied" "unorganized" "unpaid" "unpainted" "unparalleled" "unpaved" "unplanned" "unpolished" "unprepared" "unprotected" "unpublished" "unqualified" "unrecognized" "unrefined" "unrelated" "unruly" "unsaid" "unscathed" "unscheduled" "unsecured" "unseeing" "unseemly" "unseen" "unsettled" "unshaven" "unsightly" "unsigned" "unskilled" "unsold" "unsolved" "unstuck" "unsubstantiated" "unsuited" "unsupported" "unsurpassed" "untapped" "untimely" "untold" "untouched" "untrained" "untreated" "untried" "unused" "unwed" "unwell" "unwieldy" "unwritten" "up-and-coming" "up-to-date" "uphill" "upper" "upper-class" "uppermost" "upset" "upside-down" "upstairs" "uptown" "upward" "urban" "used" "utilitarian" "utmost" "utopian" "valued" "variant" "varicose" "varied" "varying" "vegetable" "vegetarian" "vehicular" "verbatim" "versed" "very" "veteran" "veterinary" "vice" "video" "violet" "virgin" "viticultural" "void" "wakeful" "walled" "warlike" "warm-blooded" "waste" "water-based" "watercolor" "watercolour" "waterlogged" "waterproof" "watertight" "waxen" "wayward" "weather-beaten" "weatherproof" "webbed" "wedded" "wee" "weekly" "weighted" "welcome" "welcoming" "well-behaved" "well-built" "well-defended" "well-defined" "well-developed" "well-earned" "well-equipped" "well-groomed" "well-heeled" "well-informed" "well-known" "well-meaning" "well-off" "well-read" "well-rounded" "well-suited" "well-tested" "well-timed" "well-to-do" "well-worn" "west" "westbound" "westerly" "western" "whacked" "white-collar" "whole" "wholesale" "whopping" "wide-awake" "wide-bodied" "wide-ranging" "widely-recognized" "widespread" "widowed" "wind-powered" "winding" "windswept" "winter" "withered" "womanly" "wooded" "woodland" "woolen" "woollen" "word-for-word" "working-class" "world-renowned" "world-shaking" "world-wide" "worldwide" "worn-out" "worried" "worth" "would-be" "wrought" "yawning" "yearly" "youngish" "yugoslavian" "zigzag" A[ deg=pos r=r ] "able" "abrupt" "acute" "adroit" "airy" "ample" "angry" "apparent" "apt" "arch" "austere" "awful" "awkward" "baggy" "bald" "balmy" "bare" "barmy" "barr&u_e;n" = "barren" "base" "bawdy" "beastly" "benign" "bitt&u_e;r" = "bitter" "bizarre" "black" "bland" "blank" "bleak" "blind" "blithe" "bloodthirsty" "bloody" "bluff" "blunt" "bold" "bony" "bossy" "brainy" "brash" "brave" "brawny" "breezy" "brief" "bright" "brisk" "broad" "broody" "brown" "bubbly" "bulbous" "bumpy" "burly" "bushy" "bux&u_o;m" = "buxom" "cagey" "calm" "canny" "catchy" "catty" "chatty" "cheap" "cheeky" "choice" "choppy" "chubby" "civ&u_i;l" = "civil" "clammy" "clean" "clear" "clev&u_e;r" = "clever" "close" "cloudy" "clumsy" "coarse" "cocky" "coherent" "cold" "common" "compact" "cool" "corny" "cosy" "coy" "crafty" "craggy" "cranky" "crass" "crazy" "cream" "creamy" "creepy" "crims&u_o;n" = "crimson" "crisp" "cross" "crotchety" "crude" "cruel" "crunchy" "crusty" "curt" "cute" "daft" "dainty" "damp" "dark" "dead" "deadly" "deaf" "dear" "deathly" "deep" "deft" "demure" "dense" "devout" "dim" "diminutive" "dingy" "dire" "dirty" "dismal" "divine" "dizzy" "dopey" "dour" "dowdy" "drab" "dreamy" "dreary" "droll" "drowsy" "dry" "dull" "dumb" "dusky" "dusty" "easy" "edgy" "eerie" "elderly" "empty" "even" "evil" "exact" "extreme" "faint" "fair" "fake" "false" "fancy" "fast" "fat" "fatty" "faulty" "fawn" "feeble" "few" "fickle" "fidgety" "fierce" "fiery" "filthy" "fine" "finicky" "firm" "fit" "fizzy" "flabby" "flashy" "flat" "flimsy" "floppy" "flowery" "fluffy" "flush" "foggy" "fond" "foul" "frail" "frank" "fresh" "frig&u_i;d" = "frigid" "frisky" "frizzy" "frosty" "full" "funny" "furry" "furtive" "fussy" "fuzzy" "gassy" "gauche" "gaudy" "gaunt" "genteel" "gentle" "giddy" "glad" "glassy" "glib" "gloomy" "glossy" "glum" "gory" "grand" "grassy" "gratuitous" "grave" "greasy" "great" "greedy" "grey" "grim" "grimy" "groggy" "gross" "grubby" "gruff" "grumpy" "guilty" "hairy" "handsome" "handy" "happy" "hard" "hardy" "harsh" "hasty" "haughty" "hazy" "heady" "healthy" "hearty" "heavy" "hefty" "high" "hollow" "horny" "horsy" "hot" "huge" "humane" "humble" "hungry" "husky" "icy" "idle" "ill" "immature" "immense" "impure" "indirect" "inept" "inky" "insane" "inviting" "itchy" "jaunty" "jazzy" "jerky" "juicy" "jumpy" "just" "keen" "khaki" "kind" "kinky" "knotty" "lame" "lank" "lanky" "large" "late" "lax" "lazy" "leafy" "lean" "lengthy" "level" "lewd" "light" "likely" "limp" "lithe" "little" "live" "livid" "lofty" "lone" "loose" "loud" "lousy" "low" "lucky" "lumpy" "lush" "lusty" "mad" "mangy" "marshy" "matt" "mature" "maty" "mean" "meaty" "meek" "mellow" "merry" "messy" "mighty" "mild" "misty" "modern" "moist" "monetary" "moody" "mossy" "mouldy" "mousy" "mucky" "muddy" "muggy" "murky" "mushy" "musty" "mute" "naïve" "naive" "narrow" "nasty" "naughty" "near" "neat" "needy" "new" "nice" "nimble" "nippy" "noisy" "nosey" "nosy" "nude" "numb" "odd" "oily" "pale" "paltry" "pasty" "patchy" "peripheral" "perky" "pert" "petty" "phony" "pink" "pithy" "plain" "plane" "plucky" "plump" "plush" "podgy" "poky" "polite" "poor" "posh" "potty" "praiseworthy" "pretty" "prim" "prissy" "profound" "prompt" "proud" "puffy" "puny" "pure" "pushy" "quaint" "queasy" "queer" "quick" "quiet" "racy" "rainy" "randy" "rank" "rap&u_i;d" = "rapid" "rare" "rash" "raw" "ready" "reconcilable" "remote" "rich" "right" "ripe" "risky" "risqué" "rocky" "roomy" "rosy" "rotund" "rough" "round" "rowdy" "royal" "rubbery" "ruddy" "rude" "rugg&u_e;d" = "rugged" "rum" "runny" "rusty" "sad" "safe" "salty" "sandy" "sane" "saucy" "scabby" "scant" "scanty" "scarce" "scary" "scatty" "scraggy" "scrappy" "scrawny" "screwy" "scruffy" "seamless" "seamy" "seaworthy" "secure" "seedy" "sensuous" "serene" "severe" "sexy" "shabby" "shady" "shaggy" "shaky" "shallow" "sharp" "shifty" "shiny" "shirty" "shoddy" "short" "shrewd" "shrill" "shy" "sick" "sickening" "silky" "simple" "sincere" "sketchy" "skimpy" "skinny" "slack" "sleazy" "sleek" "sleepy" "slend&u_e;r" = "slender" "slick" "slight" "slim" "slimy" "sloppy" "slow" "slushy" "sly" "smarmy" "smart" "smeary" "smelly" "smoky" "smooth" "smug" "smutty" "snappy" "sneaky" "snide" "snooty" "snotty" "snug" "soapy" "sob&u_e;r" = "sober" "soft" "soggy" "sol&u_i;d" = "solid" "solemn" "soppy" "sore" "sorry" "sound" "sour" "speedy" "spicy" "spongy" "spooky" "sporty" "spotty" "springy" "spry" "squal&u_i;d" = "squalid" "square" "stable" "staid" "stale" "starchy" "stark" "starry" "stately" "staunch" "steady" "stealthy" "steamy" "steep" "stern" "sticky" "stiff" "still" "stingy" "stocky" "stodgy" "stol&u_i;d" = "stolid" "stony" "stormy" "stout" "straggly" "straight" "streaky" "strict" "strident" "strong" "stubborn" "stubby" "stuffy" "stup&u_i;d" = "stupid" "sturdy" "suave" "sublime" "subtle" "sulky" "sultry" "sunny" "superb" "supple" "sure" "swampy" "swarthy" "sweaty" "sweet" "swell" "swift" "syrupy" "tacky" "tall" "tame" "tardy" "tart" "tasty" "tatty" "taut" "tawdry" "tend&u_e;r" = "tender" "tense" "terse" "testy" "thick" "thin" "thirsty" "thorny" "thrifty" "tidy" "tight" "tim&u_i;d" = "timid" "tinny" "tipsy" "touchy" "tough" "trendy" "tricky" "trite" "true" "trusty" "tubby" "ugly" "uncanny" "uncommon" "uneasy" "unfair" "unkind" "unlucky" "untidy" "vague" "vain" "vast" "verbose" "vile" "visible" "viv&u_i;d" = "vivid" "vulnerable" "wan" "wary" "wavy" "waxy" "weak" "wealthy" "weary" "weighty" "weird" "wet" "wick&u_e;d" = "wicked" "wide" "wild" "wily" "windy" "wintry" "wiry" "wise" "witty" "wonky" "woody" "wordy" "worldly" "worthy" "wry" "young" "zany" A[ deg=pos r=r2 ] "beige" "big" "blond" "blonde" "blue" "brittle" "broke" "bronze" "buff" "chill" "chilly" "costly" "crumbly" "cubist" "cuddly" "curly" "drunk" "early" "evolutionary" "friendly" "gay" "ghastly" "gray" "green" "grisly" "hilly" "holy" "homely" "ice-cold" "jolly" "kindly" "lively" "long" "lordly" "lovely" "lowly" "manly" "mat" "matey" "mauve" "measly" "mere" "old" "orange" "pally" "pimply" "portly" "prickly" "purple" "red" "roadworthy" "rose" "royalist" "saintly" "sallow" "shadowy" "shapely" "sheer" "sickly" "silly" "slippery" "slovenly" "small" "smallish" "spindly" "sprightly" "surly" "tawny" "timely" "tiny" "unearthly" "unfit" "ungainly" "white" "yellow" A[ deg=sup ] "best" = "good" "eldest" "farthest" "furthest" "least" "worst" = "bad" mmorph-2.3.4.2.orig/data/lex.exp.N0100644000175000001440000040231606046143516015573 0ustar mvelausers; MULTEXT morphology tool ; English morphology description for mmorph ; Version 2.3, October 1995 ; Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland ;; Lexical entries for English; Nouns. ;; Author: Graham Russell ;; Additions by: Susan Armstrong ;; ;; GJR ISSCO 20-1-95 ;; ;; SA ISSCO last change 16-5-95 ;;--------------------------------------------------------------- N[ num=pl typ=c ] "draughtsmen" = "draughtsman" N[ num=pl typ=c gen=f ] "Dutchwomen" = "Dutchwoman" "Frenchwomen" = "Frenchwoman" "businesswomen" = "businesswoman" "chairwomen" = "chairwoman" "charwomen" = "charwoman" "committeewomen" = "committeewoman" "congresswomen" = "congresswoman" "councilwomen" = "councilwoman" "daughters-in-law" = "daughter-in-law" "horsewomen" = "horsewoman" "housewives" = "housewife" "midwives" = "midwife" "mothers-in-law" = "mother-in-law" "mothers-to-be" = "mother-to-be" "sisters-in-law" = "sister-in-law" "spacewomen" = "spacewoman" "wives" = "wife" "women" = "woman" N[ num=pl typ=c gen=m ] "Dutchmen" = "Dutchman" "Frenchmen" = "Frenchman" "barmen" = "barman" "batmen" = "batman" "batsmen" = "batsman" "brothers-in-law" = "brother-in-law" "businessmen" = "businessman" "churchmen" = "churchman" "clergymen" = "clergyman" "coachmen" = "coachman" "coalmen" = "coalman" "committeemen" = "committeeman" "congressmen" = "congressman" "conmen" = "conman" "countrymen" = "countryman" "doormen" = "doorman" "dustmen" = "dustman" "horsemen" = "horseman" "madmen" = "madman" "men" = "man" "ombudsmen" = "ombudsman" "railwaymen" = "railwayman" "servicemen" = "serviceman" "sons-in-law" = "son-in-law" "strongmen" = "strongman" N[ num=pl typ=c gen=m|f ] "Swiss" "Welsh" "aldermen" = "alderman" "alumni" = "alumnus" "cameramen" = "cameraman" "cavemen" = "caveman" "chairmen" = "chairman" "contralti" = "contralto" "councilmen" = "councilman" "craftsmen" = "craftsman" "elderly" "laymen" = "layman" "passers-by" = "passer-by" "secretaries-general" = "secretary-general" "spacemen" = "spaceman" "tradesmen" = "tradesman" "vice-chairmen" = "vice-chairman" N[ num=pl typ=c gen=m|n ] "bogeymen" = "bogeyman" N[ num=pl typ=c gen=n ] "&qu;anta" = "quantum" "&qu;arters" = "quarters" "Englishmen" = "Englishman" "Englishwomen" = "Englishwoman" "Irishmen" = "Irishman" "Irishwomen" = "Irishwoman" "Ulstermen" = "Ulsterman" "Welshmen" = "Welshman" "Welshwomen" = "Welshwoman" "addenda" = "addendum" "afterlives" = "afterlife" "algae" = "alga" "alms" "amphibra&ch;" = "amphibrach" "analyses" = "analysis" "annals" "antitheses" = "antithesis" "apotheoses" = "apotheosis" "appendices" = "appendix" "arrears" "auspices" "automata" = "automaton" "axes" = "axis" "banns" "bases" = "basis" "bifocals" "binoculars" "bleachers" "borrowings" "bureaux" = "bureau" "cacti" = "cactus" "calves" = "calf" "catharses" = "catharsis" "cervices" = "cervix" "chessmen" = "chessman" "children" = "child" "clergy" "clothes" "concerti" = "concerto" "contents" "continua" = "continuum" "corpora" = "corpus" "cosmetics" "courts-martial" = "court-martial" "criteria" = "criterion" "dealings" "durables" "dwarves" = "dwarf" "dyestuffs" "earnings" "elves" = "elf" "emphases" = "emphasis" "fathers-in-law" = "father-in-law" "feet" = "foot" "firemen" = "fireman" "fishermen" = "fisherman" "footmen" = "footman" "foremen" = "foreman" "freshmen" = "freshman" "frogmen" = "frogman" "fungi" = "fungus" "geese" = "goose" "gentlemen" = "gentleman" "gentry" "grassroots" "gunmen" = "gunman" "halves" = "half" "handymen" = "handyman" "helmsmen" = "helmsman" "henchmen" = "henchman" "hippopotami" = "hippopotamus" "hooves" = "hoof" "hypotheses" = "hypothesis" "indices" = "index" "infantrymen" = "infantryman" "jack-knives" = "jack-knife" "jeans" "jurymen" = "juryman" "kin" "knives" = "knife" "leaves" = "leaf" "left-overs" "libretti" = "libretto" "lice" = "louse" "linesmen" = "linesman" "lire" = "lira" "lives" = "life" "loaves" = "loaf" "marksmen" = "marksman" "maxima" = "maximum" "means" "memoranda" = "memorandum" "menservants" "metamorphoses" = "metamorphosis" "mice" = "mouse" "middlemen" = "middleman" "milkmen" = "milkman" "millennia" = "millennium" "minima" = "minimum" "neuroses" = "neurosis" "newspapermen" = "newspaperman" "noblemen" = "nobleman" "oats" "odds" "opera" = "opus" "oxen" = "ox" "paralyses" = "paralysis" "parentheses" = "parenthesis" "patrolmen" = "patrolman" "pence" = "penny" "penknives" = "penknife" "personnel" "phenomena" = "phenomenon" "policemen" = "policeman" "policewomen" = "policewoman" "postmen" = "postman" "preliminaries" "prognoses" = "prognosis" "protozoa" = "protozoon" "radii" = "radius" "referenda" = "referendum" "remains" "repairmen" = "repairman" "rhombi" = "rhombus" "riches" "riflemen" = "rifleman" "rights-of-way" = "right-of-way" "roundsmen" = "roundsman" "runners-up" = "runner-up" "salesmen" = "salesman" "saleswomen" = "saleswoman" "sanatoria" = "sanatorium" "scissors" "scleroses" = "sclerosis" "seamen" = "seaman" "selves" = "self" "shelves" = "shelf" "snowmen" = "snowman" "soli" = "solo" "spectra" = "spectrum" "spokesmen" = "spokesman" "spokeswomen" = "spokeswoman" "sportsmen" = "sportsman" "sportswomen" = "sportswoman" "staphylococci" = "staphylococcus" "statesmen" = "statesman" "stateswomen" = "stateswoman" "stimuli" = "stimulus" "strata" = "stratum" "stuntmen" = "stuntman" "styli" = "stylus" "suds" "sundries" "sunglasses" "supermen" = "superman" "surroundings" "swine" "symposia" = "symposium" "synopses" = "synopsis" "synthetics" "tatters" "teeth" = "tooth" "termini" = "terminus" "theses" = "thesis" "thieves" = "thief" "tribesmen" = "tribesman" "trousseaux" = "trousseau" "turves" = "turf" "vertebrae" = "vertebra" "wages" "wares" "watchmen" = "watchman" "wharves" = "wharf" "wolves" = "wolf" "workings" "workmen" = "workman" "yachtsmen" = "yachtsman" "yeomen" = "yeoman" "yesses" = "yes" N[ num=pl typ=c gen=n r=i ] "cattle" "matrices" = "matrix" "syntheses" = "synthesis" N[ num=pl typ=p2 gen=n ] "Olympics" N[ num=sg typ=c ] "Albanian" "Anglo-Saxon" "Armenian" "Bulgarian" "Burmese" "Cambodian" "Cze&ch;" = "Czech" "German" "Greek" "Hungarian" "Italian" "Korean" "Laotian" "Malay" "Mongolian" "Norwegian" "Persian" "Romanian" "Rumanian" "Russian" "Samoan" "Soviet" "Tahitian" "Thai" "Tibetan" "Ukrainian" "conspirator" "greengrocer" "host" "investment" "nude" "organizer" "owner" "participant" "partner" "payee" "pioneer" "planter" "plotter" "printer" "producer" "progenitor" "proponent" "proprietor" "protector" "publisher" "pupil" "purchaser" "putter" "rambler" "regulator" "representative" "retailer" "rival" "rocker" "ruler" "sage" "scout" "scribe" "scruff" "slave" "sleeper" "sovereign" "speaker" "sponsor" "star" "starter" "stockholder" "stockist" "straggler" "striker" "stripper" "subcontractor" "subordinate" "successor" "sucker" "supplier" "supporter" "tester" "toddler" "trader" "vendor" "veteran" "victim" "ward" "welder" "wholesaler" "winner" N[ num=sg typ=c gen=f ] "Conservatrice" "Jewess" "Negress" "actress" "aunt" "auntie" "aunty" "authoress" "ballerina" "barmaid" "baroness" "benefactress" "blonde" "bride" "bridesmaid" "brunette" "call-girl" "chambermaid" "charlady" "comedienne" "conductress" "courtesan" "czarina" "daughter" "fiancée" "great-grandmother" "headmistress" "heroine" "hostess" "landlady" "lesbian" "madam" "mama" "manageress" "masseuse" "mayoress" "mistress" "mom" "mother" "mother-in-law" "mum" "mummy" "murderess" "nanny" "niece" "nun" "priestess" "princess" "protégée" "schoolgirl" "schoolmistress" "shepherdess" "sister" "sister-in-law" "soprano" "spinster" "stepmother" "stepsister" "stewardess" "usherette" "waitress" "whore" "widow" N[ num=sg typ=c gen=f r=i ] "Dutchwoman" "Frenchwoman" "businesswoman" "chairwoman" "charwoman" "committeewoman" "congresswoman" "councilwoman" "daughter-in-law" "horsewoman" "housewife" "midwife" "mother-to-be" "spacewoman" "wife" "woman" N[ num=sg typ=c gen=f|n ] "sultana" "wren" N[ num=sg typ=c gen=m ] "abbot" "barber" "bard" "baritone" "baron" "baronet" "bellboy" "blond" "boyfriend" "bridegroom" "brother" "butler" "choirboy" "commissar" "commissionaire" "confessor" "cowboy" "czar" "docker" "fiancé" "great-grandfather" "headmaster" "her&y_o;" = "hero" "husband" "mar&qu;ess" = "marquess" "masseur" "master" "miller" "miner" "navvy" "nephew" "overlord" "padre" "papa" "parson" "prince" "prior" "protégé" "rajah" "reverend" "s&qu;ire" = "squire" "schoolboy" "schoolmaster" "sheik" "sheikh" "son" "steeplejack" "stepbrother" "stepfather" "stevedore" "steward" "sultan" "teamster" "tenor" "viscount" "welterweight" "widower" N[ num=sg typ=c gen=m r=i ] "Dutchman" "Frenchman" "barman" "batman" "batsman" "brother-in-law" "businessman" "churchman" "clergyman" "coachman" "coalman" "committeeman" "congressman" "conman" "countryman" "doorman" "dustman" "horseman" "madman" "man" "ombudsman" "railwayman" "serviceman" "son-in-law" "strongman" N[ num=sg typ=c gen=m|f ] "&qu;adruplet" = "quadruplet" "&qu;arterback" = "quarterback" "&qu;artermaster" = "quartermaster" "&qu;eer" = "queer" "&qu;intuplet" = "quintuplet" "Afghan" "African" "Algerian" "American" "Anglican" "Angolan" "Arab" "Argentine" "Argentinian" "Asian" "Asiatic" "Australian" "Austrian" "Belgian" "Bolivian" "Brazilian" "Briton" "Buddhist" "Canadian" "Catholic" "Celt" "Chilean" "Colombian" "Conservative" "Cuban" "Cypriot" "Czechoslovakian" "Dane" "Ecuadorian" "Egyptian" "Ethiopian" "European" "Ghanaian" "Indian" "Iranian" "Iraqi" "Israeli" "Israelite" "Jamaican" "Jew" "Jordanian" "Jugoslav" "Lapp" "Lebanese" "Liberian" "Libyan" "Londoner" "Luddite" "Malayan" "Malaysian" "Martian" "Marxist" "Mexican" "Mongol" "Moroccan" "Moslem" "Muslim" "Negr&y_o;" = "Negro" "Nepali" "Nicaraguan" "Nigerian" "Pakistani" "Palestinian" "Paraguayan" "Parisian" "Peruvian" "Quaker" "Rhodesian" "Roman" "Scandinavian" "Scot" "Siberian" "Sicilian" "Slav" "Spaniard" "Swede" "Syrian" "Tanzanian" "Tunisian" "Turk" "Ugandan" "Uruguayan" "Venetian" "Venezuelan" "Victorian" "Yank" "Yankee" "Yugoslav" "Zairean" "Zambian" "Zimbabwean" "Zionist" "abolitionist" "aboriginal" "aborigine" "absentee" "ac&qu;aintance" = "acquaintance" "academic" "accompanist" "accomplice" "accountant" "acrobat" "actor" "addict" "adjutant" "administrator" "admiral" "admirer" "adolescent" "advertiser" "agnostic" "agronomist" "alarmist" "alcoholic" "amateur" "ambassador" "anaesthetist" "analyst" "anarchist" "ancestor" "anesthetist" "anglican" "anglo-saxon" "anthropologist" "anti&qu;arian" = "antiquarian" "applicant" "appointee" "appraiser" "apprentice" "archaeologist" "archbishop" "archeologist" "architect" "archivist" "aristocrat" "artisan" "artist" "ascetic" "assailant" "assassin" "assessor" "assistant" "associate" "asthmatic" "astrologer" "astronaut" "astronomer" "astrophysicist" "atheist" "athlete" "attaché" "attacker" "attendant" "attorney" "auctioneer" "auditor" "author" "autocrat" "baby-sitter" "backbencher" "baker" "balloonist" "ballplayer" "bandit" "banker" "bankrupt" "baptist" "barbarian" "barrister" "bartender" "beautician" "beggar" "beginner" "believer" "beloved" "benefactor" "bigot" "bigwig" "biochemist" "biographer" "biologist" "blackmailer" "blacksmith" "bo'sun" "boarder" "boatswain" "bobby" "bodybuilder" "bodyguard" "bookmaker" "bookseller" "bosun" "botanist" "bricklayer" "brigadier" "broadcaster" "bullfighter" "bureaucrat" "burglar" "bursar" "busybody" "butcher" "bystander" "cabinet-maker" "caller" "cannibal" "canoeist" "capitalist" "captain" "cardinal" "caretaker" "carpenter" "cartographer" "cartoonist" "cashier" "castaway" "cellist" "censor" "centre-forward" "centre-half" "champion" "chancellor" "chaplain" "chauffeur" "cheerleader" "chemist" "chessplayer" "chief" "chieftain" "chiropodist" "choreographer" "chorister" "christian" "churl" "citizen" "civilian" "claimant" "classmate" "clerk" "co-pilot" "co-star" "cockney" "collaborator" "colleague" "colonel" "columnist" "comedian" "commander" "commissioner" "commoner" "communicator" "communist" "commuter" "compère" "composer" "comrade" "conformist" "connoisseur" "constable" "consul" "consultant" "consumer" "contemporary" "contestant" "contortionist" "contralto" "conversationalist" "convict" "copywriter" "corporal" "cosmonaut" "councillor" "counsellor" "counselor" "courtier" "cousin" "coward" "cowhand" "coxswain" "creator" "cricketer" "critic" "crofter" "crook" "cryptographer" "curator" "cynic" "dancer" "darling" "dean" "decorator" "defeatist" "defector" "defendant" "delegate" "demagogue" "democrat" "dentist" "depositor" "deputy" "dermatologist" "deserter" "detective" "devotee" "dictator" "dissident" "divorcee" "doctor" "donor" "draper" "drunkard" "dry-cleaner" "gravedigger" "gynaecologist" "gypsy" "haemophiliac" "hostage" "hotelier" "housekeeper" "human" "humorist" "humourist" "hunchback" "hypnotist" "iconoclast" "in-law" "industrialist" "inmate" "instrumentalist" "interviewer" "inventor" "investigator" "landlord" "landlubber" "landowner" "latecomer" "lawbreaker" "lawyer" "layabout" "learner" "lecher" "lecturer" "lexicographer" "liar" "liberal" "librarian" "lieutenant" "life-saver" "lifeguard" "lodger" "lover" "lutheran" "manager" "mayor" "medallist" "megalomaniac" "milliner" "millionaire" "mime" "minstrel" "misanthropist" "miser" "misogynist" "monarch" "monarchist" "motorcyclist" "motorist" "mountaineer" "mourner" "murderer" "musician" "mystic" "naturalist" "navigator" "neo-Nazi" "non-smoker" "nonentity" "northerner" "novelist" "novice" "nudist" "nurse" "officer" "official" "onlooker" "operative" "operator" "opponent" "opportunist" "optician" "optimist" "orator" "orderly" "organist" "ornithologist" "orthodontist" "osteopath" "outlaw" "outpatient" "outrider" "outsider" "overseer" "pagan" "pal" "palmist" "paraplegic" "paratrooper" "parent" "partisan" "passenger" "pathologist" "patient" "patriot" "patron" "pauper" "pawnbroker" "peasant" "pedestrian" "peer" "penfriend" "pensioner" "perfectionist" "performer" "person" "pervert" "pessimist" "pharmacist" "philanderer" "philanthropist" "philatelist" "philosopher" "photographer" "physician" "physicist" "physiotherapist" "pianist" "pickpocket" "picnicker" "pilgrim" "pilot" "pimp" "pinup" "piper" "pirate" "plaintiff" "plasterer" "platelayer" "player" "playgoer" "playmate" "playwright" "plodder" "plumber" "poacher" "politician" "porter" "poser" "postgraduate" "postmaster" "potholer" "potter" "practitioner" "preacher" "prefect" "prelate" "premier" "presbyterian" "president" "priest" "prisoner" "professional" "programmer" "promoter" "prompter" "proofreader" "propagandist" "prophet" "proposer" "prosecutor" "prospector" "prostitute" "protagonist" "protestant" "prowler" "psychiatrist" "psychic" "psychoanalyst" "psychologist" "psychopath" "psychotherapist" "psychotic" "publican" "pundit" "punter" "purist" "puritan" "purser" "pursuer" "purveyor" "pygmy" "rabbi" "racialist" "racist" "racketeer" "radiographer" "radiotherapist" "rancher" "ranger" "rapist" "rascal" "ratepayer" "reactionary" "reader" "realist" "realtor" "rebel" "receiver" "receptionist" "recipient" "recluse" "recruit" "rector" "redhead" "referee" "reflexologist" "reformer" "refugee" "regent" "registrar" "reporter" "republican" "rescuer" "researcher" "reservist" "resident" "retainer" "reveller" "reviewer" "revolutionary" "rider" "ringleader" "rioter" "robber" "rogue" "rowdy" "royalist" "s&qu;atter" = "squatter" "sadist" "scaremonger" "sceptic" "scholar" "schoolteacher" "scientist" "scorer" "scoundrel" "scriptwriter" "scrounger" "sculptor" "seafarer" "seconder" "secretary" "secretary-general" "seer" "seller" "senator" "sender" "senior" "sentry" "separatist" "sergeant" "servant" "settler" "shepherd" "sheriff" "shopkeeper" "shoplifter" "shopper" "sightseer" "silversmith" "singer" "sitter" "skater" "skeptic" "skier" "skipper" "sleepwalker" "slicker" "smallholder" "smith" "smoker" "smuggler" "sniper" "socialist" "sociologist" "soldier" "solicitor" "soloist" "sophomore" "sorcerer" "southerner" "spastic" "specialist" "spectator" "speleologist" "spendthrift" "spoilsport" "sponger" "spouse" "sprinter" "spy" "stepchild" "stickler" "stinker" "stockbroker" "stoic" "stoker" "stonemason" "storyteller" "stowaway" "stranger" "strategist" "strikebreaker" "student" "subscriber" "sufferer" "superintendent" "superior" "supervisor" "surgeon" "surveyor" "survivor" "suspect" "swimmer" "swindler" "sympathizer" "tailor" "talker" "taxidermist" "taxpayer" "teacher" "teammate" "technician" "technologist" "telephonist" "televiewer" "teller" "temp" "tenant" "terrorist" "theatre-goer" "theologian" "therapist" "thinker" "timekeeper" "tinker" "toastmaster" "tobacconist" "tourist" "traditionalist" "trainee" "trainer" "traitor" "tramp" "translator" "transvestite" "traveler" "traveller" "treasurer" "treble" "troublemaker" "troubleshooter" "trustee" "user" "usher" "usurer" "vagrant" "valuer" "vegetarian" "ventrilo&qu;ist" = "ventriloquist" "verger" "veterinarian" "vicar" "villager" "villain" "violinist" "virgin" "visionary" "visitor" "vocalist" "volunteer" "voter" "waiter" "walker" "wanderer" "warden" "warder" "warrior" "watchmaker" "weaver" "well-wisher" "wicketkeeper" "worker" "worrier" "worshipper" "wrangler" "wrestler" "writer" "youngster" "zoologist" N[ num=sg typ=c gen=m|f r=i ] "accused" "alderman" "alumnus" "cameraman" "caveman" "chairman" "councilman" "craftsman" "layman" "passer-by" "spaceman" "thief" "tradesman" "vice-chairman" N[ num=sg typ=c gen=m|n ] "Panamanian" "billy-goat" "command&x_o;" = "commando" "male" "page" "respondent" N[ num=sg typ=c gen=m|n r=i ] "bogeyman" N[ num=sg typ=c gen=n ] "élite" "&qu;ack" = "quack" "&qu;ad" = "quad" "&qu;adrangle" = "quadrangle" "&qu;adrant" = "quadrant" "&qu;adruped" = "quadruped" "&qu;adruple" = "quadruple" "&qu;agmire" = "quagmire" "&qu;ake" = "quake" "&qu;alification" = "qualification" "&qu;ality" = "quality" "&qu;alm" = "qualm" "&qu;andary" = "quandary" "&qu;antity" = "quantity" "&qu;arrel" = "quarrel" "&qu;arry" = "quarry" "&qu;art" = "quart" "&qu;arter" = "quarter" "&qu;arter-deck" = "quarter-deck" "&qu;arterly" = "quarterly" "&qu;artet" = "quartet" "&qu;artette" = "quartette" "&qu;atrain" = "quatrain" "&qu;aver" = "quaver" "&qu;ay" = "quay" "&qu;een" = "queen" "&qu;ery" = "query" "&qu;est" = "quest" "&qu;estion" = "question" "&qu;estionnaire" = "questionnaire" "&qu;eue" = "queue" "&qu;icksand" = "quicksand" "&qu;ickstep" = "quickstep" "&qu;iet" = "quiet" "&qu;ill" = "quill" "&qu;ilt" = "quilt" "&qu;in" = "quin" "&qu;ince" = "quince" "&qu;incentenary" = "quincentenary" "&qu;intet" = "quintet" "&qu;intette" = "quintette" "&qu;ip" = "quip" "&qu;irk" = "quirk" "&qu;irt" = "quirt" "&qu;it" = "quit" "&qu;iver" = "quiver" "&qu;iz" = "quiz" "&qu;oit" = "quoit" "&qu;orum" = "quorum" "&qu;ota" = "quota" "&qu;otation" = "quotation" "&qu;ote" = "quote" "&qu;otient" = "quotient" "A&qu;arius" = "Aquarius" "Admiralty" "BCG" "Bible" "CBI" "CID" "Chinese" "D-day" "DJ" "EEC" "Easter" "Eskimo" "Excellency" "Finn" "G-string" "Govt" "Guatemalan" "HQ" "Haitian" "Hindu" "Honduran" "Icelander" "Indonesian" "Kenyan" "L-plate" "Leo" "Libra" "Sagittarius" "Scorpio" "Scotch" "T-s&qu;are" = "T-square" "T-shirt" "Taurus" "Therm&u_o;s" = "Thermos" "Tory" "U-bend" "U-turn" "V-neck" "Virgo" "Welsh" "a&qu;alung" = "aqualung" "a&qu;arium" = "aquarium" "a&qu;educt" = "Aqueduct" "aardvark" "abandon" "abatement" "abattoir" "abbey" "abbreviation" "abdication" "abdomen" "abduction" "aberration" "ability" "abnormality" "abolition" "abortion" "abrasion" "abrasive" "abridgment" "abscess" "absence" "absolute" "absorbent" "absorption" "abstention" "abstinence" "abstract" "abstraction" "absurdity" "abundance" "abuse" "abuser" "abyss" "ac&qu;iescence" = "acquiescence" "ac&qu;isition" = "acquisition" "ac&qu;ittal" = "acquittal" "academy" "acceleration" "accelerator" "accent" "acceptance" "access" "accession" "accessory" "accident" "acclaim" "accompaniment" "accomplishment" "accord" "accordion" "account" "accounting" "accretion" "accumulation" "accuracy" "accusation" "accusative" "ace" "acetate" "ache" "achievement" "acid" "acidity" "acknowledgement" "acknowledgment" "acorn" "acre" "acreage" "acronym" "acrylic" "act" "acting" "action" "activation" "activist" "activity" "acumen" "acupuncture" "ad" "ad-lib" "adage" "adapt" "adaptation" "adapter" "adaptor" "adder" "addiction" "adding-machine" "addition" "additive" "address" "ade&qu;acy" = "adequacy" "adherence" "adherent" "adhesion" "adhesive" "adjective" "adjunct" "adjustment" "administration" "admission" "adoption" "adornment" "adult" "adulteration" "adultery" "advance" "advancement" "advantage" "advent" "adventure" "adverb" "adversary" "adversity" "advert" "advertisement" "adviser" "advocate" "aeg&u_i;s" = "aegis" "aeration" "aerial" "aeroplane" "aerosol" "aerospace" "affair" "affectation" "affection" "affiliate" "affiliation" "affinity" "affirmation" "affirmative" "affix" "affliction" "affray" "affront" "after-shave" "aftermath" "afternoon" "afterthought" "age" "age-group" "agency" "agenda" "agent" "agglomeration" "aggravation" "aggregate" "aggressiveness" "aggressor" "agitation" "agitator" "agony" "agreement" "aid" "aide" "aileron" "ailment" "aim" "air" "airbed" "airconditioning" "aircraft" "airfield" "airgun" "airlift" "airline" "airliner" "airlock" "airplane" "airport" "airstrip" "airway" "aisle" "alarm" "album" "alcohol" "alcoholism" "alcove" "alder" "ale" "alert" "alexandrine" "alfalfa" "alga" "algebra" "algorithm" "alias" "alibi" "alien" "alignment" "alkali" "allegation" "allegiance" "allegory" "allergy" "alley" "alliance" "alligator" "alliteration" "allocation" "allotment" "allowance" "alloy" "allusion" "alluvium" "ally" "almanac" "almond" "alpha" "alphabet" "altar" "alteration" "alternation" "alternative" "alternator" "altitude" "alto" "aluminium" "aluminum" "amalgamation" "amazon" "ambiguity" "ambition" "ambulance" "ambush" "amen" "amendment" "amenity" "amethyst" "ammonia" "ammunition" "amnesty" "amortization" "amount" "ampère" "amp" "amperage" "amphibian" "amphitheater" "amphitheatre" "amplification" "amplifier" "amplitude" "amputation" "amusement" "an&u_u;s" = "anus" "anachronism" "anaconda" "anaemia" "anaesthetic" "anagram" "analgesic" "analogue" "analogy" "anapaest" "anarchy" "anatomy" "ancestry" "anchor" "anchorage" "anchovy" "anecdote" "anesthetic" "angel" "angle" "angling" "animal" "animosity" "ankle" "annex" "annexation" "annihilation" "anniversary" "annotation" "announcement" "announcer" "annoyance" "annual" "annuity" "annulment" "anomaly" "anorak" "answer" "ant" "ant-hill" "antagonist" "anteater" "antecedent" "antelope" "antenna" "anthem" "anthology" "anti&qu;e" = "antique" "anti&qu;ity" = "antiquity" "antibiotic" "anticlimax" "anticyclone" "antidote" "antifreeze" "antipathy" "antiseptic" "antonym" "anvil" "anxiety" "apartheid" "apartment" "ape" "aperitif" "aperture" "apex" "aphrodisiac" "apocalypse" "apology" "apoplexy" "apostle" "apostrophe" "apparat&u_u;s" = "apparatus" "apparel" "apparition" "appeal" "appear" "appearance" "appeasement" "appendage" "appendix" "appetite" "appetizer" "applause" "apple" "appliance" "applicability" "application" "appointment" "appraisal" "appreciation" "apprehension" "apprenticeship" "approach" "appropriation" "approval" "approve" "approximation" "apricot" "apron" "aptitude" "aquaculture" "arbiter" "arbitration" "arbitrator" "arbor" "arbour" "arc" "arcade" "arch" "arch-enemy" "archer" "archetype" "archipelag&x_o;" = "archipelago" "archive" "archway" "arctangent" "area" "arena" "argument" "aristocracy" "ark" "arm" "armament" "armband" "armchair" "armful" "armistice" "armory" "armoury" "armpit" "army" "aroma" "arpeggio" "arraignment" "arrangement" "array" "arrest" "arrival" "arrow" "arsenal" "art" "artefact" "artery" "artichoke" "article" "articulate" "artifice" "artillery" "ascent" "ash" "ashtray" "aside" "asp" "aspect" "aspen" "asphalt" "asphyxiation" "aspirant" "aspiration" "aspirin" "ass" "assassination" "assault" "assemblage" "assembly" "assent" "assertion" "assessment" "asset" "assignment" "assimilation" "association" "assonance" "assortment" "assumption" "assurance" "asterisk" "asteroid" "astonishment" "astringent" "asylum" "asymmetry" "atl&u_a;s" = "atlas" "atmosphere" "atoll" "atom" "atrocity" "atrophy" "attachment" "attack" "attainment" "attempt" "attendance" "attention" "attic" "attire" "attitude" "attraction" "attribute" "aubergine" "auction" "audacity" "audience" "audiotape" "audit" "audition" "auditorium" "augmentation" "aura" "austerity" "authority" "authorization" "authorship" "auto" "autobiography" "autocracy" "autograph" "automatic" "automation" "automobile" "autonomy" "autopsy" "autumn" "auxiliary" "availability" "avalanche" "avant-garde" "avenue" "average" "aversion" "aviary" "avocad&x_o;" = "avocado" "avoidance" "awakening" "award" "awkwardness" "awl" "awning" "ax" "axe" "axiom" "axle" "azalea" "azimuth" "azure" "babe" "baboon" "baby" "babyhood" "bachelor" "back" "back-cloth" "back-up" "backache" "backbone" "backer" "backgammon" "background" "backhand" "backhander" "backing" "backlash" "backlog" "backside" "backstroke" "backup" "backwater" "backyard" "bacon" "bacteriologist" "badge" "badger" "badness" "bag" "bagel" "bagful" "bagpipe" "bail" "bailiff" "bait" "bakery" "balaclava" "balance" "balcony" "bale" "ball" "ball-point" "ballad" "ballet" "balloon" "ballot" "ballroom" "balsam" "balustrade" "ban" "ban&qu;et" = "banquet" "banana" "band" "bandage" "bandstand" "bandwagon" "bang" "banger" "bangle" "banishment" "banister" "banj&x_o;" = "banjo" "bank" "banking" "banknote" "bankruptcy" "banner" "bannister" "banshee" "bantam" "bantam-weight" "baptism" "bar" "barbecue" "barbell" "barbershop" "barbiturate" "bargain" "barge" "bark" "barn" "barnacle" "barometer" "barrage" "barrel" "barricade" "barrier" "barrow" "barter" "bas-relief" "basalt" "base" "baseball" "basement" "bash" "bashing" "basin" "basket" "basketball" "bass" "bassoon" "bastard" "bastion" "bat" "batch" "bath" "bathchair" "bather" "bathing" "bathmat" "bathrobe" "bathroom" "bathtub" "baton" "battalion" "battery" "battle" "battlefield" "battleship" "bauble" "bay" "bayonet" "bazaar" "bazooka" "be&qu;est" = "bequest" "beach" "beacon" "bead" "beak" "beaker" "beam" "bean" "bear" "beard" "bearer" "bearing" "beast" "beat" "beater" "beating" "beauty" "beaver" "bed" "bedcover" "bedding" "bedlam" "bedpost" "bedroom" "bedside" "bedsitter" "bedspread" "bee" "beech" "beefsteak" "beehive" "beeline" "beep" "beer" "beet" "beetle" "beetroot" "beginning" "begonia" "behalf" "behavior" "behaviour" "behind" "beige" "being" "belfry" "belief" "bell" "bellow" "belly" "bellybutton" "belonging" "belt" "bench" "benchmark" "bend" "beneficiary" "benefit" "bent" "bereavement" "beret" "berry" "berth" "best" "bestseller" "bet" "beta" "betrayal" "betrothal" "better" "betting" "bevel" "beverage" "bevy" "bewilderment" "bezel" "bias" "bib" "bibliography" "bicycle" "bid" "bidder" "bidding" "bier" "bigotry" "bike" "bikini" "bill" "billet" "billfold" "bin" "binder" "binding" "bingo" "biopsy" "biota" "biotechnology" "biotope" "birch" "bird" "birdie" "birth" "birthdate" "birthday" "birthplace" "birthright" "biscuit" "bishop" "bison" "bit" "bitch" "bite" "bitter" "bivouac" "black" "blackberry" "blackbird" "blackboard" "blackcurrant" "blackleg" "blacklist" "blackout" "bladder" "blade" "blank" "blanket" "blasphemy" "blast" "blast-off" "blaze" "blazer" "bleach" "bleat" "blemish" "blend" "blessing" "blight" "blind" "blindfold" "blink" "bliss" "blister" "blitz" "blizzard" "blob" "bloc" "block" "blockade" "blockage" "blockhead" "bloke" "blood" "bloodstream" "bloom" "blossom" "blot" "blouse" "blow" "blow-out" "blower" "blowlamp" "blowtorch" "bludgeon" "blue" "bluebell" "blueberry" "bluebottle" "blueprint" "bluff" "blunder" "blur" "blush" "boa" "boar" "board" "board-room" "boarding-school" "boast" "boat" "boater" "boating" "bob" "bobbin" "bobsleigh" "bodice" "body" "bodyweight" "bog" "bogey" "bogie" "boil" "boiler" "bold" "boldface" "boldness" "bollard" "bolster" "bolt" "bomb" "bombardment" "bomber" "bombing" "bombshell" "bon&u_u;s" = "bonus" "bond" "bone" "bonfire" "bonnet" "boo" "book" "bookcase" "booking" "booklet" "bookshelf" "bookshop" "bookstall" "bookstore" "boom" "boomerang" "boon" "boor" "boost" "boot" "booth" "border" "borderline" "bore" "boredom" "borehole" "borough" "borrower" "borstal" "bosom" "boss" "botany" "bother" "bottle" "bottle-opener" "bottleneck" "bottom" "bou&qu;et" = "bouquet" "bough" "boulder" "boulevard" "bounce" "bouncer" "bound" "boundary" "bounty" "bout" "bouti&qu;e" = "boutique" "bow" "bowel" "bowl" "bowler" "box" "boxcar" "boxer" "boxing-glove" "boxing-ring" "boy" "boycott" "boysenberry" "bra" "brace" "bracelet" "bracken" "bracket" "braid" "brain" "brain-drain" "brainwave" "brake" "bramble" "bran" "branch" "brand" "brandy" "brassière" "brassiere" "brat" "bravad&x_o;" = "bravado" "brave" "brawl" "brazier" "breach" "breadcrumb" "breadth" "breadwinner" "break" "breakage" "breakdown" "breaker" "breakfast" "breakthrough" "breakwater" "breast" "breast-stroke" "breath" "breathalyser" "breather" "breathing" "breed" "breeder" "breeding" "breeze" "brew" "brewer" "brewery" "briar" "bribe" "brick" "brickwork" "bridge" "bridle" "brief" "briefcase" "briefing" "brier" "brigade" "brim" "brine" "brink" "bristle" "broad" "broadcast" "broadcasting" "brochure" "broiler" "broker" "bromide" "bronco" "bronze" "brooch" "brood" "brook" "broom" "broomstick" "brothel" "brotherhood" "brow" "brown" "brownie" "bruise" "brunt" "brush" "brush-off" "brushwood" "brutality" "brute" "bubble" "buck" "bucket" "buckle" "buckskin" "bud" "buddy" "budgerigar" "budget" "budgie" "buff" "buffal&x_o;" = "buffalo" "buffer" "buffet" "buffoon" "bug" "bugbear" "buggy" "bugle" "build" "build-up" "builder" "building" "built-in" "bulb" "bulge" "bulk" "bulkhead" "bull" "bull's-eye" "bulldog" "bulldozer" "bullet" "bulletin" "bullfight" "bullfrog" "bullock" "bully" "bulwark" "bum" "bumblebee" "bump" "bumper" "bun" "bunch" "bundle" "bung" "bungalow" "bunion" "bunk" "bunker" "bunny" "buoy" "bur" "burden" "bureau" "bureaucracy" "burglary" "burial" "burles&qu;e" = "burlesque" "burn" "burner" "burning" "burnout" "burp" "burr" "burrow" "bursary" "burst" "bus" "bus-stop" "bush" "bushel" "business" "bust" "bust-up" "bustle" "butt" "butter" "butter-dish" "buttercup" "butterfly" "buttock" "button" "buttonhole" "buttress" "buyer" "buzz" "buzzard" "buzzer" "by-election" "by-law" "by-product" "bye-law" "bypass" "byre" "byte" "byword" "cab" "cabana" "cabaret" "cabbage" "cabin" "cabinet" "cable" "cable-car" "cablegram" "cache" "cact&u_u;s" = "cactus" "caddie" "cadence" "cadet" "cadger" "caesura" "café" "cafe" "cafeteria" "cage" "cake" "calamity" "calculate" "calculation" "calculator" "calendar" "calf" "caliber" "calibration" "calibre" "call" "callbox" "calling" "calorie" "camber" "camel" "cameo" "camera" "camp" "camp&u_u;s" = "campus" "campaign" "campbed" "camper" "campground" "campsite" "can" "can-opener" "canal" "canary" "cancellation" "cancer" "candidacy" "candidate" "candle" "candlestick" "candy" "cane" "canister" "cannery" "cannon" "cannonball" "canoe" "canon" "canopy" "cant" "canteen" "canter" "cantilever" "canton" "canvas" "canyon" "cap" "capability" "capacity" "cape" "caper" "capital" "capitalization" "capitol" "capitulation" "capstan" "capsule" "caption" "captive" "car" "car-ferry" "carafe" "caramel" "carat" "caravan" "caraway" "carbine" "carbohydrate" "carbon" "carburetor" "carburettor" "carcase" "carcass" "carcinogen" "card" "cardboard" "cardigan" "care" "career" "carelessness" "caress" "carg&x_o;" = "cargo" "caribbean" "caricature" "carnation" "carnival" "carol" "carp" "carpet" "carriage" "carriageway" "carrier" "carrot" "carrycot" "cart" "cartel" "cartilage" "carton" "cartoon" "cartridge" "carving" "cascade" "case" "cash" "cashbook" "cashdesk" "cashew" "casing" "casino" "cask" "casket" "casserole" "cassette" "cast" "castanet" "caste" "castle" "castor" "casual" "casualty" "cat" "catalog" "catalogue" "catalyst" "catapult" "cataract" "catastrophe" "catch" "catcher" "catching" "catchment" "catechism" "category" "caterer" "catering" "caterpillar" "cathedral" "cathode" "catholicism" "catkin" "cauliflower" "causal" "cause" "causeway" "caution" "cautiousness" "cavalier" "cavalry" "cave" "cavern" "cavity" "cc" "ceasefire" "cedar" "cedilla" "ceiling" "celebration" "celebrity" "celibate" "cell" "cellar" "cello" "cemetery" "cenotaph" "cens&u_u;s" = "census" "censorship" "censure" "cent" "centenary" "centennial" "center" "centigram" "centiliter" "centilitre" "centime" "centimeter" "centimetre" "centipede" "centre" "centrifuge" "century" "cereal" "ceremony" "certainty" "certificate" "certification" "cervix" "cessation" "cession" "cesspool" "cetacean" "chaffinch" "chagrin" "chain" "chair" "chairlift" "chalet" "chalice" "chalk" "chalkboard" "challenge" "challenger" "chamber" "chamberpot" "chameleon" "championship" "chance" "chancel" "chandelier" "change" "changeover" "changing" "channel" "chant" "chaos" "chap" "chapel" "chaperon" "chaperone" "chapter" "character" "characteristic" "characterization" "charade" "charcoal" "charge" "charity" "charm" "chart" "charter" "chase" "chasm" "chat" "chatterbox" "che&qu;e" = "cheque" "che&qu;ebook" = "chequebook" "cheat" "check" "checkbook" "checklist" "checkmate" "checkpoint" "checkup" "cheek" "cheekbone" "cheer" "cheerfulness" "cheese" "cheeseboard" "chef" "chemical" "cheroot" "cherry" "chessboard" "chest" "chestnut" "chew" "chewing-gum" "chic" "chick" "chicken" "chilblain" "child" "chill" "chillblain" "chime" "chimney" "chimpanzee" "chin" "china" "chink" "chip" "chipboard" "chipmunk" "chipping" "chirp" "chisel" "chit" "chitchat" "chive" "chloride" "chock" "chocolate" "choice" "choir" "choke" "chop" "chopstick" "chor&u_u;s" = "chorus" "chord" "chore" "chow" "christening" "chromatograph" "chrome" "chromosome" "chronicle" "chronology" "chrysal&u_i;s" = "chrysalis" "chrysanthemum" "chuck" "chuckle" "chum" "chunk" "church" "churchyard" "churn" "chute" "chutney" "cider" "cigar" "cigarette" "cinch" "cinder" "cine" "cine-film" "cine-projector" "cinema" "cipher" "circ&u_u;s" = "circus" "circle" "circuit" "circuitry" "circular" "circulation" "circumference" "circumstance" "cistern" "citation" "citizenship" "city" "civil" "civilization" "claim" "clam" "clamber" "clamp" "clan" "clang" "clap" "clapping" "claret" "clarification" "clarinet" "clash" "clasp" "class" "classic" "classification" "classroom" "clatter" "clause" "claw" "clay" "clean-up" "cleaner" "cleaning" "cleanser" "cleansing" "clearance" "clearing" "clearway" "clef" "cli&qu;e" = "clique" "cliché" "cliche" "click" "client" "cliff" "climate" "climax" "climb" "climber" "clinic" "clip" "clipper" "cloak" "cloakroom" "clock" "clod" "clog" "cloister" "clone" "close" "close-up" "closet" "closure" "clot" "cloth" "cloud" "cloudburst" "clout" "clove" "clover" "cloverleaf" "clown" "club" "clubhouse" "clue" "clump" "cluster" "clutch" "clutter" "co" "co-author" "co-ordinate" "co-signatory" "coach" "coal" "coalfield" "coalition" "coalmine" "coast" "coaster" "coastguard" "coastline" "coat" "coating" "cob" "cobble" "cobblestone" "cobra" "cobweb" "cock" "cockerel" "cockle" "cockpit" "cockroach" "cocktail" "coconut" "cocoon" "code" "coefficient" "coerce" "coffee" "coffeepot" "coffin" "cog" "cognac" "cogwheel" "cohesion" "coil" "coin" "coin-box" "coinage" "coincidence" "cola" "colander" "cold" "colic" "collaborate" "collaboration" "collage" "collapse" "collar" "collarbone" "collateral" "collection" "collector" "college" "colliery" "collision" "colon" "colony" "color" "colour" "coloured" "colt" "column" "coma" "comb" "combat" "combination" "combine" "combustion" "comeback" "comedown" "comedy" "comet" "comfort" "comic" "coming" "comma" "command" "commandment" "commemoration" "commencement" "commendation" "comment" "commentary" "commentator" "commerce" "commercial" "commission" "commitment" "committee" "commodity" "common" "commonroom" "commonwealth" "commotion" "commune" "communi&qu;é" = "communiqué" "communication" "communion" "community" "companion" "company" "comparison" "compartment" "compass" "compendium" "compensation" "competition" "competitive" "competitor" "compilation" "compiler" "complainant" "complaint" "complement" "completion" "complex" "complexion" "complexity" "complication" "compliment" "component" "composite" "composition" "compost" "composure" "compound" "comprehend" "comprehension" "compression" "compromise" "compulsion" "computation" "computer" "con" "con&qu;eror" = "conqueror" "con&qu;est" = "conquest" "conceit" "concentrate" "concentration" "concept" "conception" "concern" "concert" "concertina" "concerto" "concession" "concessionaire" "conclave" "conclusion" "concoction" "concordance" "concourse" "concussion" "condemn" "condemnation" "condensation" "condense" "condition" "conditioner" "condolence" "conduct" "conductivity" "conductor" "conduit" "cone" "confectioner" "confederacy" "confederate" "confederation" "conference" "confession" "confessional" "confidence" "configuration" "confine" "confinement" "confirmation" "confiscation" "conflagration" "conflict" "confrontation" "confusion" "congestion" "conglomeration" "congratulation" "congregation" "congress" "conifer" "conjecture" "conjugation" "conjunction" "conjurer" "connection" "connexion" "connotation" "conscience" "conscript" "conse&qu;ence" = "consequence" "consens&u_u;s" = "consensus" "consent" "conservation" "conservatory" "consideration" "consignment" "consistency" "consolation" "console" "consolidation" "consonant" "consortium" "conspiracy" "constabulary" "constant" "constellation" "constituency" "constituent" "constitution" "constraint" "constriction" "constrictor" "construct" "construction" "consulate" "consult" "consultancy" "consultation" "consumerism" "contact" "container" "containment" "contaminant" "contamination" "contemplation" "contempt" "contender" "content" "contention" "contest" "context" "continent" "contingency" "contingent" "continuation" "continuum" "contortion" "contour" "contraceptive" "contract" "contraction" "contractor" "contradiction" "contraption" "contrast" "contravention" "contribution" "contributor" "contrivance" "control" "controller" "controversy" "convalescence" "convalescent" "convector" "convenience" "convent" "convention" "conversation" "converse" "conversion" "convert" "converter" "convertible" "conviction" "convoy" "convulsion" "cook" "cookbook" "cooker" "cookery" "cookie" "cool" "coolant" "coop" "cooperative" "coordination" "coordinator" "coot" "cop" "copper" "coppice" "copse" "copy" "copycat" "copyright" "cord" "cordial" "cordon" "corduroy" "core" "cork" "corkage" "corkscrew" "corm" "cormorant" "corn" "cornea" "corner" "cornerstone" "cornet" "cornice" "cornucopia" "corollary" "coronary" "coronation" "coroner" "coronet" "corporation" "corpse" "corpuscle" "corral" "correction" "correlation" "correspondence" "correspondent" "corridor" "corrosion" "corrugated" "corruption" "corset" "cortège" "cortex" "cosh" "cosignatory" "cosine" "cost" "costume" "cot" "cottage" "couch" "cougar" "cough" "council" "counsel" "count" "countdown" "countenance" "counter" "counter-espionage" "counterattack" "counterexample" "counterfeit" "counterfoil" "countermeasure" "counterpart" "counterpoint" "counterweight" "countess" "country" "county" "coupé" "couple" "coupler" "couplet" "coupling" "coupon" "courage" "courier" "course" "court" "court-house" "court-martial" "courtesy" "courtroom" "courtyard" "cove" "covenant" "cover" "covering" "cow" "cowshed" "coyote" "crèche" "crêpe" "crab" "crack" "cracker" "crackle" "crackling" "cradle" "craft" "craftsmanship" "crag" "cramming" "cramp" "crampon" "cranberry" "crane" "cranium" "crank" "crankshaft" "cranny" "crash" "crate" "crater" "cravat" "cravate" "crawl" "crayon" "craze" "creak" "cream" "creamery" "crease" "creation" "creature" "credential" "credit" "creditor" "credo" "creed" "creek" "creep" "creeper" "cremation" "creosote" "crescend&x_o;" = "crescendo" "crescent" "cress" "crest" "crevasse" "crevice" "crew" "crew-neck" "crib" "crick" "cricket" "crime" "criminal" "cripple" "crisp" "criti&qu;e" = "critique" "criticism" "cro&qu;et" = "croquet" "cro&qu;ette" = "croquette" "croc&u_u;s" = "crocus" "crocodile" "croft" "crony" "crop" "cropper" "cross" "cross-examination" "cross-reference" "cross-section" "crossbar" "crossbreed" "crosscountry" "crossing" "crossroad" "crosswind" "crossword" "crotch" "crotchet" "crouton" "crow" "crowbar" "crowd" "crown" "crucifix" "crude" "cruelty" "cruet" "cruise" "cruiser" "crumb" "crumpet" "crunch" "crusade" "crusader" "crush" "crust" "crustacean" "crutch" "crux" "cry" "crypt" "cryptogram" "crystal" "cub" "cubbyhole" "cube" "cubicle" "cubist" "cuckoo" "cucumber" "cud" "cudgel" "cue" "cuff" "cufflink" "cuisine" "cul-de-sac" "culmination" "culprit" "cult" "culture" "cup" "cup-tie" "cupboard" "cupola" "curate" "curb" "cure" "curfew" "curio" "curiosity" "curl" "curler" "curling" "currant" "currency" "current" "curry" "curse" "cursor" "curtain" "curtsey" "curvature" "curve" "cushion" "custard" "custodian" "custody" "custom" "customer" "cut" "cutaway" "cutback" "cuticle" "cutlet" "cutoff" "cutout" "cutting" "cyclamen" "cycle" "cycling" "cyclist" "cyclone" "cygnet" "cylinder" "cymbal" "cypress" "cyst" "début" "décor" "dabble" "dactyl" "dad" "daddy" "daffodil" "dagger" "daily" "dairy" "daisy" "dale" "dam" "damage" "damn" "damp" "dampness" "damson" "dance" "dandelion" "dandruff" "danger" "dare" "daredevil" "dark" "dart" "dartboard" "dash" "dashboard" "databank" "database" "date" "dateline" "dawn" "day" "daydream" "daze" "deacon" "dead" "deadline" "deadlock" "deaf-aid" "deaf-mute" "deafness" "deal" "dealer" "dear" "dearth" "death" "deathbed" "debate" "debit" "debt" "debtor" "debut" "decade" "decadence" "decal" "decanter" "deceit" "deceleration" "decency" "deception" "decibel" "decimal" "decision" "deck" "deckchair" "declaration" "decline" "decoration" "decoy" "decrease" "decree" "dedication" "deduction" "deed" "deep-freeze" "deerskin" "default" "defaulter" "defeat" "defect" "defence" "defender" "defense" "deferment" "deficiency" "deficit" "defile" "definition" "deflation" "deflection" "deflexion" "deformation" "deformity" "degradation" "degree" "deity" "delay" "delegation" "deletion" "deliberation" "delicacy" "delicatessen" "delight" "delin&qu;ent" = "delinquent" "delivery" "delta" "deluge" "delusion" "demand" "demarcation" "demise" "demister" "demobilization" "democracy" "demography" "demolition" "demon" "demonstration" "demonstrator" "den" "denial" "denim" "denomination" "denominator" "density" "dent" "dentifrice" "denture" "denunciation" "deodorant" "department" "departure" "dependence" "dependency" "dependent" "depletion" "deployment" "depopulation" "deportation" "deportment" "deposit" "depository" "depot" "depravity" "depreciation" "depression" "deprivation" "depth" "deputation" "derailment" "derivate" "derivation" "derivative" "derrick" "descendant" "descendent" "descent" "description" "desert" "desertion" "desiccation" "design" "designation" "designer" "desire" "desk" "despatch" "dessert" "dessertspoon" "destination" "destiny" "destroyer" "destruction" "detachment" "detail" "detainee" "detection" "detector" "detention" "detergent" "deterioration" "determinant" "deterrent" "detonation" "detonator" "detour" "devaluation" "developer" "development" "deviation" "device" "devil" "devotion" "dew" "diabetic" "diagonal" "diagram" "dial" "dialect" "dialog" "dialogue" "diameter" "diamond" "diaper" "diaphragm" "diarrhea" "diarrhoea" "diary" "dictate" "dictation" "dictatorship" "diction" "dictionary" "die" "diesel" "diet" "difference" "differential" "differentiation" "difficulty" "dig" "digest" "digestion" "digit" "dignitary" "digression" "dilemma" "dilution" "dime" "dimension" "dimple" "din" "diner" "dinghy" "dinner" "dinosaur" "diocese" "dioxide" "dip" "diphthong" "diploma" "diplomat" "dipstick" "dipty&ch;" = "diptych" "direct" "direction" "directive" "director" "directorate" "directory" "dirt" "dis&qu;alification" = "disqualification" "disability" "disadvantage" "disagreement" "disappearance" "disappointment" "disaster" "disbursement" "disc" "discharge" "disciple" "disclosure" "disco" "discomfort" "discord" "discothè&qu;e" = "discothèque" "discothe&qu;e" = "discotheque" "discount" "discourse" "discovery" "discrepancy" "discus" "discussion" "disease" "disengagement" "disgrace" "disguise" "dish" "dishcloth" "dishwasher" "disillusion" "disinfectant" "disk" "diskette" "dislike" "dismissal" "disorder" "disparity" "dispatch" "dispensary" "dispenser" "dispersal" "dispersion" "displace" "displacement" "display" "disposal" "dispute" "disruption" "dissolution" "distance" "disti&ch;" = "distich" "distillation" "distillery" "distinction" "distortion" "distraction" "distribution" "distributor" "district" "disturbance" "ditch" "divan" "dive" "diver" "divergence" "diversion" "dividend" "divinity" "division" "divisor" "divorce" "do-it-yourself" "dock" "docket" "dockyard" "doctorate" "doctrine" "document" "documentary" "dodge" "dodgem" "dog" "dogma" "doll" "dollar" "dolphin" "domain" "dome" "domicile" "domin&x_o;" = "domino" "dominion" "don" "donation" "donkey" "doomsday" "door" "doorbell" "doormat" "doorpost" "doorstep" "doorway" "dope" "dormitory" "dosage" "dose" "dossier" "dot" "double" "doubledecker" "doubt" "doughnut" "dove" "downfall" "downpour" "downturn" "dowry" "doze" "dozen" "drachma" "draft" "drag" "dragon" "dragonfly" "drain" "drainpipe" "dram" "drama" "dramatist" "drape" "draught" "draughtboard" "draw" "drawback" "drawbridge" "drawer" "drawing" "drawl" "dread" "dream" "dreamer" "dredger" "dress" "dresser" "dressing-gown" "dressmaker" "drill" "drink" "drinker" "drip" "drive" "drive-in" "driver" "driveway" "driving" "dromedary" "drone" "drop" "drought" "drove" "drudge" "drug" "druggist" "drugstore" "drum" "drumstick" "drunk" "dry" "dry-cleaning" "dryer" "duchess" "duck" "duckling" "duct" "dud" "due" "duel" "duet" "duke" "dummy" "dump" "dumpling" "dunce" "dune" "dungeon" "dupe" "duplicate" "duplication" "duplicator" "durability" "duration" "duress" "dusk" "dustbin" "duster" "duty" "dweller" "dwelling" "dye" "dyke" "dynamite" "dynamo" "dynasty" "e&qu;al" = "equal" "e&qu;ality" = "equality" "e&qu;alization" = "equalization" "e&qu;alizer" = "equalizer" "e&qu;ation" = "equation" "e&qu;ator" = "equator" "e&qu;ilibrium" = "equilibrium" "e&qu;inox" = "equinox" "e&qu;ipment" = "equipment" "e&qu;ity" = "equity" "e&qu;ivalence" = "equivalence" "e&qu;ivalent" = "equivalent" "eagle" "ear" "earache" "eardrum" "earl" "earphone" "earring" "earth" "earth&qu;ake" = "earthquake" "earwig" "easel" "eave" "ebb" "eccentric" "eccentricity" "ecclesiastic" "ech&y_o;" = "echo" "eclipse" "economist" "economy" "ecosystem" "ecstasy" "ecu" "eddy" "edge" "edict" "edifice" "edition" "editor" "editorial" "educator" "eel" "effect" "effigy" "effluent" "effort" "egg" "eggcup" "eggplant" "eggshell" "ego" "egoist" "egotist" "eiderdown" "ejaculation" "eject" "ejection" "elastic" "elbow" "elder" "election" "elector" "electorate" "electrician" "electrode" "electron" "elegy" "element" "elephant" "elevate" "elevation" "elevator" "elimination" "elite" "ellipse" "elm" "elopement" "embankment" "embarg&y_o;" = "embargo" "embarkation" "embarrassment" "embassy" "emblem" "embrace" "embroidery" "embryo" "emerald" "emergence" "emergency" "emery" "emetic" "emigrant" "eminence" "emission" "emotion" "emperor" "empire" "employee" "employer" "empress" "emulsion" "enamel" "enclave" "enclosure" "encomium" "encore" "encounter" "encouragement" "encroachment" "encyclopaedia" "encyclopedia" "end" "end-user" "endeavor" "endeavour" "ending" "endive" "endorsement" "endowment" "enemy" "energy" "engagement" "engine" "engineer" "engraving" "enhancement" "enigma" "enlargement" "enmity" "enough" "enquiry" "enrollment" "enrolment" "ensemble" "ensign" "enterprise" "entertainer" "entertainment" "enthusiasm" "enthusiast" "entirety" "entitlement" "entity" "entrée" "entrance" "entrant" "entreaty" "entrepreneur" "entry" "envelope" "environment" "envoy" "envy" "enzyme" "epic" "epicure" "epidemic" "epigram" "epilepsy" "epileptic" "epilogue" "episcopalian" "episode" "epistle" "epitaph" "epithet" "epitome" "epo&ch;" = "epoch" "era" "eraser" "erection" "ermine" "errand" "error" "eruption" "es&qu;ire" = "esquire" "escalation" "escalator" "escapade" "escape" "escort" "esophag&u_u;s" = "esophagus" "esplanade" "essay" "essence" "establishment" "estate" "esteem" "estimate" "estimation" "estuary" "etching" "eternity" "ether" "ethic" "etymology" "eulogy" "euphemism" "evacuation" "evaluation" "evangelist" "evaporate" "evasion" "eve" "evening" "evensong" "event" "eventuality" "evergreen" "eviction" "evil" "ewe" "ewer" "exactitude" "exaggeration" "exam" "examination" "examiner" "example" "excavation" "excavator" "exception" "excerpt" "excess" "exchange" "exchange-rate" "exche&qu;er" = "exchequer" "excise" "excitement" "exclamation" "exclusion" "exclusive" "excursion" "excuse" "execution" "executioner" "executive" "executor" "exemption" "exercise" "exhaust" "exhibit" "exhibition" "exhibitionist" "exhibitor" "exile" "exit" "expanse" "expansion" "expatriate" "expectation" "expedient" "expedition" "expenditure" "expense" "experience" "experiment" "expert" "expiration" "expiry" "explanation" "exploit" "exploration" "explorer" "explosion" "explosive" "exponent" "export" "exporter" "exposition" "exposure" "express" "expression" "expressway" "expulsion" "extension" "extent" "exterior" "extermination" "extinction" "extinguisher" "extortion" "extra" "extract" "extraction" "extradition" "extreme" "extremist" "extremity" "extrovert" "eye" "eye-opener" "eyeball" "eyebath" "eyebrow" "eyeglass" "eyelash" "eyelet" "eyelid" "eyeshadow" "eyesore" "eyewash" "eyrie" "fête" "façade" "fable" "fabric" "fabrication" "facade" "face" "facet" "facia" "facility" "facing" "facsimile" "fact" "faction" "factor" "factory" "faculty" "fad" "fag" "failing" "failure" "faint" "fair" "fairground" "fairy" "faith" "fake" "falcon" "fall" "fallacy" "fallow" "false" "falsehood" "family" "famine" "fan" "fanatic" "fancy" "fang" "fanlight" "fantasy" "far" "farce" "fare" "farewell" "farm" "farmer" "farmhand" "farmhouse" "farmyard" "fart" "fascia" "fascist" "fashion" "fast" "fasten" "fastener" "fastening" "fat" "fatalism" "fatality" "fate" "father" "father-in-law" "fathom" "fatigue" "faucet" "fault" "fauna" "favor" "favorite" "favour" "favourite" "fawn" "fax" "fear" "feast" "feat" "feather" "feather-weight" "feature" "federation" "fee" "feed" "feeder" "feel" "feeler" "feeling" "fellow" "fellowship" "felony" "female" "feminist" "fence" "fender" "ferment" "fermentation" "fern" "ferry" "fertile" "fertilizer" "festival" "festivity" "fet&u_u;s" = "fetus" "fetish" "fetter" "feud" "feudalism" "fever" "fiasc&y_o;" = "fiasco" "fib" "fiber" "fibre" "fiction" "fiddle" "fiddler" "field" "fiend" "fiesta" "fig" "fight" "fighter" "figment" "figure" "figurehead" "filament" "file" "filing" "fill" "fillet" "filling" "fillip" "film" "filmstrip" "filter" "filtration" "fin" "final" "finale" "finalist" "finance" "financier" "find" "finding" "fine" "finesse" "finger" "fingernail" "fingerprint" "fingerstall" "fingertip" "finish" "fiord" "fir" "fire" "firearm" "fireplace" "fireside" "firework" "firing" "firm" "first" "fish" "fishery" "fishmonger" "fission" "fissure" "fist" "fit" "fitment" "fitter" "fitting" "fiver" "fix" "fixture" "fjord" "flag" "flagon" "flagpole" "flake" "flame" "flaming&x_o;" = "flamingo" "flan" "flange" "flank" "flannel" "flap" "flare" "flash" "flashback" "flashbulb" "flasher" "flashlight" "flask" "flat" "flatterer" "flavor" "flavoring" "flavour" "flavouring" "flaw" "flea" "fledgeling" "fledgling" "fleece" "fleet" "flex" "flick" "flicker" "flier" "flight" "fling" "flint" "flip" "flirt" "flirtation" "float" "flock" "flood" "floodlight" "floor" "floorboard" "flooring" "flop" "florist" "flounce" "flounder" "flour" "flourish" "flow" "flower" "flowerpot" "fluctuation" "fluff" "fluid" "fluke" "fluoride" "flurry" "flush" "fluster" "flute" "flutter" "flux" "fly" "flyover" "flypast" "flysheet" "flywheel" "foal" "foam" "focus" "foe" "foet&u_u;s" = "foetus" "fog" "foible" "foil" "fold" "folder" "folk" "folklore" "folksong" "follow-up" "follower" "following" "folly" "fondue" "font" "food" "foodstuff" "fool" "foot" "football" "footballer" "footbrake" "footbridge" "foothold" "footing" "footlight" "footnote" "footpath" "footprint" "footrest" "footstep" "footwear" "foray" "force" "ford" "fore" "forearm" "foreboding" "forecast" "forecourt" "forefather" "forefinger" "foreground" "forehead" "foreign" "foreigner" "foreleg" "forerunner" "foresight" "forest" "foretaste" "forethought" "foreword" "forfeit" "forge" "forger" "forgery" "fork" "form" "formalism" "formality" "format" "formation" "formula" "formulation" "fort" "forte" "fortification" "fortnight" "fortress" "fortune" "forum" "forward" "fossil" "foster-parent" "foul" "foundation" "founder" "foundry" "fount" "fountain" "foursome" "fowl" "fox" "foyer" "fraction" "fracture" "fragment" "fragrance" "frame" "framework" "franc" "franchise" "frankfurter" "fraternity" "fraud" "fray" "fre&qu;ency" = "frequency" "freak" "freckle" "free" "free-for-all" "freedom" "freelance" "freemason" "freeway" "freeze" "freezer" "freighter" "frenzy" "fresco" "friar" "friction" "fridge" "friend" "frieze" "frigate" "fright" "frill" "fringe" "fritter" "frivolity" "frock" "frog" "frolic" "front" "frontage" "frontier" "frost" "frown" "fruit" "fruiterer" "frustration" "fuchsia" "fuddy-duddy" "fuel" "fugitive" "fulfillment" "fulfilment" "full" "full-time" "fullback" "fume" "function" "fund" "fundamental" "fundamentalist" "funeral" "fungicide" "funnel" "fur" "furlong" "furlough" "furnace" "furnishing" "furrier" "furrow" "fury" "fuse" "fuselage" "fusion" "fuss" "future" "fuze" "g&u_a;s" = "gas" "g&y_o;" = "go" "g-string" "gable" "gadget" "gag" "gage" "gain" "gait" "gala" "galaxy" "gale" "gall-bladder" "gallantry" "gallery" "galley" "gallon" "gallop" "gallstone" "gambit" "gamble" "gambler" "game" "gamekeeper" "gamma" "gammon" "gang" "gangster" "gangway" "gantry" "gaol" "gap" "garage" "garb" "garbage" "garden" "gardener" "gargoyle" "garland" "garment" "garret" "garrison" "garter" "gash" "gasket" "gasmask" "gasp" "gaswell" "gate" "gateway" "gathering" "gauge" "gauntlet" "gavel" "gaze" "gazelle" "gazette" "gazetteer" "gear" "gel" "gem" "gender" "general" "generality" "generalization" "generation" "generator" "genitive" "genius" "genotype" "gent" "gentile" "geographer" "geologist" "geranium" "germ" "gestation" "gesture" "getaway" "geyser" "gherkin" "ghett&x_o;" = "ghetto" "ghost" "giant" "gibe" "gift" "giggle" "gill" "gimlet" "gimmick" "gin" "gingerbread" "gipsy" "giraffe" "girder" "girdle" "girl" "girlfriend" "girth" "gist" "glacier" "glance" "gland" "glare" "glass" "glasshouse" "glaze" "glazier" "gleam" "glen" "glide" "glider" "glimmer" "glimpse" "glint" "glitter" "globe" "glory" "gloss" "glossary" "glove" "glow" "glue" "glut" "glutton" "gluttony" "gnat" "gnome" "go-ahead" "go-between" "go-cart" "go-kart" "go-slow" "goal" "goal-post" "goalkeeper" "goat" "goblet" "goblin" "god" "goddess" "godfather" "godmother" "godsend" "godson" "gold" "goldmine" "golfer" "gondola" "gong" "good" "good-bye" "goodbye" "gooseberry" "gorge" "gorilla" "gospel" "gossip" "governess" "government" "governor" "gown" "grab" "grace" "gradation" "grade" "gradient" "graduate" "graduation" "graft" "grain" "gram" "grammar" "gramme" "gramophone" "granary" "grand" "granddad" "granddaughter" "grandeur" "grandfather" "grandma" "grandmother" "grandpa" "grandparent" "grandson" "grandstand" "granny" "grant" "granule" "grape" "grapevine" "graph" "graphic" "grasp" "grass" "grasshopper" "grassland" "grate" "grater" "gratification" "grating" "gratuity" "grave" "gravel" "gravestone" "graveyard" "gray" "graze" "great" "green" "greengage" "greenhouse" "greeting" "grenade" "grey" "greyhound" "grid" "gridiron" "grievance" "grill" "grille" "grillroom" "grimace" "grin" "grind" "grip" "gripe" "groan" "grocer" "grocery" "groin" "groom" "groove" "grott&x_o;" = "grotto" "ground" "groundnut" "groundsheet" "groundwork" "group" "grouping" "grove" "grower" "growl" "grown-up" "growth" "grub" "grudge" "grumble" "grunt" "guarantee" "guarantor" "guard" "guardian" "guava" "guerrilla" "guess" "guest" "guest-house" "guffaw" "guide" "guidebook" "guideline" "guild" "guildhall" "guillotine" "guinea" "guise" "guitar" "guitarist" "gulf" "gull" "gullet" "gully" "gulp" "gum" "gumboil" "gumboot" "gun" "gunboat" "gunfire" "gunner" "gunshot" "gunsmith" "gurgle" "gush" "gusset" "gust" "gut" "gutter" "guy" "gym" "gymnasium" "gymnast" "haberdashery" "habit" "habitat" "habitation" "hack" "haemorrhage" "haemorrhoid" "hailstone" "hailstorm" "hair" "hair-drier" "hairbrush" "haircut" "hairdo" "hairdresser" "hairnet" "hairpiece" "hairpin" "hairstyle" "hal&x_o;" = "halo" "half-back" "half-hour" "half-time" "halfpenny" "hall" "hallmark" "hallucination" "hallway" "halt" "ham" "hamburger" "hamlet" "hammer" "hammock" "hamper" "hamstring" "hand" "hand-luggage" "handbag" "handball" "handbasin" "handbook" "handbrake" "handcuff" "handful" "handicap" "handicraft" "handkerchief" "handle" "handler" "handout" "handover" "handshake" "hang-gliding" "hang-up" "hangar" "hanger" "hanger-on" "hanging" "hangover" "hank" "hankie" "happening" "harassment" "harbor" "harbour" "hardback" "hardboard" "hardcopy" "hardship" "hare" "harelip" "harem" "harm" "harmonic" "harmonica" "harmonium" "harmony" "harness" "harp" "harpist" "harpoon" "harpsichord" "harrow" "harvest" "harvester" "hash" "hassle" "hat" "hatbox" "hatch" "hatchback" "hatchet" "hate" "hatred" "haul" "haulier" "haunch" "haunt" "haven" "haversack" "havoc" "hawk" "hawker" "hawthorn" "haystack" "hazard" "hazelnut" "he-bear" "head" "head-rest" "headache" "heading" "headlamp" "headland" "headlight" "headline" "headroom" "headscarf" "headwind" "heap" "hearing" "hearse" "heart" "heartbeat" "hearth" "heat" "heater" "heath" "heathen" "heatwave" "heave" "heaven" "heavyweight" "hectare" "hectometre" "hedge" "hedgehog" "heed" "heel" "heifer" "height" "heir" "heiress" "heirloom" "helicopter" "helix" "hell" "hello" "helm" "helmet" "help" "helper" "helping" "hem" "hemisphere" "hemorrhage" "hemorrhoid" "hen" "heptameter" "herald" "herb" "herbalist" "herd" "hereafter" "heresy" "heretic" "heritage" "hermit" "hernia" "heroin" "heroism" "heron" "hesitancy" "hesitation" "hexagon" "hexameter" "heyday" "hiccough" "hiccup" "hide" "hideaway" "hiding" "hierarchy" "high" "highbrow" "highchair" "highland" "highlight" "highness" "highway" "hijacker" "hike" "hiker" "hill" "hillside" "hilt" "hind" "hindrance" "hinge" "hint" "hip" "hippo" "hippopotamus" "hire" "hiss" "historian" "history" "hit" "hitch" "hitch-hiker" "hive" "hoard" "hoarding" "hoax" "hob" "hob&x_o;" = "hobo" "hobby" "hobby-horse" "hock" "hoe" "hog" "hoist" "hold" "holdall" "holder" "holding" "holdup" "hole" "holiday" "holiday-maker" "hollow" "holly" "hollyhock" "holster" "homage" "home" "homeland" "homemaker" "homework" "homicide" "homosexual" "hone" "honeycomb" "honeymoon" "honk" "honor" "honour" "honourable" "hood" "hook" "hookup" "hooligan" "hoop" "hoot" "hooter" "hop" "hope" "horde" "horizon" "hormone" "horn" "hornet" "horoscope" "horror" "horse" "horse-racing" "horsepower" "horseshoe" "hose" "hospital" "hospitality" "hospitalization" "hostel" "hostility" "hotel" "hothouse" "hound" "hour" "house" "houseboat" "housebreaking" "household" "housekeeping" "housework" "housing" "hovel" "howitzer" "howl" "howler" "hub" "huddle" "hue" "huff" "hug" "hulk" "hull" "hum" "humanitarian" "humanity" "humbug" "humiliation" "humor" "humour" "hump" "humpback" "hunch" "hunger" "hunt" "hunter" "hurdle" "hurrah" "hurray" "hurricane" "hurry" "hurt" "hush" "husk" "husky" "hustle" "hut" "hutch" "hyacinth" "hybrid" "hydrant" "hydrocarbon" "hyena" "hymn" "hyphen" "hypocrisy" "hypocrite" "hypotenuse" "hysterectomy" "iamb" "ice" "iceberg" "icebox" "icicle" "icon" "idea" "ideal" "idealist" "identification" "identity" "ideology" "idiocy" "idiom" "idiosyncrasy" "idiot" "idleness" "idler" "idol" "igloo" "ignition" "ignoram&u_u;s" = "ignoramus" "ikon" "ill" "illness" "illumination" "illusion" "illustration" "image" "imagery" "imbalance" "imbecile" "imitation" "imitator" "immensity" "immerse" "immersion" "immigrant" "immortal" "immunization" "impact" "impairment" "impedance" "impediment" "imperative" "imperfect" "imperfection" "impersonation" "impet&u_u;s" = "impetus" "implement" "implementation" "implication" "import" "importance" "importation" "importer" "imposition" "impostor" "impresario" "impression" "impressionist" "imprint" "imprisonment" "impropriety" "improvement" "improvisation" "imprudence" "impudence" "impulse" "impurity" "in&qu;est" = "inquest" "in&qu;iry" = "inquiry" "in-fighting" "in-patient" "inability" "inaccuracy" "inaction" "inactivity" "inade&qu;acy" = "inadequacy" "inaptitude" "inattention" "inauguration" "incapability" "incapacity" "incense" "incentive" "inception" "inch" "incidence" "incident" "incidental" "incinerator" "incision" "inclination" "incline" "inclusion" "income" "incompatibility" "inconsistency" "incorporation" "increase" "increment" "incubation" "incubator" "incumbent" "incursion" "indecency" "indentation" "index" "indication" "indicator" "indictment" "indifference" "indignation" "indignity" "indiscretion" "individual" "individualist" "individuality" "indoctrination" "inducement" "induction" "indulgence" "industrial" "industry" "ine&qu;ality" = "inequality" "inefficiency" "inertia" "inexperience" "infamy" "infant" "infantry" "infatuation" "infection" "inference" "inferior" "inferno" "infestation" "infiltration" "infinitive" "infinity" "infirmary" "infirmity" "inflammation" "inflation" "inflection" "infliction" "inflow" "influence" "influx" "informer" "infraction" "infringement" "infusion" "ingenuity" "ingot" "ingredient" "inhabitant" "inheritance" "inhibition" "ini&qu;ity" = "iniquity" "initial" "initiation" "initiative" "injection" "injunction" "injury" "injustice" "ink" "inkling" "inlet" "inn" "inner" "innovation" "innovator" "innuend&x_o;" = "innuendo" "inoculation" "input" "inroad" "insanity" "inscription" "insect" "insecticide" "insecurity" "insert" "insertion" "inset" "inside" "insider" "insight" "insinuation" "inspection" "inspector" "inspectorate" "inspiration" "installation" "installment" "instalment" "instance" "instant" "instep" "instinct" "institute" "institution" "instruction" "instructor" "instrument" "insulation" "insult" "insurer" "insurrection" "intake" "integer" "intellect" "intellectual" "intensity" "intent" "intention" "interaction" "interception" "interchange" "intercom" "interdependence" "interest" "interface" "interference" "interior" "interjection" "interlocutor" "interloper" "interlude" "intermediary" "intermission" "intern" "internal" "internship" "interplay" "interpolation" "interpretation" "interpreter" "interrelation" "interrelationship" "interrogation" "interrogative" "interrogator" "interruption" "intersection" "interval" "intervention" "interview" "intestine" "intimation" "intonation" "intricacy" "intrigue" "introduction" "intruder" "intrusion" "intuition" "invader" "invalid" "invasion" "invention" "inventory" "inverse" "inversion" "invertebrate" "investigation" "investiture" "investor" "invitation" "invoice" "involvement" "ion" "ir&u_i;s" = "iris" "iron" "ironmonger" "irony" "irradiation" "irregularity" "irrigation" "irritation" "island" "islander" "isle" "isotope" "issue" "isthm&u_u;s" = "isthmus" "itch" "item" "iteration" "itinerary" "ivory" "ivy" "jab" "jack" "jackal" "jacket" "jackpot" "jail" "jailbreak" "jailer" "jam" "janitor" "jar" "jasmin" "jasmine" "jaunt" "javelin" "jaw" "jaywalker" "jealousy" "jeep" "jeer" "jelly" "jeopardy" "jerk" "jerkin" "jersey" "jest" "jet" "jetty" "jewel" "jeweler" "jeweller" "jib" "jibe" "jiffy" "jigsaw" "jingle" "jinx" "job" "jockey" "join" "joiner" "joinery" "joint" "joist" "joke" "joker" "jolt" "jotter" "journal" "journalist" "journey" "jowl" "joy" "jubilation" "jubilee" "judge" "judgement" "judgment" "judiciary" "jug" "juggernaut" "juggler" "juice" "jukebox" "jumble" "jump" "jumper" "junction" "juncture" "jungle" "junior" "juniper" "junk" "junkshop" "junta" "jurisdiction" "juror" "jury" "justice" "justification" "juvenile" "kaleidoscope" "kangaroo" "keel" "keep" "keeper" "keepsake" "keg" "kennel" "kerb" "kernel" "kettle" "key" "keyboard" "keyhole" "keynote" "keyword" "kibbutz" "kick" "kick-off" "kid" "kidnapper" "kidnapping" "kidney" "kill" "killer" "killing" "kiln" "kilo" "kilogram" "kiloliter" "kilometer" "kilometre" "kilowatt" "kilt" "kimono" "kind" "kindergarten" "kindness" "king" "kingdom" "kingfisher" "kingpin" "kink" "kiosk" "kipper" "kiss" "kit" "kitbag" "kitchen" "kite" "kitten" "kitty" "kleptomaniac" "knack" "knapsack" "knave" "knee" "kneecap" "knell" "knight" "knighthood" "knitting" "knitwear" "knob" "knock" "knocker" "knockout" "knot" "knuckle" "lab" "label" "labor" "laboratory" "laborer" "labour" "labourer" "labyrinth" "lac&qu;er" = "lacquer" "lace" "lack" "lad" "ladder" "ladle" "lady" "lady-in-waiting" "lag" "lager" "lagoon" "lair" "lake" "lamb" "lambskin" "lament" "laminate" "lamination" "lamp" "lampoon" "lamppost" "lamprey" "lampshade" "lance" "lancet" "land" "landing" "landmark" "landscape" "landslide" "lane" "language" "lantern" "lap" "lapdog" "lapel" "lapse" "larceny" "larder" "lark" "larva" "larynx" "laser" "lash" "lass" "lass&x_o;" = "lasso" "latch" "latchkey" "lath" "lathe" "lather" "latitude" "latrine" "latter" "lattice" "laugh" "launch" "launcher" "launching" "launderette" "laundry" "laurel" "lavatory" "law" "lawn" "lawnmower" "lawsuit" "laxative" "lay-by" "layer" "layette" "layout" "lead" "leader" "leaf" "leaflet" "league" "leak" "leakage" "lean" "lean-to" "leaning" "leap" "leapfrog" "lease" "leash" "leather" "leatherback" "leave" "lebanese" "lectern" "lecture" "ledge" "ledger" "lee" "leech" "leek" "left" "left-handed" "leg" "legacy" "legation" "legend" "legion" "legislation" "legislator" "legislature" "lemon" "lemonade" "lender" "length" "lens" "lentil" "leopard" "leotard" "leper" "leprosy" "lesson" "let-up" "letter" "letterbox" "letterhead" "lettuce" "leukaemia" "level" "lever" "leverage" "levy" "lexicon" "li&qu;eur" = "liqueur" "li&qu;id" = "liquid" "li&qu;idation" = "liquidation" "li&qu;idator" = "liquidator" "li&qu;or" = "liquor" "liability" "liaison" "libel" "liberty" "library" "libretto" "licence" "license" "licensee" "lichen" "lick" "lid" "lido" "lie" "life-jacket" "life-raft" "lifebelt" "lifeboat" "lifebuoy" "lifeline" "lifespan" "lifestyle" "lifetime" "lift" "lift-off" "ligament" "light" "lighter" "lighthouse" "lightship" "like" "likelihood" "liking" "lilac" "lily" "limb" "limbo" "lime" "limerick" "limit" "limitation" "limousine" "limp" "limpet" "line" "line-up" "liner" "ling&y_o;" = "lingo" "linguist" "lining" "link" "link-up" "linkage" "linoleum" "lintel" "lion" "lioness" "lip" "lipstick" "lisp" "list" "listener" "litany" "liter" "litre" "litter" "liturgy" "livelihood" "liver" "livery" "living" "lizard" "llama" "lo&ch;" = "loch" "load" "loader" "loaf" "loan" "lobby" "lobe" "lobster" "local" "locality" "location" "lock" "locker" "locket" "locomotive" "locust" "lodge" "lodging" "loft" "log" "loganberry" "logarithm" "logbook" "logic" "loin" "lollipop" "loner" "longing" "longitude" "loo" "loofah" "look" "look-out" "loom" "loop" "loophole" "lord" "lordship" "lorry" "loser" "loss" "lot" "lotion" "lottery" "loudhailer" "loudspeaker" "lounge" "lout" "love" "lovesong" "low" "loyalty" "lozenge" "lubricant" "lull" "lullaby" "lumberjack" "lump" "lunacy" "lunatic" "lunch" "luncheon" "lung" "lunge" "lupin" "lurch" "lure" "lust" "luster" "lustre" "lute" "luxury" "lynx" "lyre" "lyric" "mac" "macaroon" "mace" "machine" "machinist" "mackintosh" "macro" "magazine" "maggot" "magician" "magistrate" "magnate" "magnet" "magnification" "magnitude" "magnolia" "magpie" "maid" "maiden" "mailbox" "mainstay" "maisonette" "major" "majority" "make" "make-up" "maker" "making" "malaise" "malfunction" "malingerer" "mall" "mallet" "malt" "mammal" "mammoth" "man-hour" "management" "mandarin" "mandate" "mandolin" "mandoline" "mane" "maneuver" "mang&x_o;" = "mango" "mangle" "mangrove" "manhole" "manhunt" "mania" "maniac" "manicure" "manifest&x_o;" = "manifesto" "manifestation" "manipulation" "manner" "manoeuvrability" "manoeuvre" "manor" "manservant" "mansion" "mantelpiece" "mantle" "manual" "manufacturer" "manuscript" "map" "maple" "mar&qu;ee" = "marquee" "marathon" "marauder" "marble" "march" "march-past" "mare" "margin" "marigold" "marina" "marine" "mark" "marker" "market" "marketing" "marketplace" "marking" "markup" "marmot" "maroon" "marriage" "marrow" "marsh" "marshal" "marshmallow" "martyr" "martyrdom" "marvel" "mas&qu;erade" = "masquerade" "mascot" "masculine" "mash" "mask" "masochist" "mason" "mass" "massacre" "massage" "mast" "mastermind" "masterpiece" "masterplan" "mat" "match" "matchbox" "mate" "material" "mathematician" "matinée" "matriculation" "matron" "matter" "matting" "mattress" "mausoleum" "maxim" "maximum" "mayday" "mayhem" "maypole" "maze" "meadow" "meal" "mealtime" "mean" "meaning" "measure" "measurement" "meat" "mechanic" "mechanism" "medal" "medallion" "median" "mediation" "mediator" "medical" "medication" "medicine" "meditation" "medium" "medley" "meeting" "megaphone" "megaton" "megawatt" "melodrama" "melody" "melon" "member" "membership" "membrane" "mement&x_o;" = "memento" "memo" "memoir" "memorandum" "memorial" "memory" "menace" "menagerie" "mending" "menopause" "mentality" "mention" "menu" "mercenary" "merchant" "mercy" "merger" "meridian" "meringue" "merit" "mermaid" "merry-go-round" "mesh" "mess" "message" "messenger" "metabolism" "metal" "metalanguage" "metallurgy" "metaphor" "metarule" "meteor" "meteorite" "meter" "method" "methodist" "methyl" "metre" "metronome" "metropol&u_i;s" = "metropolis" "mezzanine" "microbe" "microbiologist" "microcomputer" "microcosm" "microfiche" "microfilm" "microorganism" "microphone" "microprocessor" "microscope" "microwave" "midday" "middle" "midge" "midget" "midnight" "midriff" "midst" "midsummer" "midweek" "midwinter" "midyear" "migraine" "migrant" "migration" "mike" "mile" "mileage" "mileometer" "milestone" "milieu" "militant" "militia" "milk" "mill" "millennium" "millet" "milligram" "milliliter" "millilitre" "millimeter" "millimetre" "millisecond" "millstone" "millwheel" "milometer" "mimic" "min&u_u;s" = "minus" "minaret" "mincer" "mind" "mine" "minefield" "mineral" "minesweeper" "miniature" "minibus" "minicab" "minim" "minimization" "minion" "miniskirt" "minister" "ministry" "minor" "minority" "minster" "mint" "minuet" "minute" "miracle" "mirage" "mirror" "misadventure" "misapprehension" "miscalculation" "miscarriage" "miscellany" "mischance" "misconception" "misdemeanour" "misery" "misfit" "misfortune" "misgiving" "mishap" "misinterpretation" "misnomer" "misprint" "miss" "missal" "missile" "mission" "missionary" "missive" "mist" "mistake" "mister" "mistranslation" "misunderstanding" "misuse" "mitre" "mitt" "mitten" "mix" "mix-up" "mixer" "mixture" "mnemonic" "mo&qu;ette" = "moquette" "moan" "moaning" "moat" "mob" "mobile" "mobilization" "moccasin" "mock-up" "mockery" "mockingbird" "modality" "mode" "model" "moderate" "modicum" "modification" "modulation" "module" "moisturizer" "molar" "mold" "mole" "molecule" "molehill" "mollusc" "moment" "momentum" "monarchy" "monastery" "moneylender" "mongoose" "mongrel" "monitor" "monk" "monkey" "monocle" "monogram" "monograph" "monolog" "monologue" "monopoly" "monorail" "monotone" "monoxide" "monsoon" "monster" "monstrosity" "montage" "month" "monthly" "monument" "mood" "moon" "moonbeam" "moor" "mooring" "moorland" "mop" "moped" "moral" "morass" "moratorium" "morgue" "mormon" "morning" "moron" "morpheme" "morphology" "morsel" "mortal" "mortar" "mortgage" "mortuary" "mos&qu;e" = "mosque" "mos&qu;it&x_o;" = "mosquito" "mosaic" "moss" "motel" "moth" "mothball" "motif" "motion" "motivation" "motive" "motor" "motorbike" "motorboat" "motorcar" "motorcycle" "motorway" "mott&x_o;" = "motto" "mould" "moulding" "mound" "mount" "mountain" "mourning" "mousetrap" "moustache" "mouth" "mouthful" "mouthpiece" "mouthwash" "move" "movement" "movie" "mower" "muddle" "mudguard" "mudpack" "muff" "muffin" "muffler" "mug" "mugging" "mule" "multiple" "multiplication" "multitude" "mumble" "municipality" "munition" "mural" "murder" "murmur" "muscle" "muse" "museum" "mushroom" "music" "musical" "musket" "mussel" "must" "mustache" "mutant" "mutation" "mute" "mutilation" "mutiny" "mutter" "muzzle" "mystery" "myth" "mythology" "n&x_o;" = "no" "nag" "nail" "nailbrush" "nailfile" "name" "namesake" "nap" "nape" "napkin" "nappy" "narciss&u_u;s" = "narcissus" "narcotic" "narration" "narrative" "narrator" "nation" "national" "nationalist" "nationality" "native" "natural" "nature" "naught" "nave" "navel" "navy" "nearside" "necessity" "neck" "necklace" "neckline" "necktie" "nectarine" "need" "needle" "negation" "negative" "negligee" "negotiation" "negotiator" "neighbor" "neighborhood" "neighbour" "neighbourhood" "nematode" "neon" "nerve" "nest" "net" "nettle" "network" "neurotic" "neuter" "neutral" "neutron" "newcomer" "newsagent" "newsletter" "newspaper" "newsreel" "nib" "nick" "nickel" "nickname" "nicotine" "night" "night-time" "nightcap" "nightclub" "nightdress" "nightfall" "nightie" "nightingale" "nightmare" "nil" "nip" "nipple" "nitrate" "nitrite" "noble" "nod" "node" "noise" "nomad" "nomination" "nominee" "nonet" "noodle" "nook" "noon" "noose" "norm" "north" "northeast" "northern" "northwest" "nose" "nose-dive" "nosebleed" "nostril" "notary" "notation" "notch" "note" "note-case" "notebook" "notice" "notification" "notion" "nought" "noun" "novel" "novelty" "nozzle" "nuance" "nucleus" "nugget" "nuisance" "number" "numeral" "numerator" "nursery" "nut" "nutcase" "nutcracker" "nutmeg" "nutrient" "nutshell" "nylon" "oaf" "oak" "oar" "oath" "obedience" "obelisk" "obituary" "object" "objection" "objective" "objector" "obligation" "oblong" "oboe" "obscenity" "obscurity" "observance" "observation" "observatory" "observer" "obsession" "obstacle" "obstruction" "occasion" "occupant" "occupation" "occupier" "occurrence" "ocean" "octagon" "octane" "octave" "octop&u_u;s" = "octopus" "oddity" "oddment" "ode" "odor" "odour" "off-licence" "offence" "offender" "offense" "offensive" "offer" "offering" "office" "offset" "offshoot" "offside" "oil" "oilcan" "oilfield" "oilrig" "ointment" "okay" "old" "olive" "omelet" "omelette" "omen" "omission" "on&u_u;s" = "onus" "one" "onion" "onset" "onslaught" "op&u_u;s" = "opus" "opal" "opener" "opening" "opera" "operand" "operation" "operetta" "opinion" "opportunity" "opposite" "opposition" "optimization" "option" "oracle" "oral" "orange" "oration" "oratorio" "orb" "orbit" "orchard" "orchestra" "orchestration" "orchid" "ordeal" "order" "ordinance" "ore" "organ" "organisation" "organism" "organization" "orgasm" "orgy" "oriental" "orifice" "origin" "original" "ornament" "orphan" "orphanage" "oscillation" "oscilloscope" "osteopathy" "ostrich" "other" "otter" "ounce" "outboard" "outbreak" "outbuilding" "outburst" "outcast" "outcome" "outcry" "outer" "outfit" "outing" "outlay" "outlet" "outline" "outlook" "outpost" "output" "outrage" "outset" "outside" "oval" "ovary" "ovation" "oven" "overall" "overcoat" "overdose" "overdraft" "overdrive" "overexertion" "overflow" "overhang" "overhaul" "overhead" "overlap" "overlay" "overload" "overpass" "overpayment" "oversight" "oversimplification" "overstatement" "overtone" "overture" "overview" "owl" "oxidation" "oxide" "oxtail" "oyster" "ozone" "pâté" "pace" "pacemaker" "pachyderm" "pacifist" "pack" "package" "packer" "packet" "pact" "pad" "paddle" "paddock" "paddy" "padlock" "paediatrician" "pageant" "pagoda" "pail" "pain" "painkiller" "paint-stripper" "paintbrush" "painter" "painting" "pair" "palace" "palate" "palaver" "palette" "palisade" "pall" "pallet" "palm" "palpitation" "pamphlet" "pan" "panacea" "pancake" "panda" "pandemic" "pane" "panel" "pang" "panic" "pannier" "panorama" "pansy" "pant" "pantechnicon" "panther" "pantomime" "pantry" "papacy" "papaya" "paper" "paperback" "paperweight" "papier-mâché" "par" "par&qu;et" = "parquet" "parable" "parabola" "parachute" "parade" "paradigm" "paradise" "paradox" "paraffin" "paragraph" "parakeet" "parallel" "parallelogram" "parameter" "paraphrase" "parasite" "parasol" "parcel" "parchment" "pardon" "parish" "parishioner" "parity" "park" "parliament" "parliamentarian" "parlor" "parlour" "parody" "parole" "parrot" "parser" "parsnip" "part" "participle" "particle" "particular" "particulate" "parting" "partition" "partnership" "partridge" "party" "pass" "passage" "passion" "passport" "password" "past" "pasta" "paste" "pasteboard" "pastille" "pastime" "pastor" "pastry" "pasture" "pasty" "pat" "patch" "pate" "patent" "patentee" "path" "pathogen" "pathway" "patio" "patrol" "patter" "pattern" "paunch" "pause" "pavement" "pavilion" "paw" "pawn" "pawnshop" "pawpaw" "pay" "paycheck" "payment" "payroll" "pea" "peacekeeper" "peach" "peacock" "peak" "peal" "peanut" "pear" "pearl" "peat" "pebble" "pecan" "peck" "peculiarity" "pedal" "pedestal" "pedigree" "peel" "peep" "peephole" "peerage" "peg" "pekingese" "pelican" "pellet" "pelmet" "pelt" "pelv&u_i;s" = "pelvis" "pen" "pen&u_i;s" = "penis" "penal" "penalty" "penance" "pencil" "pendant" "pendulum" "penetration" "penguin" "peninsula" "penitence" "penitentiary" "pennant" "penny" "pension" "pentagon" "pentameter" "penthouse" "pepper" "peppermint" "peptalk" "percent" "percentage" "perception" "perch" "percolator" "percussion" "perennial" "perfect" "perforation" "performance" "perfume" "peril" "perimeter" "period" "periodical" "periphery" "periscope" "perk" "perm" "permission" "permit" "permutation" "perpetrator" "personality" "perspective" "perspex" "persuasion" "perturbation" "perusal" "perversion" "pest" "pesticide" "pestle" "pet" "petal" "petition" "petrochemical" "petticoat" "pew" "phalanx" "phantom" "pharaoh" "pharmaceutical" "pharmacy" "phase" "pheasant" "phenol" "phenotype" "phial" "philosophy" "phobia" "phone" "phoney" "phonograph" "phonology" "phony" "phosphate" "photo" "photocopier" "photocopy" "photograph" "photostat" "phrase" "phrasebook" "physi&qu;e" = "physique" "piano" "pica" "piccolo" "pick" "pick-me-up" "picket" "pickle" "pickup" "picnic" "picture" "pidgin" "pie" "piece" "pier" "pig" "pigeon" "pigeonhole" "piggery" "piglet" "pigment" "pigmentation" "pigmy" "pigsty" "pigtail" "pilchard" "pile" "pileup" "pilgrimage" "pill" "pillar" "pillion" "pillory" "pillow" "pillowcase" "pimple" "pin" "pinafore" "pinch" "pincushion" "pine" "pineapple" "ping" "pink" "pinnacle" "pinpoint" "pinstripe" "pint" "pip" "pipe" "pipeline" "pirouette" "pistol" "piston" "pit" "pitch" "pitcher" "pitchfork" "pitfall" "pithead" "pittance" "pivot" "pixie" "pizza" "pla&qu;e" = "plaque" "placard" "place" "placebo" "placement" "plague" "plaid" "plain" "plait" "plan" "plane" "planet" "planetarium" "plank" "planner" "plant" "plantation" "plasma" "plaster" "plastic" "plate" "plateau" "plateful" "platform" "platitude" "platoon" "platter" "play" "play-off" "playground" "playgroup" "playhouse" "playpen" "plaything" "plea" "pleasantry" "pleasure" "pleat" "pleb" "plebiscite" "plectrum" "pledge" "plight" "plimsoll" "plinth" "plot" "plough" "plow" "ploy" "plug" "plum" "plumb" "plumbline" "plume" "plunge" "pluperfect" "plural" "plus" "ply" "pocket" "pocketbook" "pod" "poem" "poet" "pogrom" "point" "pointer" "poise" "poison" "poisoning" "poke" "poker" "polarity" "polder" "pole" "polecat" "polemic" "policy" "policyholder" "polish" "polka" "poll" "pollutant" "polluter" "polyamide" "polygon" "polymer" "polytechnic" "pomegranate" "pommel" "pomp" "pond" "pontiff" "pontoon" "pony" "ponytail" "poodle" "pool" "pop" "pope" "poplar" "poppy" "populace" "population" "porch" "porcupine" "pore" "porpoise" "port" "portal" "portcull&u_i;s" = "portcullis" "portent" "portfolio" "porthole" "portic&x_o;" = "portico" "portion" "portrait" "portrayal" "pose" "position" "posse" "possession" "possessor" "possibility" "post" "post-mortem" "postbox" "postcard" "poster" "posterior" "posterity" "postmark" "postponement" "postscript" "postulate" "posture" "posy" "pot" "potat&y_o;" = "potato" "potency" "potentate" "potential" "potentiality" "pothole" "potion" "potpourri" "potshot" "pottery" "potty" "pouch" "poultice" "pounce" "pound" "pout" "powder" "power" "powwow" "pox" "practical" "practice" "prairie" "praise" "pram" "prank" "prawn" "prayer" "preaching" "preamble" "precaution" "precedence" "precedent" "precept" "precinct" "precipice" "precipitate" "precondition" "precursor" "predator" "predecessor" "predicament" "predicate" "prediction" "predisposition" "prefab" "preface" "prefecture" "preference" "prefix" "pregnancy" "prejudice" "prelude" "première" "premiere" "premise" "premium" "premonition" "preoccupation" "preparation" "preposition" "prere&qu;isite" = "prerequisite" "prerogative" "presbytery" "prescription" "present" "presentation" "preservative" "preserve" "presidency" "press" "press-gang" "pressure" "presumption" "pretence" "pretense" "preterite" "pretext" "prevarication" "preview" "prey" "price" "prick" "prickle" "pride" "prig" "prim&u_u;s" = "primus" "primacy" "primary" "primate" "prime" "primer" "primrose" "principal" "principality" "principle" "print" "print-out" "printing" "printshop" "priority" "priory" "prism" "prison" "private" "privilege" "privy" "prize" "prizewinner" "pro" "probability" "probe" "problem" "procedure" "process" "processing" "procession" "processor" "proclamation" "proclivity" "prod" "prodigy" "product" "production" "profession" "professor" "profile" "profit" "program" "programme" "progression" "prohibition" "project" "projectile" "projection" "projector" "proletarian" "proletariat" "prologue" "prom" "promenade" "prominence" "promise" "promontory" "promotion" "prong" "pronoun" "pronouncement" "pronunciation" "proof" "prop" "propellant" "propeller" "propensity" "property" "prophecy" "proportion" "proposal" "proposition" "prosecution" "prospect" "prospect&u_u;s" = "prospectus" "protein" "protest" "protocol" "proton" "prototype" "protractor" "protuberance" "proverb" "provider" "province" "provis&y_o;" = "proviso" "provision" "provocation" "prow" "prowl" "proximity" "proxy" "prudence" "prune" "psalm" "pseudonym" "psyche" "psychiatry" "pub" "public" "publication" "publicity" "publishing" "puck" "pudding" "puddle" "puff" "puffin" "pull" "pull-in" "pulley" "pullover" "pulpit" "pulsation" "pulse" "pump" "pumpkin" "pun" "punch" "punch-up" "puncture" "punishment" "punt" "pup" "puppet" "puppy" "purée" "purchase" "purge" "purl" "purple" "purpose" "purr" "purse" "pursuit" "push" "pushbutton" "pushchair" "pushover" "puss" "pussy" "pussy-cat" "putt" "putty" "puzzle" "pylon" "pyramid" "python" "régime" "rabbit" "rabble" "rac&qu;et" = "racquet" "raccoon" "race" "racecourse" "racehorse" "racetrack" "racing" "rack" "racket" "racoon" "radar" "radial" "radiation" "radiator" "radical" "radio" "radiotelephone" "radish" "raffle" "raft" "rafter" "rag" "ragbag" "rage" "raid" "raider" "rail" "railing" "railroad" "railway" "rain" "rainbow" "raincoat" "raindrop" "rainforest" "rainstorm" "raise" "raisin" "rake" "rally" "ram" "ramble" "ramification" "ramp" "rampage" "rampart" "ranch" "range" "rank" "ransom" "ranting" "rap" "rape" "rapid" "rapport" "rapture" "rarebit" "rarity" "rash" "rasher" "rasp" "raspberry" "rat" "ratchet" "rate" "ratification" "rating" "ratio" "ration" "rationale" "rationalization" "rattle" "rattlesnake" "raven" "ravine" "raving" "ray" "rayon" "razor" "re&qu;est" = "request" "re&qu;iem" = "requiem" "re&qu;irement" = "requirement" "re&qu;isite" = "requisite" "re-count" "re-election" "re-entry" "reach" "reaction" "reactivity" "reactor" "readership" "reading" "readjustment" "real" "realignment" "reality" "reallocation" "realm" "ream" "reaper" "reappearance" "rear" "rearguard" "rearmament" "rearrangement" "reason" "reassurance" "reawakening" "rebate" "rebellion" "rebirth" "rebound" "rebuff" "rebuke" "rebuttal" "recall" "receipt" "receptacle" "reception" "receptor" "recess" "recession" "recipe" "reciprocal" "recital" "reckoning" "recoil" "recollection" "recommendation" "reconciliation" "recondition" "reconnaissance" "reconstruction" "reconversion" "record" "recorder" "recording" "recovery" "recreation" "recrimination" "recruitment" "rectangle" "rectory" "recurrence" "red" "redecoration" "redevelopment" "reduction" "redundancy" "reed" "reef" "reek" "reel" "ref" "refectory" "reference" "refill" "refinement" "refinery" "reflection" "reflector" "reflex" "reflexion" "reform" "reformation" "refrain" "refresh" "refreshment" "refrigerator" "refuge" "refund" "refusal" "refuse" "regalia" "regard" "regatta" "regency" "regime" "regiment" "region" "register" "registration" "registry" "regression" "regret" "regular" "regularity" "regulation" "rehearsal" "reign" "reimbursement" "rein" "reincarnation" "reindeer" "reinforcement" "reject" "rejection" "relapse" "relation" "relationship" "relative" "relaunch" "relay" "release" "relic" "relief" "religion" "relish" "remainder" "remand" "remark" "remedy" "remembrance" "reminder" "reminiscence" "remission" "remittance" "remnant" "remote" "remould" "removal" "remover" "renaissance" "rendering" "rendezvous" "rendition" "renegade" "renewal" "renovation" "rent" "rental" "renunciation" "reopening" "reorganization" "reorientation" "rep" "repair" "repatriation" "repayment" "repeat" "repellent" "repercussion" "repertoire" "repetition" "replacement" "replenishment" "replica" "reply" "report" "repository" "representation" "repression" "reprieve" "reprimand" "reprint" "reprisal" "reproach" "reproduction" "reptile" "republic" "repulsion" "reputation" "rerun" "resale" "rescue" "research" "resemblance" "resentment" "reservation" "reserve" "reservoir" "reshuffle" "residence" "residue" "resignation" "resin" "resistance" "resistor" "resolution" "resolve" "resonance" "resort" "resource" "respect" "respiration" "respirator" "respite" "response" "responsibility" "rest" "restaurant" "restitution" "restoration" "restorative" "restraint" "restriction" "restroom" "result" "resultant" "resumé" "resume" "resumption" "resurgence" "resurrection" "resuscitation" "retail" "retaliation" "retention" "reticence" "retina" "retinue" "retirement" "retort" "retreat" "retrial" "retribution" "retrieval" "retriever" "return" "reunion" "reveille" "revelation" "revenue" "reverberation" "reverie" "reversal" "reverse" "reversion" "review" "revision" "revival" "revolt" "revolution" "revolver" "revue" "reward" "rhapsody" "rhinit&u_i;s" = "rhinitis" "rhino" "rhinocer&u_o;s" = "rhinoceros" "rhododendron" "rhomb&u_u;s" = "rhombus" "rhomboid" "rhyme" "rhythm" "rib" "ribbon" "ricefield" "rickshaw" "ricochet" "riddle" "ride" "ridge" "riding" "rifle" "rift" "rig" "rig-out" "rigging" "right" "rigmarole" "rigor" "rigour" "rim" "rind" "ring" "ringlet" "rink" "rinse" "riot" "rip" "ripcord" "riposte" "ripple" "rise" "risk" "rissole" "rite" "ritual" "rivalry" "river" "riverbank" "riverbed" "riverside" "rivet" "road" "roadblock" "roadhog" "roadside" "roadsign" "roadway" "roar" "roast" "robbery" "robe" "robin" "robot" "rock" "rock-bottom" "rockery" "rocket" "rod" "rodent" "rodeo" "roe" "role" "roll" "roller" "rolling" "roly-poly" "romance" "romp" "rondo" "roof" "rook" "room" "roommate" "roost" "rooster" "root" "rope" "rosé" "rosary" "rose" "rosebed" "rosebud" "rosebush" "rosette" "roster" "rostrum" "rota" "rotation" "rotor" "rotunda" "rouble" "roughness" "round" "roundabout" "roundup" "rout" "route" "routine" "row" "rowlock" "royalty" "rub" "rubber" "rubbish" "rubble" "ruble" "ruby" "rucksack" "rudder" "ruff" "ruffian" "ruffle" "rug" "ruin" "rule" "ruling" "rum" "rumble" "ruminant" "rumor" "rumour" "rump" "rump&u_u;s" = "rumpus" "rumpsteak" "run" "run-through" "runaway" "rung" "runner" "runoff" "runt" "runway" "rupee" "rupture" "ruse" "rush" "rusk" "rustic" "rustle" "rut" "s&qu;abble" = "squabble" "s&qu;ad" = "squad" "s&qu;adron" = "squadron" "s&qu;all" = "squall" "s&qu;alor" = "squalor" "s&qu;are" = "square" "s&qu;ash" = "squash" "s&qu;at" = "squat" "s&qu;eak" = "squeak" "s&qu;eal" = "squeal" "s&qu;eeze" = "squeeze" "s&qu;ib" = "squib" "s&qu;int" = "squint" "s&qu;irrel" = "squirrel" "s&qu;irt" = "squirt" "sabbath" "sabbatical" "sabotage" "sack" "sacrament" "sacrifice" "saddle" "saddlebag" "safari" "safe" "safeguard" "saga" "sail" "sailboat" "sailing" "sailor" "saint" "sake" "salad" "salami" "salary" "sale" "saleroom" "salon" "saloon" "salt" "salute" "salv&x_o;" = "salvo" "salver" "sample" "sampling" "sanatorium" "sanction" "sanctuary" "sand" "sandal" "sandbag" "sandcastle" "sandpaper" "sandpit" "sandwich" "sanitarium" "sap" "sapling" "sapphire" "sarcasm" "sardine" "sash" "satchel" "satellite" "satire" "satisfaction" "saturation" "sauce" "saucepan" "saucer" "sauna" "sausage" "savage" "save" "saving" "savior" "saviour" "savor" "savour" "saw" "sawdust" "sawhorse" "sawmill" "sax" "saxophone" "saying" "scab" "scaffold" "scald" "scale" "scallop" "scalp" "scalpel" "scandal" "scanner" "scansion" "scapegoat" "scar" "scarcity" "scare" "scarecrow" "scavenger" "scenario" "scene" "scent" "scepter" "sceptre" "schedule" "scheme" "schism" "scholarship" "school" "schoolbook" "schoolhouse" "schooling" "schoolroom" "schooner" "science" "scone" "scoop" "scooter" "scorch" "scorcher" "score" "scoreboard" "scorecard" "scorpion" "scourer" "scourge" "scowl" "scramble" "scrap" "scrapbook" "scrape" "scraper" "scratch" "scrawl" "scream" "screech" "screen" "screening" "screw" "screwdriver" "scribble" "script" "scripture" "scroll" "scrub" "scrum" "scrummage" "scruple" "scuffle" "scull" "scullery" "sculpture" "scum" "scuttle" "scythe" "se&qu;el" = "sequel" "se&qu;ence" = "sequence" "sea" "seaboard" "seafood" "seagull" "seal" "seam" "seamstress" "seance" "seaplane" "seaport" "search" "searchlight" "seashore" "season" "seasoning" "seat" "seaweed" "secant" "second" "secondment" "secret" "secretariat" "secretion" "sect" "section" "sector" "security" "sedan" "sedative" "sediment" "seduction" "see" "seed" "seedling" "seeker" "seesaw" "segment" "seizure" "selection" "selector" "self-portrait" "sellout" "semaphore" "semester" "semi&qu;aver" = "semiquaver" "semicircle" "semicolon" "semiconductor" "semifinal" "seminar" "seminary" "semitone" "senate" "send-off" "sensation" "sense" "sensibility" "sensitivity" "sensor" "sentence" "sentiment" "separation" "septet" "sequin" "serenade" "serial" "sermon" "serpent" "serum" "serve" "service" "serviette" "serving" "session" "sestet" "set" "setback" "settee" "setting" "settlement" "setup" "sewer" "sex" "sextet" "shack" "shackle" "shade" "shadow" "shaft" "shake" "shake-up" "shaker" "shallot" "sham" "shame" "shampoo" "shamrock" "shandy" "shanty" "shantytown" "shape" "share" "shareholder" "shareholding" "shark" "sharp" "sharpener" "shave" "shaver" "shawl" "she-cat" "she-elephant" "sheath" "shed" "sheepdog" "sheepfold" "sheepskin" "sheet" "shell" "shelter" "sherry" "shield" "shift" "shilling" "shimmer" "shin" "shine" "shingle" "ship" "shipbuilder" "shipment" "shipowner" "shipper" "shipwreck" "shipyard" "shire" "shirt" "shiver" "shoal" "shock" "shoe" "shoebrush" "shoehorn" "shoelace" "shoeshop" "shoetree" "shoot" "shooting" "shop" "shore" "shoreline" "short" "short-circuit" "shortage" "shortcoming" "shortcut" "shortfall" "shortlist" "shot" "shotgun" "shoulder" "shout" "shovel" "show" "show-off" "showdown" "shower" "showground" "showing" "showpiece" "showroom" "shred" "shrew" "shriek" "shrine" "shrink" "shroud" "shrub" "shrug" "shudder" "shutdown" "shutter" "shuttle" "shuttlecock" "sickle" "sickness" "side" "side-effect" "sideboard" "sidelight" "sideline" "sidewalk" "siding" "siege" "sieve" "sigh" "sight" "sign" "signal" "signatory" "signature" "signpost" "silence" "silencer" "silhouette" "silk" "silo" "silt" "similarity" "simile" "simplification" "simulation" "sin" "sin&u_u;s" = "sinus" "sine" "sinew" "singing" "single" "singlet" "singular" "sink" "sinner" "sip" "siphon" "sir" "siren" "sirloin" "sirocco" "sissy" "sit-in" "sitcom" "site" "sitting" "situation" "size" "sizzle" "skate" "skateboard" "skating" "skeleton" "sketch" "skew" "skewer" "ski" "skid" "skidmark" "skiff" "skill" "skin" "skip" "skirmish" "skirt" "skit" "skittle" "skull" "skunk" "sky" "skylight" "skyline" "skyscraper" "slab" "slack" "slam" "slander" "slang" "slant" "slap" "slash" "slate" "slaughterhouse" "sled" "sledge" "sledgehammer" "sleep" "sleeve" "sleigh" "sleight" "slice" "slick" "slide" "slight" "sling" "slingshot" "slip" "slip-up" "slipper" "slipway" "slit" "sliver" "slob" "slog" "slogan" "slope" "slot" "slowdown" "slug" "sluice" "slum" "slumber" "slump" "slur" "slut" "smack" "small" "smash" "smattering" "smear" "smell" "smile" "smirk" "smithy" "smock" "smudge" "smuggling" "snack" "snag" "snail" "snake" "snap" "snapshot" "snare" "snarl" "snatch" "sneaker" "sneer" "sneeze" "sniff" "snigger" "snip" "snippet" "snob" "snooze" "snorkel" "snort" "snout" "snow" "snowball" "snowdrift" "snowdrop" "snowfall" "snowflake" "snowplough" "snowstorm" "snub" "soapflake" "sob" "social" "society" "sock" "socket" "sod" "soda" "sofa" "soft" "soil" "sojourn" "solder" "solid" "solilo&qu;y" = "soliloquy" "solitary" "solitude" "solo" "solstice" "solution" "solvent" "somersault" "sonar" "sonata" "song" "songbook" "songwriter" "sonnet" "sop" "soporific" "sore" "sorrow" "sort" "soufflé" "soul" "sound" "sounding" "soundtrack" "soup" "soupspoon" "source" "south" "southpaw" "souvenir" "sow" "soy" "soyabean" "soybean" "spa" "space" "spacer" "spaceship" "spacesuit" "spade" "spadework" "span" "spaniel" "spanner" "spare" "spark" "sparkle" "sparrow" "spasm" "spate" "spatter" "spatula" "spawn" "spear" "spearmint" "spec" "speciality" "specialty" "specification" "specimen" "speck" "spectacle" "spectacular" "specter" "spectre" "spectrometer" "speculation" "speech" "speed" "speedboat" "speedometer" "speedway" "spell" "spelling" "sphere" "sphinx" "spice" "spider" "spiel" "spike" "spin" "spin-drier" "spindle" "spine" "spinner" "spiral" "spire" "spirit" "spiritual" "spit" "spite" "spiv" "splash" "spleen" "splendor" "splendour" "splice" "splint" "splinter" "split" "spoke" "spondee" "sponge" "spool" "spoon" "spoonful" "sport" "spot" "spotlight" "spout" "sprain" "sprat" "sprawl" "spray" "spread" "spree" "sprig" "spring" "spring-clean" "springboard" "springtime" "sprinkler" "sprint" "sprite" "sprout" "spruce" "spud" "spur" "spurt" "sputnik" "spying" "stab" "stabilizer" "stable" "stack" "stadium" "staff" "stag" "stage" "stagecoach" "stain" "stair" "staircase" "stairway" "stake" "stalactite" "stalagmite" "stalemate" "stalk" "stall" "stallion" "stalwart" "stammer" "stamp" "stampede" "stance" "stand" "stand-by" "stand-in" "standard" "standpoint" "standstill" "stanza" "staple" "stapler" "starboard" "starch" "stardom" "stare" "starling" "start" "starvation" "stat&u_u;s" = "status" "state" "statement" "station" "stationer" "statistic" "statue" "stature" "statute" "stave" "stay" "steak" "steakhouse" "steamer" "steamroller" "steed" "steelmaker" "steelmill" "steeple" "steeplechase" "steer" "stem" "stench" "stencil" "step" "stepladder" "stepping" "stereo" "stereotype" "stern" "stethoscope" "stew" "stick" "sticker" "stickleback" "stiff" "stigma" "stile" "stilett&x_o;" = "stiletto" "still" "stilt" "stimul&u_u;s" = "stimulus" "stimulant" "sting" "stink" "stint" "stipend" "stipulation" "stir" "stirrup" "stitch" "stoat" "stock" "stock-market" "stockade" "stockbreeder" "stocking" "stockpile" "stole" "stoma&ch;" = "stomach" "stone" "stool" "stoop" "stop" "stop-press" "stopgap" "stoplight" "stopover" "stoppage" "stopper" "stopwatch" "store" "storeroom" "storey" "stork" "storm" "story" "storybook" "stout" "stove" "straight" "strain" "strainer" "strait" "strand" "stranglehold" "strap" "stratagem" "strategy" "straw" "strawberry" "stray" "streak" "streaky" "stream" "streamer" "street" "streetcar" "strength" "stress" "stretch" "stretcher" "stride" "strike" "string" "strip" "stripe" "striptease" "stroke" "stroll" "stronghold" "strongroom" "structure" "struggle" "strut" "stub" "stubble" "stud" "studio" "study" "stump" "stunt" "stupor" "stupour" "sturgeon" "stutter" "sty" "stye" "styl&u_u;s" = "stylus" "style" "subcommittee" "subconscious" "subdivision" "subdominant" "subgroup" "subject" "subjunctive" "submarine" "submediant" "submission" "subparagraph" "subpoena" "subscription" "subsection" "subset" "subsidiary" "subsidy" "substance" "substitute" "substitution" "subsumption" "subsystem" "subterfuge" "subtitle" "subtlety" "suburb" "subvention" "subway" "success" "succession" "suction" "suffix" "sugar" "suggestion" "suicide" "suit" "suitcase" "suite" "sum" "summary" "summer" "summerhouse" "summertime" "summit" "summons" "sump" "sun" "sunburn" "sundial" "sundown" "sunflower" "sunlight" "sunrise" "sunset" "sunshade" "sunspot" "suntan" "suntrap" "superlative" "supermarket" "superpower" "superstition" "superstructure" "supertanker" "supper" "supplement" "supply" "support" "supposition" "suppressor" "surcharge" "surface" "surfboard" "surfeit" "surge" "surgery" "surname" "surpl&u_u;s" = "surplus" "surprise" "surrender" "survey" "suspender" "suspicion" "swab" "swallow" "swamp" "swan" "swap" "swarm" "swastika" "sway" "swearword" "sweat" "sweater" "swede" "sweep" "sweet" "sweetbread" "sweetener" "sweetheart" "swell" "swelling" "swift" "swig" "swill" "swimming" "swimsuit" "swindle" "swing" "swipe" "swirl" "switch" "switchback" "switchboard" "swivel" "swoop" "swop" "sword" "sycamore" "syllab&u_u;s" = "syllabus" "syllable" "symbol" "symmetry" "sympathy" "symphony" "symposium" "symptom" "synagogue" "synchromesh" "synchrotron" "syndicate" "syndrome" "synonym" "syntax" "synthesizer" "syphon" "syringe" "syrup" "system" "t-shirt" "tab" "tabby" "tabernacle" "table" "tablecloth" "tablemat" "tablespoon" "tablet" "taboo" "tabulation" "tabulator" "tack" "tactic" "tadpole" "taffy" "tag" "tail" "tailback" "tailwind" "taint" "take" "takeoff" "takeover" "taking" "tale" "talent" "talk" "tallboy" "tally" "tallyho" "tambourine" "tampon" "tan" "tandem" "tang" "tangent" "tangerine" "tangle" "tango" "tank" "tankard" "tanker" "tannery" "tantrum" "tap" "tap-dancing" "tape" "taper" "tapestry" "tappet" "tar" "tarantula" "target" "tariff" "tarnish" "tarpaulin" "tart" "tartan" "tartar" "task" "tassel" "taste" "tattoo" "taunt" "tavern" "tax" "taxi" "tea" "teacake" "teaching" "teacup" "team" "teapot" "tear" "tearoom" "tease" "teashop" "teaspoon" "teat" "teatime" "techni&qu;e" = "technique" "technicality" "technology" "teddy" "tee" "tee-shirt" "teen" "teenager" "telegram" "telegraph" "telephone" "telephoto" "teleprinter" "teleprocessing" "telescope" "television" "telex" "telltale" "telly" "temper" "temperament" "temperature" "tempest" "template" "temple" "temptation" "tenancy" "tendency" "tender" "tenderer" "tendon" "tenement" "tenet" "tense" "tension" "tent" "tentacle" "tequila" "tercet" "term" "termin&u_u;s" = "terminus" "terminal" "termination" "terminology" "termite" "terrace" "terrain" "terrier" "territory" "terror" "test" "testament" "testicle" "testimonial" "testimony" "tether" "tetrameter" "text" "textbook" "textile" "texture" "thaw" "theater" "theatre" "theatrical" "theft" "theme" "theorem" "theory" "therapy" "thermometer" "thermoplastic" "thermostat" "thesaur&u_u;s" = "thesaurus" "theta" "thickness" "thieving" "thigh" "thighbone" "thimble" "thing" "third" "thirst" "thistle" "thong" "thorn" "thoroughbred" "thoroughfare" "thought" "thread" "threat" "three-wheeler" "threshold" "thrill" "thriller" "throat" "throb" "throne" "throng" "throttle" "throw" "throw-in" "thrush" "thrust" "thud" "thug" "thumb" "thumbnail" "thumbtack" "thump" "thunderclap" "thunderstorm" "thyroid" "tiara" "tic" "tick" "ticket" "tickle" "tide" "tie" "tier" "tiff" "tiger" "tight-rope" "tile" "till" "tiller" "time" "timepiece" "timer" "timescale" "timetable" "timing" "tin" "tinge" "tingle" "tinkle" "tint" "tip" "tip-off" "tipple" "tiptoe" "tissue" "tit" "titbit" "title" "tizzy" "to-do" "toad" "toadstool" "toast" "toaster" "toastrack" "tobacco" "toboggan" "today" "toddy" "toe" "toehold" "toenail" "toffee" "toga" "toilet" "token" "tolerance" "toll" "tollbridge" "tomat&y_o;" = "tomato" "tomb" "tombola" "tomboy" "tombstone" "tomcat" "ton" "tone" "tongue" "tongue-twister" "tonic" "tonnage" "tonne" "tonsil" "tonsillectomy" "tool" "toolbox" "toot" "toothache" "toothbrush" "toothpaste" "toothpick" "top" "topcoat" "topic" "topping" "tor&qu;e" = "torque" "torch" "torment" "tornad&x_o;" = "tornado" "torped&y_o;" = "torpedo" "torrent" "torso" "tortoise" "tortoiseshell" "torture" "toss" "tot" "total" "touch" "touchdown" "touchline" "toupee" "tour" "tournament" "towel" "tower" "towline" "town" "township" "towpath" "towrope" "toy" "toyshop" "trace" "track" "tract" "tractor" "trade" "trade-in" "trademark" "tradename" "tradition" "tragedy" "trail" "trailer" "train" "trait" "tram" "tramline" "trampoline" "tran&qu;ilizer" = "tranquilizer" "tran&qu;illizer" = "tranquillizer" "trance" "transaction" "transcript" "transcription" "transducer" "transept" "transfer" "transfiguration" "transformation" "transformer" "transfusion" "transgression" "transistor" "transition" "translation" "transmission" "transmitter" "transom" "transparency" "transplant" "transport" "transporter" "transposition" "transshipment" "trap" "trapeze" "trapezium" "trapper" "trash" "trauma" "travel" "travesty" "trawler" "tray" "treachery" "tread" "treason" "treasure" "treasury" "treat" "treatise" "treatment" "treaty" "tree" "treetop" "trek" "trell&u_i;s" = "trellis" "tremor" "trench" "trend" "trespass" "tress" "trestle" "trial" "triangle" "tribe" "tribulation" "tribunal" "tribune" "tributary" "tribute" "trice" "trick" "trickle" "tricycle" "trifle" "trigger" "trilby" "trim" "trimester" "trimming" "trinket" "trio" "trip" "tripe" "triplet" "triplicate" "tripod" "tripper" "tripty&ch;" = "triptych" "triumph" "trolley" "trollop" "trombone" "troop" "trooper" "troopship" "trophy" "tropic" "trot" "trouble" "trough" "troupe" "trousseau" "trowel" "truant" "truce" "truck" "truffle" "trump" "trumpet" "truncheon" "trunk" "truss" "trust" "truth" "try" "tsar" "tub" "tuba" "tube" "tubing" "tuck" "tuft" "tug" "tug-of-war" "tulip" "tumble" "tumbler" "tummy" "tumor" "tumour" "tumult" "tune" "tuner" "tunic" "tuning" "tunnel" "tunny" "tur&qu;oise" = "turquoise" "turban" "turbine" "turbojet" "tureen" "turf" "turkey" "turn" "turn-up" "turnaround" "turning" "turning-point" "turnip" "turnout" "turnover" "turnpike" "turnstile" "turntable" "turret" "turtle" "turtleneck" "tusk" "tussle" "tutor" "tuxed&x_o;" = "tuxedo" "tv" "twang" "tweed" "twelfth" "twerp" "twig" "twilight" "twin" "twinge" "twinkle" "twirl" "twist" "twit" "twitch" "two-faced" "two-piece" "two-seater" "twosome" "tycoon" "type" "typescript" "typewriter" "typhoon" "typing" "typist" "tyranny" "tyrant" "tyre" "tzar" "udder" "ulcer" "ultimatum" "ultraviolet" "umbrage" "umbrella" "umpire" "unanimity" "uncertainty" "uncle" "undercarriage" "undercoat" "undercurrent" "underdog" "underestimate" "undergraduate" "underground" "underling" "underpass" "underpinning" "undershirt" "underside" "underskirt" "understatement" "understudy" "undertaker" "undertaking" "undertone" "underworld" "underwriter" "undoing" "uneasiness" "unicorn" "unification" "uniform" "union" "unionist" "unison" "unit" "unity" "universe" "university" "upbringing" "upheaval" "upkeep" "uplift" "upright" "uprising" "uproar" "upset" "upshot" "upside" "upstart" "upsurge" "upswing" "uptake" "uptrend" "upturn" "uranium" "urbanization" "urchin" "urge" "urgency" "urinal" "urn" "usage" "use" "usury" "utensil" "uter&u_u;s" = "uterus" "utility" "utmost" "utopia" "utterance" "vacancy" "vacation" "vaccination" "vaccine" "vacuum" "vagary" "vagina" "valance" "valentine" "valeting" "validation" "validity" "valise" "valley" "valuation" "value" "valve" "van" "vandal" "vanguard" "vanity" "vantage" "vapor" "vapour" "variable" "variance" "variant" "variation" "variety" "varnish" "vase" "vaudeville" "vault" "vcr" "vector" "vegetable" "vehicle" "veil" "vein" "velocity" "veneer" "vent" "ventilator" "venture" "venue" "veranda" "verandah" "verb" "verdict" "verge" "verse" "version" "vertebrate" "vessel" "vest" "vestibule" "vestige" "vestry" "vet" "vet&y_o;" = "veto" "viaduct" "vibration" "vicarage" "vice" "vice-president" "vicissitude" "victor" "victory" "video" "video-disc" "videotape" "view" "viewer" "viewfinder" "viewpoint" "vigil" "villa" "village" "vine" "vineyard" "vintage" "viola" "violation" "violet" "violin" "viper" "vir&u_u;s" = "virus" "virtue" "virtuoso" "visa" "viscosity" "vision" "visit" "visor" "vista" "visual" "vitamin" "vocabulary" "vocation" "vodka" "vogue" "voice" "void" "volcan&x_o;" = "volcano" "volley" "volleyball" "volt" "voltage" "volume" "vote" "voucher" "vow" "vowel" "voyage" "vulture" "wad" "wafer" "waffle" "wag" "wager" "waggon" "wagon" "wail" "waist" "waistcoat" "waistline" "wait" "waiver" "wake" "walk" "walkie-talkie" "walkout" "walkover" "walkway" "wall" "wallet" "wallflower" "wallow" "wallpaper" "walnut" "walr&u_u;s" = "walrus" "waltz" "wand" "want" "war" "wardrobe" "warehouse" "warehousekeeper" "warfare" "warhead" "warm-up" "warmth" "warning" "warp" "warrant" "warranty" "warship" "wart" "wash" "wash-out" "washbasin" "washer" "washing-up" "washroom" "wasp" "waste" "wastebasket" "wastebin" "wasteland" "watch" "watchdog" "watchword" "water" "water-ski" "watercolor" "watercolour" "watercourse" "waterfall" "waterfront" "waterline" "watermark" "watermelon" "watershed" "waterway" "watt" "wave" "wavelength" "waver" "wax" "way" "waybill" "weakling" "weakness" "weapon" "wear" "weasel" "weaving" "web" "wedding" "wedge" "weed" "weed-killer" "week" "weekday" "weekend" "weekly" "weighbridge" "weight" "weir" "welcome" "weld" "well" "well-being" "wellington" "western" "wetland" "whale" "whaler" "wharf" "wheel" "wheelbarrow" "wheelchair" "wheeze" "wherefore" "whiff" "whim" "whimper" "whine" "whip" "whip-round" "whirl" "whirlpool" "whirlwind" "whisk" "whisker" "whisper" "whistle" "white" "whitener" "whiz" "whizz" "whodunit" "whole" "wick" "wicket" "wide" "width" "wig" "wiggle" "wild" "wilderness" "will" "willow" "win" "wince" "winch" "wind" "windbreak" "windfall" "windmill" "window" "windowsill" "windpipe" "windscreen" "windshield" "wine" "wing" "winger" "wink" "winter" "wipe" "wiper" "wire" "wireless" "wiring" "wisecrack" "wish" "wisp" "wit" "witch" "withdrawal" "witness" "witticism" "wizard" "wobble" "woe" "womb" "wonder" "wood" "woodland" "woodpecker" "woodworm" "word" "wording" "work" "work-to-rule" "workbook" "workday" "workmanship" "workplace" "workroom" "worksheet" "workshop" "workstation" "world" "worm" "worry" "worth" "wound" "wrangle" "wrap" "wrapper" "wreath" "wreck" "wrench" "wriggle" "wrinkle" "wrist" "writ" "write-off" "writing" "wrong" "x-ray" "xylophone" "yacht" "yachting" "yard" "yardstick" "yarn" "yawn" "year" "yearning" "yeast" "yell" "yellow" "yelp" "yesterday" "yew" "yield" "yodel" "yoghourt" "yoghurt" "yogurt" "yoke" "yolk" "zealot" "zenith" "zer&x_o;" = "zero" "zigzag" "zip" "zipper" "zither" "zodiac" "zombie" "zone" "zoo" "zoom" N[ num=sg typ=c gen=n r=i ] "&qu;ackery" = "quackery" "&qu;antum" = "quantum" "&qu;arantine" = "quarantine" "&qu;artz" = "quartz" "&qu;estioning" = "questioning" "&qu;ick" = "quick" "&qu;icklime" = "quicklime" "&qu;ickness" = "quickness" "&qu;ietness" = "quietness" "&qu;ilting" = "quilting" "&qu;inine" = "quinine" "Arabic" "Buddhism" "Christianity" "Englishman" "Englishwoman" "Finnish" "Gaelic" "Hebrew" "Hindi" "Hinduism" "Icelandic" "Irish" "Irishman" "Irishwoman" "Latin" "Marxism" "Morse" "Orient" "Philippino" "Polish" "Swedish" "Turkish" "Ulsterman" "Welshman" "Welshwoman" "Yiddish" "Zionism" "a&qu;amarine" = "aquamarine" "abacus" "abeyance" "absent-mindedness" "absenteeism" "acceptability" "accessibility" "accommodation" "accordance" "accountability" "accountancy" "acne" "acrobatics" "actuality" "actuary" "adaptability" "addendum" "admiration" "admittance" "ado" "adolescence" "adrenalin" "advertising" "advice" "advisability" "aerodynamics" "aeronautics" "aesthetics" "affluence" "afterlife" "aggression" "agility" "agriculture" "agronomy" "airspace" "albumen" "alchemy" "alertness" "alienation" "alimony" "amazement" "amber" "ambivalence" "amnesia" "anaesthesia" "analysis" "anathema" "anemia" "anesthesia" "anger" "angina" "anguish" "animation" "aniseed" "anonymity" "antagonism" "anthropology" "anticipation" "antithesis" "apathy" "aplomb" "apotheosis" "appendicitis" "approbation" "arbitrage" "archaeology" "archeology" "archery" "architecture" "ardor" "ardour" "aridity" "arithmetic" "armor" "armour" "arrogance" "arsenic" "arson" "arthritis" "artistry" "asbestos" "ascendancy" "asparagus" "assistance" "asthma" "astrology" "astronomy" "astrophysics" "atheism" "athletics" "atmospherics" "attainability" "attractiveness" "attrition" "audio" "authenticity" "automaton" "avail" "avarice" "aviation" "awareness" "awe" "axis" "babble" "bachelorhood" "backbiting" "bacteria" = "bacterium" "bacteriology" "bacterium" "badminton" "baggage" "baking" "baldness" "ballast" "ballistics" "baloney" "balsa" "bamboo" "banter" "barium" "barley" "barracks" "basil" "basis" "batter" "bauxite" "beachwear" "beef" "bemusement" "benevolence" "bestowal" "biceps" "bigamy" "bile" "billiards" "biochemistry" "biodiversity" "biography" "biology" "birdlife" "bis&qu;e" = "bisque" "bitterness" "blackmail" "blackness" "blame" "blarney" "blindness" "bloodshed" "blubber" "blueness" "bluntness" "boastfulness" "bodywork" "bondage" "book-keeping" "booty" "booze" "bowling" "bowls" "boxing" "boyhood" "brass" "bravery" "brawn" "bread" "brevity" "bribery" "briefness" "brightness" "brilliance" "broccoli" "brokerage" "bronchitis" "bronchus" "broth" "bullfighting" "bullion" "bullying" "bunting" "buoyancy" "butane" "buttermilk" "cabotage" "caffein" "caffeine" "calcium" "calculus" "callousness" "calm" "calmness" "camouflage" "camping" "candor" "candour" "candy-floss" "cannabis" "cannibalism" "canoeing" "capitalism" "captivity" "capture" "carpentry" "case-law" "cashmere" "catarrh" "catharsis" "caviar" "celery" "celibacy" "cellophane" "cellulose" "cement" "champagne" "chard" "chastity" "chatter" "cheating" "chemistry" "chess" "chessman" "chest-of-drawers" "chicory" "chiffon" "childbirth" "childcare" "childhood" "chivalry" "chlorine" "chlorophyll" "cholera" "cholesterol" "chromatography" "chromium" "cinnamon" "citrus" "clarity" "claustrophobia" "cleanliness" "climbing" "clockwork" "clothing" "cm" "coat-of-arms" "coca" "cocaine" "cocoa" "coexistence" "cognizance" "coherence" "coke" "coleslaw" "collusion" "communications" "communism" "companionship" "comparability" "compassion" "compatibility" "competence" "competitiveness" "competitivity" "complacency" "completeness" "compliance" "complicity" "computerization" "comradeship" "conciliation" "concrete" "conditioning" "conduction" "confectionery" "confetti" "confidentiality" "conformance" "conformity" "congruence" "conjunctivitis" "conjuring" "connivance" "consciousness" "conscription" "conservatism" "consommé" "constancy" "consternation" "constipation" "consumption" "contentment" "continuity" "contraband" "contraception" "convergence" "cooking" "coolness" "cooperation" "coral" "coriander" "cornflour" "corpus" "cosiness" "cosmos" "cotton" "counseling" "countryside" "coverage" "cowardice" "creativity" "credence" "credibility" "credulity" "crematorium" "cribbage" "crimson" "crisis" "criterion" "crochet" "crockery" "crossroads" "cruising" "cryptography" "crystallography" "cultivation" "cunning" "cupidity" "curriculum" "cutlery" "cwt" "cyanide" "cybernetics" "cynicism" "détente" "dancing" "darkness" "data-processing" "datum" "daybreak" "daylight" "daytime" "debauchery" "debris" "decay" "decease" "decentralization" "decision-making" "decomposition" "defamation" "deference" "defiance" "deforestation" "dehydration" "dejection" "delin&qu;ency" = "delinquency" "delirium" "deliverance" "demeanour" "democratization" "dentistry" "dependability" "deregulation" "derision" "dermatology" "derogation" "desalination" "desegregation" "desertification" "desirability" "desolation" "despair" "desperation" "destabilization" "determination" "detriment" "dexterity" "diabetes" "diaeresis" "diagnosis" "diffidence" "diffusion" "dignity" "diligence" "dinnerware" "diphtheria" "diplomacy" "dis&qu;iet" = "disquiet" "disapproval" "disarmament" "disarray" "disbandment" "disbelief" "discipline" "discontent" "discretion" "discrimination" "disdain" "disfavour" "disgust" "dishonesty" "dishonour" "disintegration" "dismay" "disobedience" "dispensing" "displeasure" "disposition" "disregard" "disrepair" "dissatisfaction" "dissemination" "dissension" "dissent" "disservice" "distaste" "distemper" "distress" "distrust" "disuse" "diversification" "diversity" "diving" "dizziness" "documentation" "dole" "dominance" "domination" "doom" "dormouse" "dough" "downstairs" "drainage" "draughts" "dressing" "dressmaking" "drift" "driftwood" "drinking" "dripping" "drizzle" "dross" "drudgery" "drunkenness" "dryness" "dumping" "dung" "duplicity" "durum" "dust" "dwarf" "dynamics" "dynamism" "dysentery" "e&qu;animity" = "equanimity" "earshot" "earthenware" "earwax" "ease" "east" "eating" "ebony" "ecodevelopment" "ecology" "economics" "ecotoxicology" "eczema" "edging" "editing" "education" "effectiveness" "efficaciousness" "efficacy" "efficiency" "effrontery" "egoism" "egotism" "elaboration" "elasticity" "elation" "electioneering" "electricity" "electrolysis" "elegance" "elf" "eligibility" "elo&qu;ence" = "eloquence" "elocution" "emancipation" "embezzlement" "embodiment" "emigration" "emphasis" "employment" "emptiness" "endurance" "enforcement" "engineering" "enjoyment" "enlightenment" "enormity" "enrichment" "entomology" "epidemiology" "erosion" "eroticism" "escapism" "espionage" "esthetics" "ethics" "ethnology" "eti&qu;ette" = "etiquette" "euphoria" "euthanasia" "eutrophication" "eutrophy" "evaporation" "evidence" "evolution" "excellence" "excrement" "exhaustion" "existence" "expectancy" "expedience" "expediency" "experimentation" "expertise" "exploitation" "exportation" "eyesight" "facilitation" "faintness" "fairness" "fallout" "fame" "familiarity" "fancy-dress" "farming" "farmland" "fascination" "fascism" "fatness" "fatstock" "favoritism" "favouritism" "feasibility" "feedback" "fell-walking" "felt" "femininity" "fencing" "ferocity" "fertility" "fertilization" "fiberglass" "fibre-glass" "fibreglass" "fidelity" "fieldwork" "fighting" "filth" "finality" "finery" "fire-fighting" "fireman" "firewood" "firmness" "fisherman" "fishing" "fitness" "flair" "flatness" "flattery" "flatulence" "flax" "flesh" "flexibility" "flooding" "flora" "flu" "fluency" "fluoridation" "fluorine" "flying" "fodder" "foliage" "fondness" "footman" "forage" "forefront" "foreman" "forestry" "forgetfulness" "forgiveness" "fortitude" "foster-child" "fragmentation" "frankness" "freemasonry" "freight" "freshman" "freshness" "friendliness" "friendship" "frigidity" "frogman" "frostbite" "froth" "fruition" "fudge" "fumigant" "fumigation" "fun" "fungus" "furniture" "futility" "gaiety" "gambling" "gaming" "gamut" "gangrene" "garlic" "gasification" "gasoline" "gastronomy" "gauze" "gazumping" "gelatine" "gelignite" "generosity" "genetics" "gentleman" "gentleness" "gents" "geography" "geology" "geometry" "germination" "gerrymandering" "gibberish" "giddiness" "gilt" "ginger" "gingham" "give" "give-and-take" "glamor" "glamour" "glassware" "glee" "gliding" "globalization" "gloom" "glorification" "glossy" "glucose" "glycerine" "goatmeat" "golf" "goodness" "goodwill" "goose" "gooseflesh" "gore" "gorse" "gossamer" "gout" "grandchild" "granite" "graphite" "gratitude" "gravity" "gravy" "grease" "greatness" "greed" "grief" "grime" "gristle" "grit" "grog" "grounding" "groundwater" "guesswork" "guidance" "guile" "guilt" "gumption" "gunman" "gunpowder" "gust&y_o;" = "gusto" "gymnastics" "gynaecology" "haggling" "hail" "half" "halon" "handwriting" "handyman" "happiness" "hardening" "hardness" "hardware" "harmonization" "harrassment" "harshness" "hashish" "haste" "haulage" "hay" "haze" "header" "headway" "health" "health-care" "heartburn" "heather" "heating" "heatstroke" "helium" "helmsman" "helplessness" "hemp" "henchman" "hepatitis" "heraldry" "heredity" "hessian" "hexafluoride" "hide-and-seek" "hiking" "hilarity" "hoarfrost" "hockey" "holiness" "homoeopathy" "honesty" "honey" "hoof" "hooliganism" "horseradish" "horticulture" "hosiery" "hubbub" "humankind" "humidity" "humility" "hydraulics" "hydroelectricity" "hydrogen" "hygiene" "hypnosis" "hypnotism" "hypothesis" "hysteria" "icing" "idealism" "ignorance" "illegality" "illiteracy" "imagination" "immigration" "immorality" "immortality" "immunity" "impartiality" "impatience" "imperialism" "import-export" "impossibility" "impotence" "impunity" "inbreeding" "incest" "incineration" "incompetence" "incontinence" "inconvenience" "indebtedness" "indecision" "independence" "indig&x_o;" = "indigo" "indigestion" "indisposition" "individualism" "infallibility" "infancy" "infantryman" "inferiority" "infertility" "infidelity" "influenza" "informality" "information" "infrastructure" "ingratitude" "inhalation" "inhumanity" "innocence" "insensitivity" "insignificance" "insincerity" "insistence" "insolence" "insomnia" "instability" "instigation" "insubordination" "insulin" "insurance" "integration" "integrity" "intelligence" "intercourse" "internment" "interpreting" "intimacy" "intimidation" "intolerance" "intoxication" "invalidity" "invective" "inventiveness" "iodine" "iota" "ironing" "irrelevance" "irritability" "isolation" "isolationism" "itching" "jack-knife" "jade" "jargon" "jaundice" "jazz" "jetsam" "jewellery" "jewelry" "jiujitsu" "jogging" "jollity" "journalese" "journalism" "judo" "jurisprudence" "juryman" "justness" "keenness" "keeping" "kerosene" "ketchup" "khaki" "kitchenware" "knife" "know-how" "knowledge" "kudos" "lagging" "laity" "lambswool" "landfill" "lard" "laryngitis" "lateness" "latex" "laughter" "lava" "lavender" "laxity" "laziness" "leadership" "leading" "learning" "leeway" "leg-room" "legality" "legibility" "legitimacy" "leisure" "leniency" "lethargy" "lettering" "levity" "lexicography" "li&qu;idity" = "liquidity" "li&qu;orice" = "liquorice" "liberalism" "liberalization" "liberation" "licensing" "licorice" "life" "lighting" "lightness" "lightning" "lignite" "limelight" "limestone" "linen" "linesman" "lingerie" "linguistics" "lint" "listeria" "literacy" "literature" "lithium" "lithography" "litigation" "litmus" "liveliness" "livestock" "loam" "loathing" "lockjaw" "logistics" "loneliness" "longhand" "looseness" "loot" "looting" "lore" "louse" "lubrication" "lubricity" "lucidity" "luck" "ludo" "luggage" "lumbago" "lumber" "lying" "lymph" "lyricism" "macaroni" "machinery" "macroeconomics" "madness" "magic" "magma" "magnesium" "magnetism" "magnificence" "mahogany" "mail" "main" "mainland" "mains" "maintainability" "maintenance" "maize" "majesty" "malaria" "malevolence" "malice" "malnutrition" "malpractice" "maneuverability" "manganese" "manhood" "mankind" "mannerism" "manpower" "manslaughter" "manufacture" "manufacturing" "manure" "margarine" "marijuana" "marjoram" "marksman" "marksmanship" "marmalade" "marzipan" "mascara" "masculinity" "masonry" "mastery" "masturbation" "materialism" "maternity" "math" "mathematics" "maths" "mating" "matrimony" "matrix" "maturity" "mayonnaise" "meanness" "meantime" "measles" "mechanics" "mechanization" "media" "mediocrity" "megalomania" "melancholy" "meningitis" "menstruation" "menthol" "merchandising" "mercury" "merriment" "metamorphosis" "metaphysics" "meteorology" "methane" "methodology" "metrication" "mettle" "mews" "microbiology" "microelectronics" "middleman" "midwifery" "might" "mildew" "mildness" "military" "milking" "milkman" "millinery" "mimicry" "mince" "mincemeat" "mineralogy" "minimum" "mining" "mirth" "misbehaviour" "mischief" "misconduct" "mismanagement" "mistletoe" "mistrust" "mm" "mobility" "moderation" "modernization" "modesty" "mohair" "moisture" "molasses" "money" "monotheism" "monotony" "moonlight" "morale" "morality" "morals" "morbidity" "mormonism" "morphine" "mortality" "mother-of-pearl" "motherhood" "motoring" "mountaineering" "mouse" "moving" "muck" "mucus" "mud" "mud-slinging" "mufti" "multilingualism" "mumps" "murk" "murkiness" "muslin" "mustard" "mutton" "mysti&qu;e" = "mystique" "nakedness" "napalm" "nastiness" "nationalism" "nationalization" "naturalness" "nausea" "navigation" "nearness" "nectar" "needlecord" "needlework" "neglect" "negligence" "nepotism" "nervousness" "netball" "netting" "networking" "neurosis" "neutrality" "newness" "news" "newspaperman" "nitrogen" "nobility" "nobleman" "nomenclature" "non-fiction" "nonsense" "normality" "nostalgia" "notepaper" "notoriety" "nougat" "nourishment" "nudity" "numbness" "numeracy" "nursing" "nurture" "nutrition" "oasis" "oatmeal" "obesity" "objectivity" "obliteration" "oblivion" "obliviousness" "obsolescence" "obstetrics" "obstinacy" "occupancy" "offal" "offing" "oilseed" "olive-oil" "oncology" "onomatopoeia" "onyx" "opacity" "openness" "opium" "opportuneness" "opportunism" "oppression" "optimism" "optimum" "opulence" "ordination" "ordnance" "orientation" "originality" "originator" "ornamentation" "ornithology" "osmosis" "ostentation" "outback" "outdoors" "overabundance" "overcapacity" "overcrowding" "overpopulation" "overproduction" "overspill" "oversupply" "overtaking" "overthrow" "overtime" "overwork" "ownership" "ox" "oxygen" "pacification" "packaging" "packing" "padding" "paediatrics" "pageantry" "paleness" "pandemonium" "paneling" "panelling" "panoply" "paperwork" "paprika" "paralysis" "paranoia" "paraphernalia" "parenthesis" "parking" "parsley" "participation" "pasteurization" "patchwork" "patentability" "paternity" "pathology" "pathos" "patience" "patriotism" "patrolman" "patronage" "paving" "peace" "peace-keeping" "peacekeeping" "pedagogy" "pediatrics" "penicillin" "penknife" "pep" "perfection" "peripherality" "perjury" "permanence" "permanency" "perpetuity" "persecution" "perseverance" "persistence" "perspicacity" "perspiration" "perversity" "pessimism" "petrol" "petroleum" "pettiness" "pewter" "phenomenon" "philanthropy" "philately" "phlegm" "phonetics" "phosphorescence" "phosphorus" "photography" "phylloxera" "physics" "physiology" "physiotherapy" "pi&qu;e" = "pique" "piecework" "piety" "pilfering" "ping-pong" "piracy" "pitch-black" "pith" "pity" "placidity" "plagiarism" "plainness" "planning" "plasticine" "plasticity" "platinum" "pleasantness" "plenty" "pleurisy" "ploughing" "pluck" "plumbing" "plunder" "pluralism" "plush" "plutonium" "plywood" "pneumonia" "poaching" "poetics" "poetry" "polarization" "policeman" "policewoman" "polio" "politeness" "politics" "pollen" "pollination" "pollution" "polo" "polyester" "polygamy" "polypropylene" "polystyrene" "polythene" "popcorn" "poplin" "popularity" "porcelain" "pork" "pornography" "porridge" "postage" "postman" "potash" "potassium" "potholing" "potluck" "poultry" "poverty" "practicability" "precipitation" "precision" "predestination" "predictability" "predominance" "prehistory" "premeditation" "preparedness" "preponderance" "presence" "preservation" "pressing" "prestige" "prevalence" "prevention" "priesthood" "privacy" "privatization" "privet" "probation" "probity" "procrastination" "procreation" "procurement" "produce" "productivity" "professionalism" "proficiency" "profitability" "profiteering" "profusion" "prognosis" "progress" "proliferation" "promiscuity" "promptness" "propaganda" "propagation" "propriety" "propulsion" "prose" "prospecting" "prosperity" "protection" "protestantism" "protozoon" "providence" "prowess" "psychoanalysis" "psychology" "psychotherapy" "puberty" "pulp" "punctuality" "punctuation" "punditry" "purification" "purity" "purview" "pus" "pyrolysis" "rabies" "racialism" "racism" "radiance" "radioactivity" "radioelectronics" "radiography" "radiology" "radiotelegraphy" "radium" "radius" "raffia" "rainfall" "raj" "rancor" "rancour" "random" "rationing" "readiness" "realism" "realization" "reasoning" "reciprocity" "reclamation" "recognition" "reconsideration" "recourse" "recycling" "redirection" "redistribution" "redness" "redress" "referendum" "reforestation" "refrigeration" "rehabilitation" "reimposition" "reintegration" "relaxation" "relevance" "reliability" "reliance" "reluctance" "remorse" "remoteness" "remuneration" "renown" "repairman" "repartee" "repeal" "repentance" "repertory" "representativeness" "repute" "resettlement" "residency" "resilience" "resourcefulness" "respectability" "responsiveness" "retardation" "retraining" "retrospect" "returnee" "revelry" "revenge" "reverence" "revocation" "revulsion" "rhetoric" "rheumatism" "rhubarb" "rice" "richness" "rickets" "ridicule" "riffraff" "rifleman" "right-of-way" "righteousness" "rigidity" "ripeness" "romanticism" "roofing" "rosemary" "rosin" "rot" "rotogravure" "rouge" "rough" "roulette" "roundsman" "rowdiness" "rowing" "rudeness" "rue" "rugby" "rugger" "ruination" "runner-up" "running" "rust" "rustproofing" "ruthlessness" "rye" "saccharin" "saccharine" "sacking" "sacrilege" "sadism" "sadness" "safekeeping" "safety" "saffron" "sago" "salesman" "salesmanship" "saleswoman" "saliva" "salmonella" "salvage" "salvation" "sanctity" "sandstone" "sanitation" "sanity" "sarcophagus" "satin" "savagery" "savvy" "scaffolding" "scarf" "scarlet" "scenery" "scepticism" "sciatica" "sclerosis" "scope" "scorn" "scree" "scrutiny" "scurvy" "sea-level" "seaman" "seaside" "seating" "seawater" "seclusion" "secrecy" "sedation" "sedition" "seersucker" "segregation" "self" "self-confidence" "self-consciousness" "self-control" "self-defence" "self-determination" "self-discipline" "self-esteem" "self-help" "self-interest" "self-pity" "self-preservation" "self-respect" "self-sacrifice" "self-service" "self-sufficiency" "selfishness" "sellotape" "semantics" "semen" "semolina" "senility" "seniority" "sensuality" "sentimentality" "serenity" "seriousness" "sesame" "severance" "severity" "sewage" "sewerage" "sewing" "shale" "shambles" "sheaf" "sheepmeat" "shelf" "shingles" "shipbuilding" "shipping" "shoplifting" "shopping" "shortbread" "shortening" "shorthand" "shortness" "shortwave" "shouting" "showmanship" "shrapnel" "shrewdness" "shrift" "shrinkage" "shrubbery" "shunting" "shyness" "sightseeing" "significance" "silage" "silicon" "silicone" "silver" "similitude" "simplicity" "sincerity" "skepticism" "skiing" "slag" "slapstick" "slaughter" "slavery" "sleeplessness" "sleet" "slime" "slowness" "sludge" "slush" "smallpox" "smog" "smoke" "smoking" "smoothness" "snobbery" "snooker" "snowman" "snuff" "soap" "soccer" "socialism" "socialization" "sociology" "sodium" "softness" "software" "solace" "solidarity" "solidity" "solitaire" "soot" "sophistication" "sorrel" "southeast" "southwest" "sovereignty" "spacing" "spaghetti" "specialization" "spectrum" "speeding" "sperm" "spinach" "spiritualism" "spittle" "spoilage" "spokesman" "spokeswoman" "sponsorship" "spontaneity" "sportsman" "sportsmanship" "sportswear" "sportswoman" "stability" "stabilization" "staffing" "staging" "stagnation" "stamina" "standardization" "standing" "staphylococcus" "starlight" "statesman" "stateswoman" "static" "stationery" "statistics" "stead" "stealth" "steam" "steel" "steering" "sterility" "sterilization" "sterling" "stiffness" "stillness" "stimulation" "stocktaking" "stoicism" "stonework" "storage" "strangeness" "strangulation" "stratosphere" "stratum" "strictness" "strife" "strontium" "stuff" "stuffing" "stuntman" "stupefaction" "stupidity" "subduction" "sublime" "subsidence" "subsidiarity" "subsistence" "subsoil" "subtraction" "suddenness" "suede" "suet" "suffering" "suffocation" "suffrage" "sulfur" "sulphur" "sunshine" "sunstroke" "superannuation" "superiority" "superman" "supervision" "suppression" "supremacy" "surety" "surf" "surfing" "surveillance" "survival" "susceptibility" "suspense" "suspension" "sustainability" "sustenance" "sweetcorn" "sweetness" "swiftness" "symbolism" "synchronization" "synopsis" "synthesis" "syphilis" "tackle" "tact" "talc" "tallness" "tapioca" "tarmac" "tarragon" "taxation" "teak" "teamwork" "tedium" "teething" "telecommunications" "telepathy" "teletext" "temerity" "temperance" "tempo" "tenacity" "tenderness" "tennis" "tenseness" "tenure" "terracotta" "terrorism" "tetanus" "tetrachloride" "theology" "thermoluminescence" "thesis" "thinness" "thoroughness" "thrift" "thrombosis" "thunder" "thyme" "tiddlywinks" "tidiness" "timber" "tinsel" "tiredness" "titanium" "tittle-tattle" "togetherness" "toil" "toleration" "tonsillitis" "tooth" "topography" "torpor" "totality" "toughness" "touring" "tourism" "towelling" "toxicity" "toxicology" "traction" "traffic" "tran&qu;illity" = "tranquillity" "transit" "transportation" "treacle" "trepidation" "tribesman" "trickery" "trigonometry" "tritium" "triviality" "truthfulness" "tuberculosis" "tuition" "tungsten" "turbulence" "turmoil" "turpentine" "twaddle" "twill" "twine" "typhoid" "typhus" "ugliness" "unbelief" "unconscious" "underestimation" "undergrowth" "understanding" "undersupply" "underwear" "unemployed" "unemployment" "unhappiness" "uni&qu;eness" = "uniqueness" "uniformity" "unreality" "unrest" "unwillingness" "upholstery" "upstairs" "urea" "usefulness" "utilization" "vandalism" "vanilla" "variability" "vastness" "veal" "vegetation" "vehemence" "velvet" "vengeance" "venison" "venom" "ventilation" "verification" "vermouth" "vernacular" "versatility" "vertebra" "vertig&x_o;" = "vertigo" "verve" "viability" "vicinity" "viciousness" "victimization" "vigilance" "vigor" "vigour" "vindication" "vinegar" "vinyl" "violence" "virginity" "virility" "visibility" "vitality" "viticulture" "vivacity" "vivisection" "voile" "volatility" "volition" "vomit" "vulgarity" "vulnerability" "walking" "wartime" "washing" "wastage" "waste-paper" "waste-water" "watchman" "water-skiing" "watercress" "wayside" "wealth" "weaponry" "weariness" "weather" "webbing" "wedlock" "weightlessness" "welding" "welfare" "west" "wet" "wetness" "whaling" "wheat" "whereabouts" "whiskey" "whisky" "whist" "whiteness" "whitewash" "wholesale" "wickedness" "wicker" "wideness" "wildlife" "willingness" "wisdom" "witchcraft" "wolf" "woodwind" "woodwork" "wool" "workforce" "workman" "worship" "worsted" "wrath" "wreckage" "wrestling" "wrongdoing" "yachtsman" "yeoman" "yes" "yoga" "zeal" "zest" "zinc" "zoology" N[ num=sg typ=c r=i ] "Japanese" "Maltese" "Nepalese" "Siamese" "Vietnamese" "draughtsman" "great-grandchild" N[ num=sg typ=c|p1 gen=n ] "April" "August" "Burgundy" "Christm&u_a;s" = "Christmas" "Cupid" "December" "February" "Friday" "January" "July" "June" "March" "May" "Monday" "November" "October" "Passover" "Pentecost" "Saturday" "September" "Sunday" "Thanksgiving" "Thursday" "Tuesday" "Wednesday" "Whitsun" "Xmas" "Yule" "trinity" N[ num=sg typ=p1 gen=n ] "Lent" "NATO" "Vietnam" "braille" N[ num=sg typ=p1 gen=n r=i ] "Wales" N[ num=sg typ=p2 gen=n ] "TUC" N[ typ=c gen=m|f r=i ] "Sudanese" "Taiwanese" "deceased" "eldest" "next-of-kin" N[ typ=c gen=n ] "dice" "fry" "herring" "minnow" "people" "pike" "progeny" "puma" "shrimp" "trout" "turbot" "whiting" "zebra" N[ typ=c gen=n r=i ] "&qu;ail" = "quail" "&qu;id" = "quid" "Pisces" "barracuda" "bereaved" "bream" "brickworks" "ceramics" "chamois" "chassis" "checkers" "clientele" "cod" "corps" "crayfish" "customs" "cuttlefish" "daddy-long-legs" "darts" "data" "dregs" "earthworks" "electronics" "fish" "gallows" "gasworks" "goldfish" "grapefruit" "gross" "grouse" "haddock" "hake" "head&qu;arters" = "headquarters" "hovercraft" "hundredweight" "ironworks" "jellyfish" "lira" "mackerel" "merchandise" "mink" "moose" "offspring" "optics" "plaice" "plankton" "police" "proceedings" "radiocommunications" "rapeseed" "s&qu;id" = "squid" "salmon" "series" "sheep" "shellfish" "spacecraft" "species" "starfish" "steelworks" "swordfish" "tactics" "thanks" "tuna" "waxworks" "whitebait" "winnings" "works" "yen" "youth" N[ typ=c r=i ] "Dutch" "Flemish" "Portuguese" mmorph-2.3.4.2.orig/data/lex.exp.V0100644000175000001440000014347006046143522015603 0ustar mvelausers; MULTEXT morphology tool ; English morphology description for mmorph ; Version 2.3, October 1995 ; Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland ;; Lexical entries for English; Verbs ;; Author: Graham Russell ;; Additions by: Susan Armstrong ;; ;; GJR ISSCO 20-1-95 ;; ;; SA ISSCO last change 16-5-95 ;;--------------------------------------------------------------- V[ tns=past vfm=fin num=pl typ=a ] "were" = "be" "weren't" = "be" V[ tns=past vfm=fin num=sg per=1|3 typ=a ] "wasn't" = "be" V[ tns=past vfm=fin num=sg per=2 typ=a ] "weren't" = "be" V[ tns=past vfm=fin typ=a ] "'d" = "have" "did" = "do" "didn't" = "do" "had" = "have" "hadn't" = "have" V[ tns=past vfm=fin typ=v ] "arose" = "arise" "ate" = "eat" "awoke" = "awake" "bade" = "bid" "beat" "became" = "become" "befell" = "befall" "began" = "begin" "begat" = "beget" "bit" = "bite" "blew" = "blow" "bore" = "bear" "broke" = "break" "came" = "come" "chose" = "choose" "countersank" = "countersink" "deep-froze" = "deep-freeze" "drank" = "drink" "drew" = "draw" "drove" = "drive" "fell" = "fall" "flew" = "fly" "forbade" = "forbid" "foresaw" = "foresee" "foresook" = "foresake" "forewent" = "forego" "forgave" = "forgive" "forgot" = "forget" "found" = "find" "froze" = "freeze" "gave" = "give" "grew" = "grow" "hid" = "hide" "knew" = "know" "lay" = "lie" "mistook" = "mistake" "outgrew" = "outgrow" "overcame" = "overcome" "overran" = "overrun" "overrode" = "override" "oversaw" = "oversee" "overthrew" = "overthrow" "overtook" = "overtake" "partook" = "partake" "ran" = "run" "rang" = "ring" "redid" = "redo" "reran" = "rerun" "rewrote" = "rewrite" "rode" = "ride" "rose" = "rise" "sang" = "sing" "sank" = "sink" "saw" = "see" "shook" = "shake" "shrank" = "shrink" "span" = "spin" "spoke" = "speak" "sprang" = "spring" "stank" = "stink" "stole" = "steal" "strode" = "stride" "strove" = "strive" "swam" = "swim" "swang" = "swing" "swore" = "swear" "threw" = "throw" "throve" = "thrive" "took" = "take" "tore" = "tear" "trod" = "tread" "underlay" = "underlie" "undertook" = "undertake" "underwent" = "undergo" "underwrote" = "underwrite" "undid" = "undo" "went" = "go" "withdrew" = "withdraw" "woke" = "wake" "won" = "win" "wore" = "wear" "wove" = "weave" "wrote" = "write" V[ tns=pres vfm=fin num=pl typ=a ] "'ve" = "have" "are" = "be" "aren't" = "be" "don't" = "do" "don't" = "do" "have" "haven't" = "have" V[ tns=pres vfm=fin num=sg per=1 typ=a ] "am" = "be" V[ tns=pres vfm=fin num=sg per=1|2 typ=a ] "don't" = "do" "have" "haven't" = "have" V[ tns=pres vfm=fin num=sg per=1|3 typ=a ] "was" = "be" V[ tns=pres vfm=fin num=sg per=2 typ=a ] "are" = "be" "aren't" = "be" "were" = "be" V[ tns=pres vfm=fin num=sg per=3 typ=a ] "'s" = "be" "'s" = "have" "does" = "do" "doesn't" = "do" "has" = "have" "hasn't" = "have" "is" = "be" "isn't" = "be" V[ tns=pres vfm=fin typ=a ] "let's" = "let" V[ tns=pres vfm=fin typ=m ] "'d" = "would" "'ll" = "will" "can" "can't" = "can" "cannot" "could" "couldn't" = "could" "may" "might" "mightn't" = "might" "mustn't" = "must" "ought" "shall" "shalt" = "shall" "shan't" = "shall" "should" "shouldn't" = "should" "will" "won't" = "will" "would" "wouldn't" = "would" V[ vfm=bse typ=a ] "'ve" = "have" "be" "do" "have" V[ vfm=bse typ=v ] "&qu;adruple" = "quadruple" "&qu;ake" = "quake" "&qu;alify" = "qualify" "&qu;antify" = "quantify" "&qu;arantine" = "quarantine" "&qu;arrel" = "quarrel" "&qu;arry" = "quarry" "&qu;art&u_e;r" = "quarter" "&qu;ash" = "quash" "&qu;av&u_e;r" = "quaver" "&qu;ell" = "quell" "&qu;ench" = "quench" "&qu;ery" = "query" "&qu;estion" = "question" "&qu;eue" = "queue" "&qu;ibble" = "quibble" "&qu;ick&u_e;n" = "quicken" "&qu;iet" = "quiet" "&qu;ip" = "quip" "&qu;iv&u_e;r" = "quiver" "&qu;iz" = "quiz" "&qu;ote" = "quote" "X-ray" "aband&u_o;n" = "abandon" "abate" "abbreviate" "abdicate" "abduct" "abet" "abhor" "abide" "abolish" "abort" "abound" "abridge" "abrogate" "abscond" "absolve" "absorb" "abstain" "abstract" "abuse" "ac&qu;aint" = "acquaint" "ac&qu;iesce" = "acquiesce" "ac&qu;ire" = "acquire" "ac&qu;it" = "acquit" "accede" "accelerate" "accentuate" "accept" "acclaim" "acclimatize" "accommodate" "accompany" "accomplish" "accord" "accost" "account" "accrue" "accumulate" "accuse" "accust&u_o;m" = "accustom" "ache" "achieve" "acknowledge" "act" "activate" "ad-lib" "adapt" "add" "addict" "address" "adhere" "adjoin" "adjourn" "adjust" "administ&u_e;r" = "administer" "admire" "admit" "admonish" "adopt" "adore" "adorn" "adulterate" "advance" "advertise" "advise" "advocate" "affect" "affiliate" "affirm" "affix" "afflict" "afford" "age" "agglomerate" "agglutinate" "aggrandize" "aggravate" "aggrieve" "agitate" "agonize" "agree" "aid" "aim" "air" "alarm" "alert" "alienate" "alight" "align" "allay" "allege" "alleviate" "allocate" "allot" "allow" "allude" "ally" "alphabetize" "alt&u_e;r" = "alter" "alternate" "amalgamate" "amass" "amaze" "amble" "ambush" "ameliorate" "amend" "americanize" "amount" "amplify" "amputate" "amuse" "analyse" "analyze" "anch&u_o;r" = "anchor" "ang&u_e;r" = "anger" "angle" "anglicize" "animate" "annex" "annihilate" "annotate" "announce" "annoy" "annul" "anoint" "answ&u_e;r" = "answer" "antagonize" "anticipate" "ape" "apologize" "appal" "appall" "appeal" "appear" "appease" "append" "appertain" "applaud" "apply" "appoint" "apportion" "appraise" "appreciate" "apprehend" "approach" "appropriate" "approve" "approximate" "arbitrate" "arch" "argue" "arm" "arouse" "arraign" "arrange" "arrest" "arrive" "articulate" "ascend" "ascertain" "ascribe" "ask" "asphyxiate" "aspirate" "aspire" "assail" "assassinate" "assault" "assay" "assemble" "assent" "assert" "assess" "assign" "assimilate" "assist" "associate" "assume" "assure" "astonish" "astound" "atone" "atrophy" "attach" "attack" "attain" "attempt" "attend" "attenuate" "attest" "attract" "attribute" "auction" "aud&u_i;t" = "audit" "audition" "aug&u_u;r" = "augur" "augment" "authenticate" "authorize" "autograph" "automate" "avail" "avenge" "average" "avert" "avoid" "avow" "await" "awak&u_e;n" = "awaken" "award" "awe" "axe" "babble" "baby-sit" "back" "backdate" "backfire" "badg&u_e;r" = "badger" "baffle" "bag" "bail" "bait" "bake" "balance" "bale" "balk" "bamboozle" "ban" "band" "bandage" "bandy" "bang" "banish" "bank" "bankrupt" "bant&u_e;r" = "banter" "baptize" "bar" "barbecue" "bare" "bargain" "barge" "bark" "barricade" "bart&u_e;r" = "barter" "base" "bash" "bask" "baste" "bat" "bath" "bathe" "batt&u_e;r" = "batter" "battle" "baulk" "bawl" "be&qu;eath" = "bequeath" "beach" "beam" "beautify" "beck&u_o;n" = "beckon" "bed" "bedazzle" "beep" "befall" "befit" "befriend" "beg" "begrudge" "beguile" "behave" "belch" "belie" "believe" "belittle" "bellow" "belly" "belong" "belt" "bemuse" "benef&u_i;t" = "benefit" "bereave" "berth" "besiege" "bestow" "betray" "bett&u_e;r" = "better" "beware" "bewild&u_e;r" = "bewilder" "bias" "bick&u_e;r" = "bicker" "bide" "bill" "bisect" "bivouac" "blab" "black" "black&u_e;n" = "blacken" "blackmail" "blame" "blanch" "blare" "blaspheme" "blast" "blaze" "bleach" "bleat" "blend" "bless" "blight" "blind" "blindfold" "blink" "blist&u_e;r" = "blister" "bloat" "block" "blockade" "bloom" "bloss&u_o;m" = "blossom" "blot" "blubb&u_e;r" = "blubber" "bluff" "blund&u_e;r" = "blunder" "blunt" "blur" "blurt" "blush" "board" "boast" "bob" "bog" "boggle" "boil" "bolst&u_e;r" = "bolster" "bolt" "bomb" "bombard" "bond" "bone" "boo" "book" "boom" "boost" "boot" "booze" "bord&u_e;r" = "border" "bore" "borrow" "boss" "botch" "both&u_e;r" = "bother" "bottle" "bounce" "bound" "bow" "bowl" "box" "boycott" "brace" "brack&u_e;t" = "bracket" "brag" "braid" "brainwash" "braise" "brake" "branch" "brand" "brandish" "brave" "brawl" "bray" "braz&u_e;n" = "brazen" "breach" "breathe" "brew" "bribe" "bridge" "bridle" "brief" "bright&u_e;n" = "brighten" "bristle" "broach" "broad&u_e;n" = "broaden" "broil" "brok&u_e;r" = "broker" "brood" "brown" "browse" "bruise" "brush" "bubble" "buck" "buckle" "bud" "budg&u_e;t" = "budget" "budge" "buff" "buff&u_e;t" = "buffet" "buffalo" "bug" "bulge" "bulldoze" "bully" "bum" "bump" "bundle" "bung" "bungle" "buoy" "burd&u_e;n" = "burden" "burgeon" "burglarize" "burgle" "burnish" "burp" "burrow" "bury" "bust" "bustle" "busy" "butch&u_e;r" = "butcher" "butt" "butt&u_e;r" = "butter" "butt&u_o;n" = "button" "buttonhole" "buzz" "bypass" "cable" "cackle" "cadge" "cage" "cajole" "calculate" "calibrate" "call" "calm" "calve" "camouflage" "camp" "campaign" "can" "cancel" "cane" "canonize" "cant" "cant&u_e;r" = "canter" "canvass" "cap" "cap&u_e;r" = "caper" "capitalize" "capitulate" "capsize" "captain" "captivate" "capture" "care" "career" "caress" "carp" "carp&u_e;t" = "carpet" "carry" "cart" "carve" "cascade" "cash" "castrate" "cat&u_e;r" = "cater" "catal&u_o;g" = "catalog" "catalogue" "categorize" "cause" "caution" "cave" "cavort" "cease" "cede" "celebrate" "cement" "censure" "cent&u_e;r" = "center" "centralize" "centre" "centrifuge" "certify" "chafe" "chain" "chair" "challenge" "chamf&u_e;r" = "chamfer" "champion" "chance" "change" "channel" "chant" "chap" "chaper&u_o;n" = "chaperon" "char" "characterize" "charge" "charm" "chart" "chart&u_e;r" = "charter" "chase" "chat" "chatt&u_e;r" = "chatter" "cheap&u_e;n" = "cheapen" "cheat" "check" "cheer" "cherish" "chew" "chill" "chime" "chip" "chirp" "chis&u_e;l" = "chisel" "choke" "chop" "chortle" "christ&u_e;n" = "christen" "chuck" "chuckle" "circle" "circulate" "circumcise" "circumvent" "cite" "civilize" "clad" "claim" "clamb&u_e;r" = "clamber" "clamp" "clap" "clarify" "clash" "clasp" "class" "classify" "clatt&u_e;r" = "clatter" "claw" "clean" "cleanse" "clear" "clench" "click" "climax" "climb" "clinch" "clink" "clip" "clobb&u_e;r" = "clobber" "clog" "clone" "close" "clot" "clothe" "clout" "clown" "club" "cluck" "clump" "clust&u_e;r" = "cluster" "clutch" "clutt&u_e;r" = "clutter" "co-ordinate" "coach" "coagulate" "coast" "coat" "coax" "cock" "code" "codify" "cohabit" "coil" "coin" "coincide" "col&u_o;r" = "color" "collaborate" "collapse" "collate" "collect" "collide" "colo&u_u;r" = "colour" "colonize" "comb" "combat" "combine" "comfort" "command" "commandeer" "commemorate" "commence" "commend" "comment" "commercialize" "commiserate" "commission" "commit" "commune" "communicate" "commute" "compare" "compel" "compensate" "compete" "compile" "complain" "complement" "complete" "complicate" "compliment" "comply" "compose" "compound" "comprehend" "compress" "comprise" "compromise" "compute" "computerize" "con" "con&qu;&u_e;r" = "conquer" "conceal" "concede" "conceive" "concentrate" "conceptualize" "concern" "concertina" "conclude" "concoct" "concur" "condemn" "condense" "condescend" "condition" "condone" "conduct" "confer" "confess" "confide" "configure" "confine" "confirm" "confiscate" "conflict" "conform" "confound" "confront" "confuse" "congeal" "congest" "congratulate" "congregate" "conjecture" "conjugate" "conjure" "conk" "connect" "connive" "consecrate" "consent" "conserve" "consid&u_e;r" = "consider" "consign" "consist" "console" "consolidate" "conspire" "constitute" "constrain" "constrict" "construct" "construe" "consult" "consume" "consummate" "contact" "contain" "contaminate" "contemplate" "contend" "content" "continue" "contort" "contract" "contradict" "contrast" "contravene" "contribute" "contrive" "control" "convalesce" "convene" "converge" "converse" "convert" "convey" "convict" "convince" "convulse" "coo" "cook" "cool" "coop" "cooperate" "coordinate" "cope" "copulate" "copy" "copyright" "cord&u_o;n" = "cordon" "core" "corn&u_e;r" = "corner" "correct" "correlate" "correspond" "corroborate" "corrode" "corrupt" "coss&u_e;t" = "cosset" "couch" "cough" "counsel" "count" "count&u_e;r" = "counter" "countenance" "counteract" "counterattack" "counterbalance" "counterfeit" "couple" "court" "court-martial" "cov&u_e;r" = "cover" "cov&u_e;t" = "covet" "cow&u_e;r" = "cower" "crack" "crackle" "cradle" "cram" "cramp" "crash" "crate" "crave" "crawl" "creak" "crease" "create" "cred&u_i;t" = "credit" "cremate" "crest" "crib" "crimp" "cringe" "crinkle" "cripple" "crisp" "criticize" "croak" "crook" "crop" "cross" "cross-examine" "crouch" "crow" "crowd" "crown" "crucify" "cruise" "crumble" "crumple" "crunch" "crusade" "crush" "cry" "crystallize" "cube" "cuddle" "cull" "culminate" "cultivate" "curb" "curdle" "cure" "curl" "curry" "curse" "curtail" "curtain" "curtsey" "curve" "cushion" "cycle" "dab" "dabble" "dally" "dam" "damage" "damn" "damp" "damp&u_e;n" = "dampen" "dance" "dangle" "dare" "dark&u_e;n" = "darken" "darn" "dart" "dash" "date" "daub" "daunt" "dawdle" "dawn" "daze" "dazzle" "de-ice" "deactivate" "dead&u_e;n" = "deaden" "deadlock" "deaf&u_e;n" = "deafen" "deb&u_i;t" = "debit" "deb&u_u;t" = "debut" "debar" "debark" "debase" "debate" "decarbonize" "decay" "deceive" "decelerate" "decentralize" "decide" "decimate" "deciph&u_e;r" = "decipher" "declare" "decline" "declutch" "decode" "decompose" "decontaminate" "decorate" "decoy" "decrease" "decree" "dedicate" "deduce" "deduct" "deed" "deem" "deep&u_e;n" = "deepen" "deep-fry" "deface" "default" "defeat" "defect" "defend" "defer" "defile" "define" "deflate" "deflect" "deform" "defraud" "defray" "defrost" "defuse" "defy" "degenerate" "degrade" "dehumidify" "dehydrate" "deign" "delay" "delegate" "delete" "deliberate" "delight" "delim&u_i;t" = "delimit" "deliv&u_e;r" = "deliver" "delouse" "delude" "delve" "demand" "demean" "demobilize" "demolish" "demonstrate" "demoralize" "demote" "demur" "denigrate" "denote" "denounce" "dent" "deny" "depart" "depend" "depict" "deplete" "deplore" "deploy" "deport" "depos&u_i;t" = "deposit" "depose" "deprave" "deprecate" "depreciate" "depress" "deprive" "deputize" "derail" "deride" "derive" "derogate" "descend" "describe" "desecrate" "desert" "deserve" "desiccate" "design" "designate" "desire" "despair" "despatch" "despise" "destabilize" "destine" "destroy" "detach" "detail" "detain" "detect" "deter" "deteriorate" "determine" "detest" "detonate" "detract" "devalue" "devastate" "devel&u_o;p" = "develop" "deviate" "devise" "devolve" "devote" "devour" "diagnose" "dial" "dice" "dictate" "die" "diet" "diff&u_e;r" = "differ" "differentiate" "diffuse" "digest" "digitize" "dignify" "digress" "dilate" "dilute" "dim" "diminish" "dine" "dip" "direct" "dirty" "dis&qu;alify" = "disqualify" "disable" "disagree" "disallow" "disappear" "disappoint" "disapprove" "disarm" "disassemble" "disband" "discard" "discern" "discharge" "discipline" "disclaim" "disclose" "disconcert" "disconnect" "discontinue" "discount" "discourage" "discourse" "discov&u_e;r" = "discover" "discred&u_i;t" = "discredit" "discriminate" "discuss" "disembark" "disembowel" "disengage" "disentangle" "disfavour" "disfigure" "disgorge" "disgrace" "disguise" "disgust" "dish" "disheart&u_e;n" = "dishearten" "disillusion" "disinfect" "disintegrate" "dislike" "dislocate" "dislodge" "dismantle" "dismast" "dismay" "dismiss" "dismount" "disobey" "disord&u_e;r" = "disorder" "disorganize" "disorientate" "disown" "dispatch" "dispel" "dispense" "disperse" "displace" "display" "displease" "dispose" "disprove" "dispute" "disregard" "disrupt" "dissect" "disseminate" "dissipate" "dissociate" "dissolve" "dissuade" "distend" "distil" "distinguish" "distort" "distract" "distress" "distribute" "distrust" "disturb" "ditch" "dith&u_e;r" = "dither" "dive" "diverge" "diversify" "divert" "divest" "divide" "divorce" "divulge" "dock" "doct&u_o;r" = "doctor" "document" "dodge" "dole" "dominate" "don" "donate" "doom" "dope" "dose" "dot" "dote" "double" "doublecross" "doubt" "dovetail" "down" "doze" "draft" "drag" "drain" "drape" "dread" "dredge" "drench" "dress" "dribble" "drift" "drill" "drip" "drip-feed" "drizzle" "drool" "droop" "drop" "drown" "drug" "dry" "duck" "dull" "dump" "dupe" "duplicate" "dust" "dwarf" "dwindle" "dye" "dynamite" "e&qu;al" = "equal" "e&qu;alize" = "equalize" "e&qu;ate" = "equate" "e&qu;ip" = "equip" "earmark" "earth" "ease" "eavesdrop" "ebb" "echo" "eclipse" "economize" "ed&u_i;t" = "edit" "edge" "educate" "effect" "effectuate" "egg" "ejaculate" "eject" "eke" "elaborate" "elapse" "elect" "electrify" "elevate" "elic&u_i;t" = "elicit" "eliminate" "elongate" "elope" "elucidate" "elude" "emanate" "emancipate" "embalm" "embargo" "embark" "embarrass" "embed" "embellish" "embezzle" "embitt&u_e;r" = "embitter" "embody" "emboss" "embrace" "embroid&u_e;r" = "embroider" "emerge" "emigrate" "emit" "emphasise" "emphasize" "employ" "empow&u_e;r" = "empower" "empty" "emulate" "en&qu;ire" = "enquire" "enable" "enact" "enamel" "encapsulate" "encase" "enchant" "encircle" "enclose" "encode" "encompass" "encount&u_e;r" = "encounter" "encourage" "encroach" "encumb&u_e;r" = "encumber" "end" "endang&u_e;r" = "endanger" "endeav&u_o;r" = "endeavor" "endeavour" "endorse" "endow" "endure" "energize" "enforce" "engage" "engend&u_e;r" = "engender" "engineer" "engrave" "engulf" "enhance" "enjoy" "enlarge" "enlight&u_e;n" = "enlighten" "enlist" "enrich" "enrol" "enroll" "enshrine" "enslave" "ensue" "ensure" "ent&u_e;r" = "enter" "entail" "entangle" "entertain" "enthuse" "entice" "entitle" "entrance" "entreat" "entrust" "entwine" "enumerate" "enunciate" "envel&u_o;p" = "envelop" "envisage" "envision" "envy" "epitomize" "eradicate" "erase" "erect" "erode" "err" "erupt" "escalate" "escape" "escort" "establish" "estimate" "ev&u_e;n" = "even" "evacuate" "evade" "evaluate" "evangelize" "evaporate" "evict" "evoke" "evolve" "ex&u_i;t" = "exit" "exacerbate" "exact" "exaggerate" "exalt" "examine" "exasperate" "excavate" "exceed" "excel" "except" "exchange" "excise" "excite" "exclaim" "exclude" "excommunicate" "excuse" "execute" "exemplify" "exempt" "exercise" "exert" "exhale" "exhaust" "exhib&u_i;t" = "exhibit" "exhort" "exile" "exist" "exonerate" "exorcize" "expand" "expatriate" "expect" "expedite" "expel" "expend" "experience" "experiment" "expire" "explain" "explode" "exploit" "explore" "export" "expose" "expound" "express" "expropriate" "extend" "exterminate" "extinguish" "extol" "extort" "extract" "extradite" "extrapolate" "extricate" "extrude" "exude" "exult" "eye" "fabricate" "face" "facilitate" "fade" "fail" "faint" "fake" "falsify" "falt&u_e;r" = "falter" "familiarize" "fan" "fancy" "fare" "farm" "fart" "fascinate" "fashion" "fast" "fast&u_e;n" = "fasten" "fath&u_o;m" = "fathom" "fatigue" "fatt&u_e;n" = "fatten" "fault" "fav&u_o;r" = "favor" "favour" "fawn" "fax" "fear" "feast" "feature" "feign" "fell" "fence" "fend" "ferment" "ferry" "fertilize" "fest&u_e;r" = "fester" "fetch" "fett&u_e;r" = "fetter" "feud" "fiddle" "fidg&u_e;t" = "fidget" "figure" "file" "fill" "fill&u_e;t" = "fillet" "film" "filt&u_e;r" = "filter" "finalize" "finance" "fine" "fing&u_e;r" = "finger" "fingerprint" "finish" "fire" "fish" "fit" "fix" "fizz" "fizzle" "flag" "flake" "flank" "flap" "flare" "flash" "flatt&u_e;n" = "flatten" "flatt&u_e;r" = "flatter" "flaunt" "flav&u_o;r" = "flavor" "flavour" "fleece" "flex" "flick" "flick&u_e;r" = "flicker" "flinch" "flip" "flirt" "flit" "float" "flock" "flog" "flood" "floodlight" "floor" "flop" "flounce" "flound&u_e;r" = "flounder" "flourish" "flout" "flow" "flow&u_e;r" = "flower" "fluctuate" "flunk" "flush" "flutt&u_e;r" = "flutter" "foam" "fob" "focus" "foil" "fold" "follow" "fondle" "fool" "foot" "forage" "force" "ford" "forecast" "forestall" "forewarn" "forfeit" "forge" "fork" "form" "formalize" "format" "formulate" "forsake" "fortify" "forward" "fossilize" "fost&u_e;r" = "foster" "foul" "found" "found&u_e;r" = "founder" "fox" "fracture" "fragment" "frame" "frank" "fraternize" "fray" "fre&qu;ent" = "frequent" "free" "freelance" "freewheel" "fresh" "fresh&u_e;n" = "freshen" "fret" "fright&u_e;n" = "frighten" "fringe" "frisk" "fritt&u_e;r" = "fritter" "frolic" "frost" "frown" "frustrate" "fry" "fulfil" "fulfill" "fumble" "fume" "fumigate" "function" "fund" "furl" "furnish" "furth&u_e;r" = "further" "fuse" "fuze" "gabble" "gag" "gage" "gain" "gainsay" "gall&u_o;p" = "gallop" "gamble" "gang" "gaol" "gape" "garble" "gard&u_e;n" = "garden" "gargle" "garnish" "garris&u_o;n" = "garrison" "gas" "gash" "gasp" "gatecrash" "gath&u_e;r" = "gather" "gauge" "gawp" "gaze" "gear" "generalize" "generate" "germinate" "gesticulate" "gesture" "gibe" "giggle" "gild" "girdle" "gladd&u_e;n" = "gladden" "glance" "glare" "glaze" "gleam" "glide" "glimm&u_e;r" = "glimmer" "glimpse" "glint" "glist&u_e;n" = "glisten" "glitt&u_e;r" = "glitter" "gloat" "globalize" "glorify" "glow" "glow&u_e;r" = "glower" "glue" "glut" "gnaw" "goad" "gobble" "goggle" "gore" "gorge" "gossip" "gouge" "govern" "grab" "grace" "grade" "graduate" "graft" "grant" "grapple" "grasp" "grate" "gratify" "gravitate" "graze" "grease" "greet" "grieve" "grill" "grimace" "grin" "grip" "gripe" "grit" "grizzle" "groan" "groom" "groove" "grope" "ground" "group" "grouse" "grovel" "growl" "grudge" "grumble" "grunt" "guarantee" "guard" "guess" "guffaw" "guide" "gulp" "gum" "gurgle" "gush" "gut" "guzzle" "gyrate" "hack" "haggle" "hail" "halt" "halve" "hamm&u_e;r" = "hammer" "hamp&u_e;r" = "hamper" "hand" "hand-luggage" "handicap" "handle" "hank&u_e;r" = "hanker" "happ&u_e;n" = "happen" "harass" "harb&u_o;r" = "harbor" "harbour" "hard&u_e;n" = "harden" "harm" "harmonize" "harness" "harp" "harvest" "hast&u_e;n" = "hasten" "hatch" "hate" "haul" "haunt" "hazard" "head" "head-rest" "heal" "heap" "heat" "heave" "heckle" "hedge" "heed" "heel" "height&u_e;n" = "heighten" "help" "hem" "herald" "herd" "hesitate" "hew" "hibernate" "hiccough" "highjack" "highlight" "hijack" "hike" "hind&u_e;r" = "hinder" "hinge" "hint" "hire" "hiss" "hitch" "hitch-hike" "hoard" "hoax" "hobble" "hoe" "hog" "hoist" "hole" "hollow" "hon&u_o;r" = "honor" "hone" "honk" "honour" "hoodwink" "hook" "hoot" "hop" "hope" "horrify" "hospitalize" "hound" "house" "hov&u_e;r" = "hover" "howl" "huddle" "hug" "hum" "hum&u_o;r" = "humor" "humble" "humidify" "humiliate" "humour" "hung&u_e;r" = "hunger" "hunt" "hurl" "hurry" "hurtle" "hush" "hustle" "hypnotize" "hypothesize" "ice" "identify" "idle" "idolize" "ignite" "ignore" "ill-treat" "illuminate" "illustrate" "imagine" "imbed" "imbue" "imitate" "immerse" "immigrate" "immobilize" "immortalize" "immunize" "impair" "impale" "impart" "impeach" "impede" "impel" "imperil" "impersonate" "impinge" "implant" "implement" "implicate" "implore" "imply" "import" "impose" "impound" "impregnate" "impress" "imprint" "impris&u_o;n" = "imprison" "improve" "improvise" "in&qu;ire" = "inquire" "inaugurate" "incapacitate" "incarcerate" "incense" "incite" "incline" "include" "inconvenience" "incorporate" "increase" "incriminate" "incur" "indemnify" "indent" "index" "indicate" "indict" "individualize" "indoctrinate" "induce" "induct" "indulge" "industrialize" "infect" "infer" "infest" "infiltrate" "inflame" "inflate" "inflect" "inflict" "influence" "inform" "infringe" "infuriate" "ingratiate" "inhab&u_i;t" = "inhabit" "inhale" "inher&u_i;t" = "inherit" "inhib&u_i;t" = "inhibit" "initial" "initialize" "initiate" "inject" "injure" "innovate" "inscribe" "insert" "insinuate" "insist" "inspect" "inspire" "instal" "install" "instantiate" "instigate" "instil" "institute" "instruct" "insulate" "insult" "insure" "integrate" "intend" "intensify" "inter" "interact" "intercede" "intercept" "interchange" "interconnect" "interest" "interface" "interfere" "interject" "interlock" "intermarry" "intern" "interpolate" "interpr&u_e;t" = "interpret" "interrelate" "interrogate" "interrupt" "intersect" "intersperse" "intertwine" "intervene" "interview" "intimate" "intimidate" "intoxicate" "intrigue" "introduce" "intrude" "inundate" "invade" "invalidate" "invent" "inventory" "invert" "invest" "investigate" "invite" "invoice" "invoke" "involve" "ionize" "ir&u_o;n" = "iron" "irk" "irradiate" "irrigate" "irritate" "isolate" "issue" "italicize" "itch" "itemize" "iterate" "jab" "jabb&u_e;r" = "jabber" "jack-knife" "jail" "jam" "jangle" "jar" "jazz" "jeer" "jeopardize" "jerk" "jet" "jettis&u_o;n" = "jettison" "jib" "jilt" "jingle" "jockey" "jog" "join" "joke" "jolt" "jostle" "jot" "journey" "judge" "juggle" "jumble" "jump" "junk" "justify" "jut" "juxtapose" "kick" "kick-off" "kid" "kidnap" "kill" "kindle" "kink" "kiss" "knead" "knife" "knit" "knock" "knot" "lab&u_o;r" = "labor" "label" "labour" "lace" "lack" "ladd&u_e;r" = "ladder" "lag" "lamb" "lament" "laminate" "lance" "land" "landscape" "languish" "lap" "lapse" "lark" "lash" "lasso" "last" "latch" "lath&u_e;r" = "lather" "laugh" "launch" "laund&u_e;r" = "launder" "lavish" "lay-by" "laze" "leak" "lean-to" "leap" "lease" "lecture" "leer" "legalize" "legislate" "length&u_e;n" = "lengthen" "less&u_e;n" = "lessen" "lev&u_e;r" = "lever" "level" "levy" "li&qu;efy" = "liquefy" "li&qu;idate" = "liquidate" "li&qu;idize" = "liquidize" "li&qu;ify" = "liquify" "libel" "liberalize" "liberate" "license" "lick" "lift" "light&u_e;n" = "lighten" "lik&u_e;n" = "liken" "like" "lim&u_i;t" = "limit" "limb&u_e;r" = "limber" "limp" "line" "linearize" "ling&u_e;r" = "linger" "link" "lipread" "list" "list&u_e;n" = "listen" "litigate" "litt&u_e;r" = "litter" "live" "load" "loaf" "loan" "loathe" "lobby" "localize" "locate" "lock" "lodge" "log" "loit&u_e;r" = "loiter" "loll" "long" "look" "loom" "loop" "loos&u_e;n" = "loosen" "loot" "lop" "lounge" "love" "low" "low&u_e;r" = "lower" "lubricate" "lug" "lull" "lump" "lunge" "lurch" "lure" "lurk" "lust" "lynch" "machine" "madd&u_e;n" = "madden" "magnetize" "magnify" "mail" "maim" "maintain" "malfunction" "malign" "maltreat" "man" "manage" "mandate" "maneuv&u_e;r" = "maneuver" "mangle" "manhandle" "manicure" "manifest" "manipulate" "manoeuvre" "manufacture" "map" "mar" "march" "mark" "mark&u_e;t" = "market" "maroon" "marry" "marshal" "martyr" "marvel" "mas&qu;erade" = "masquerade" "mash" "mask" "mass" "mass-produce" "massacre" "massage" "mast&u_e;r" = "master" "mastermind" "masturbate" "match" "mate" "materialize" "matt&u_e;r" = "matter" "mature" "maul" "maximize" "may" "meand&u_e;r" = "meander" "measure" "mechanize" "meddle" "mediate" "medicate" "meditate" "mellow" "melt" "memorize" "menace" "mend" "menstruate" "mention" "mer&u_i;t" = "merit" "merchandise" "merge" "mesh" "mesmerize" "mess" "met&u_e;r" = "meter" "metal" "mete" "metre" "mew" "miaow" "microfilm" "might" "migrate" "militarize" "militate" "milk" "mill" "mime" "mimic" "mince" "mind" "mine" "mingle" "minimize" "minist&u_e;r" = "minister" "mint" "mirr&u_o;r" = "mirror" "misappropriate" "misbehave" "miscalculate" "misconduct" "misconstrue" "miscount" "misdirect" "misfire" "mishandle" "misinform" "misinterpr&u_e;t" = "misinterpret" "misjudge" "mislead" "mismanage" "misplace" "mispronounce" "misread" "misrepresent" "miss" "misspell" "mist" "mistreat" "mistrust" "misuse" "mitigate" "mix" "moan" "mob" "mobilize" "mock" "model" "moderate" "modernize" "modify" "modulate" "moist&u_e;n" = "moisten" "moisturize" "mold" "molest" "mollycoddle" "molt" "monit&u_o;r" = "monitor" "monopolize" "moo" "moor" "moot" "mop" "mope" "moralize" "mortgage" "moth&u_e;r" = "mother" "mothproof" "motion" "motivate" "mould" "mould&u_e;r" = "moulder" "moult" "mount" "mourn" "move" "muck" "muddle" "muffle" "mug" "mull" "multiply" "mumble" "munch" "murd&u_e;r" = "murder" "murm&u_u;r" = "murmur" "muscle" "muse" "mushroom" "must&u_e;r" = "muster" "mutate" "mutilate" "mutiny" "mutt&u_e;r" = "mutter" "muzzle" "mystify" "nab" "nag" "nail" "name" "nark" "narrate" "narrow" "nationalize" "natt&u_e;r" = "natter" "naturalize" "nauseate" "navigate" "near" "necessitate" "need" "needle" "negate" "neglect" "negotiate" "nest" "nestle" "net" "neut&u_e;r" = "neuter" "neutralize" "nibble" "nick" "nickname" "nip" "nod" "nominate" "normalize" "notarize" "notch" "note" "notice" "notify" "nourish" "nudge" "nullify" "numb" "numb&u_e;r" = "number" "nurse" "nurture" "obey" "object" "obligate" "oblige" "obliterate" "obscure" "observe" "obsess" "obstruct" "obtain" "obviate" "occasion" "occupy" "occur" "off&u_e;r" = "offer" "offend" "officiate" "ogle" "oil" "okay" "omit" "ooze" "op&u_e;n" = "open" "operate" "oppose" "oppress" "opt" "optimize" "orb&u_i;t" = "orbit" "orchestrate" "ord&u_e;r" = "order" "ordain" "organize" "orient" "orientate" "originate" "ornament" "orph&u_a;n" = "orphan" "oscillate" "ostracize" "oust" "outclass" "outdo" "outfit" "outlast" "outlaw" "outline" "outlive" "outnumb&u_e;r" = "outnumber" "outrage" "outsmart" "outstay" "outweigh" "outwit" "overact" "overawe" "overbalance" "overcharge" "overcrowd" "overdo" "overemphasize" "overestimate" "overexpose" "overflow" "overhaul" "overheat" "overlap" "overload" "overlook" "overpow&u_e;r" = "overpower" "overrate" "overreach" "overreact" "overrule" "overshadow" "oversimplify" "overstate" "overturn" "overwhelm" "overwork" "owe" "own" "oxidize" "pace" "pacify" "pack" "package" "pad" "paddle" "padlock" "page" "paint" "pall" "palm" "pamp&u_e;r" = "pamper" "pan" "pand&u_e;r" = "pander" "panic" "pant" "pap&u_e;r" = "paper" "parachute" "parade" "parallel" "paralyze" "paraphrase" "parcel" "parch" "pard&u_o;n" = "pardon" "pare" "park" "parry" "parse" "part" "participate" "partition" "partn&u_e;r" = "partner" "pass" "paste" "pat" "patch" "patent" "patrol" "patronize" "patt&u_e;r" = "patter" "pause" "pave" "paw" "pawn" "peck" "pedal" "peddle" "peek" "peel" "peep" "peer" "peg" "pelt" "penalize" "pencil" "penetrate" "people" "pep" "pepp&u_e;r" = "pepper" "perceive" "perch" "percolate" "perfect" "perforate" "perform" "perfume" "perish" "perjure" "perk" "permeate" "permit" "perpetrate" "perpetuate" "perplex" "persecute" "persevere" "persist" "personify" "perspire" "persuade" "pertain" "perturb" "pervade" "pest&u_e;r" = "pester" "pet" "petition" "petrify" "phase" "phone" "photocopy" "photograph" "phrase" "pick" "pick&u_e;t" = "picket" "pickle" "picnic" "picture" "piece" "pierce" "pil&u_o;t" = "pilot" "pile" "pilf&u_e;r" = "pilfer" "pillage" "pillory" "pin" "pinch" "pine" "pinpoint" "pioneer" "pipe" "pirate" "pirouette" "pit" "pitch" "pity" "piv&u_o;t" = "pivot" "placate" "place" "plagiarize" "plait" "plan" "plane" "plant" "plast&u_e;r" = "plaster" "play" "play-off" "plead" "please" "pledge" "plod" "plonk" "plot" "plough" "plow" "pluck" "plug" "plumb" "plumm&u_e;t" = "plummet" "plump" "plund&u_e;r" = "plunder" "plunge" "ply" "poach" "pock&u_e;t" = "pocket" "pod" "point" "pois&u_o;n" = "poison" "poise" "poke" "polarize" "police" "polish" "poll" "pollute" "pond&u_e;r" = "ponder" "pontificate" "pooh-pooh" "pool" "pop" "popularize" "populate" "pore" "portend" "portray" "pose" "position" "possess" "post" "postdate" "postmark" "postpone" "postulate" "posture" "pot" "pott&u_e;r" = "potter" "pounce" "pound" "pour" "pout" "pow&u_e;r" = "power" "powd&u_e;r" = "powder" "practice" "practise" "praise" "prance" "prattle" "pray" "pre-empt" "preach" "prearrange" "precede" "precipitate" "preclude" "predetermine" "predict" "predominate" "preempt" "preen" "prefer" "prefix" "prejudge" "prejudice" "preoccupy" "prepare" "prescribe" "present" "preserve" "preside" "press" "press-gang" "pressurize" "presume" "presuppose" "pretend" "prevail" "prevent" "preview" "prey" "price" "prick" "pride" "prime" "print" "prioritize" "prise" "privatize" "prize" "probe" "proceed" "process" "proclaim" "procure" "prod" "produce" "prof&u_i;t" = "profit" "profess" "profile" "program" "programme" "progress" "prohib&u_i;t" = "prohibit" "project" "proliferate" "prolong" "promise" "promote" "prompt" "promulgate" "pronounce" "proof" "proofread" "prop" "propagate" "propel" "prophesy" "proportion" "propose" "propound" "prosecute" "prosp&u_e;r" = "prosper" "prospect" "protect" "protest" "protrude" "provide" "provoke" "prowl" "prune" "pry" "psychoanalyse" "publicize" "publish" "puck&u_e;r" = "pucker" "puff" "pull" "pulsate" "pulverize" "pummel" "pump" "punch" "punctuate" "puncture" "punish" "purchase" "purge" "purify" "purl" "purport" "purr" "purse" "pursue" "push" "putt" "puzzle" "race" "rack" "radiate" "radio" "rag" "rage" "raid" "rain" "raise" "rake" "rally" "ram" "ramble" "rampage" "range" "rank" "rankle" "rans&u_o;m" = "ransom" "ransack" "rant" "rap" "rape" "rate" "ratify" "ration" "rationalize" "rattle" "ravage" "rave" "ravish" "raze" "re&qu;est" = "request" "re&qu;ire" = "require" "re&qu;isition" = "requisition" "re-count" "re-cov&u_e;r" = "re-cover" "re-engage" "re-ent&u_e;r" = "re-enter" "reach" "react" "reactivate" "readjust" "reaffirm" "realign" "realize" "reap" "reappear" "reapply" "rear" "rearm" "rearrange" "reas&u_o;n" = "reason" "reassemble" "reassert" "reassess" "reassign" "reassure" "rebate" "rebel" "rebound" "rebuff" "rebuild" "rebuke" "rebut" "recalculate" "recall" "recant" "recap" "recapture" "recede" "receive" "recharge" "recheck" "reciprocate" "recite" "reck&u_o;n" = "reckon" "reclaim" "reclassify" "recline" "recognize" "recoil" "recollect" "recommend" "recompense" "reconcile" "recondition" "reconfirm" "reconnect" "reconnoit&u_e;r" = "reconnoiter" "reconnoitre" "reconsid&u_e;r" = "reconsider" "reconstitute" "reconstruct" "record" "recount" "recoup" "recov&u_e;r" = "recover" "recreate" "recruit" "rectify" "recuperate" "recur" "recycle" "redd&u_e;n" = "redden" "redecorate" "redeem" "redefine" "redeploy" "redesign" "redevel&u_o;p" = "redevelop" "redirect" "rediscov&u_e;r" = "rediscover" "redistribute" "redo" "redouble" "redress" "reduce" "reek" "reel" "reexamine" "refer" "referee" "refill" "refine" "reflect" "reform" "refrain" "refresh" "refrigerate" "refuel" "refund" "refurbish" "refurnish" "refuse" "refute" "regain" "regard" "regenerate" "regist&u_e;r" = "register" "regress" "regret" "regroup" "regulate" "rehabilitate" "rehash" "rehearse" "reheat" "reign" "reimburse" "reimpose" "reinforce" "reinstate" "reintroduce" "reinvest" "reissue" "reiterate" "reject" "rejoice" "rejuvenate" "rekindle" "relapse" "relate" "relax" "relay" "release" "relegate" "relent" "relieve" "relin&qu;ish" = "relinquish" "reline" "relish" "relive" "reload" "relocate" "rely" "remain" "remand" "remark" "remarry" "remedy" "rememb&u_e;r" = "remember" "remind" "reminisce" "remit" "remodel" "remove" "rename" "rend&u_e;r" = "render" "rendez-vous" "rendezvous" "renegotiate" "renew" "renounce" "renovate" "rent" "reop&u_e;n" = "reopen" "reord&u_e;r" = "reorder" "reorganize" "reorient" "repack" "repair" "repeal" "repeat" "repel" "repent" "replace" "replant" "replay" "replenish" "reply" "report" "represent" "repress" "reprieve" "reprimand" "reprint" "reproach" "reprocess" "reproduce" "reprogram" "reprove" "repudiate" "repulse" "repute" "reroute" "reschedule" "rescind" "rescue" "research" "resemble" "resent" "reserve" "reshape" "reside" "resign" "resist" "resolve" "resonate" "resort" "resound" "respect" "respond" "rest" "restart" "restate" "restock" "restoration" "restore" "restrain" "restrict" "restructure" "result" "resume" "resurrect" "resuscitate" "retail" "retain" "retaliate" "retard" "retch" "retire" "retort" "retrace" "retract" "retrain" "retread" "retreat" "retrieve" "return" "reunite" "rev" "revamp" "reveal" "revel" "revenge" "reverberate" "revere" "reverse" "revert" "review" "revise" "revitalize" "revive" "revoke" "revolt" "revolutionize" "revolve" "reward" "rewind" "rewire" "reword" "rework" "rhyme" "rib" "ricoch&u_e;t" = "ricochet" "riddle" "ridicule" "rifle" "rig" "rig-out" "right" "rile" "rinse" "riot" "rip" "rip&u_e;n" = "ripen" "ripple" "risk" "riv&u_e;t" = "rivet" "rival" "roam" "roar" "roast" "rob" "robe" "rock" "roll" "roll-off" "romance" "romp" "roof" "rook" "roost" "root" "rope" "rot" "rotate" "rough" "rough&u_e;n" = "roughen" "round" "rouse" "rout" "row" "rub" "rubber-stamp" "rue" "ruffle" "ruin" "rule" "rumble" "rummage" "rumour" "rumple" "run-through" "rupture" "rush" "rust" "rustle" "s&qu;abble" = "squabble" "s&qu;all" = "squall" "s&qu;and&u_e;r" = "squander" "s&qu;are" = "square" "s&qu;ash" = "squash" "s&qu;at" = "squat" "s&qu;awk" = "squawk" "s&qu;eak" = "squeak" "s&qu;eal" = "squeal" "s&qu;eeze" = "squeeze" "s&qu;elch" = "squelch" "s&qu;int" = "squint" "s&qu;irm" = "squirm" "s&qu;irt" = "squirt" "sabotage" "sack" "sacrifice" "sadd&u_e;n" = "sadden" "saddle" "safeguard" "sag" "sail" "salt" "salute" "salvage" "sample" "sanctify" "sanction" "sand" "sandwich" "sap" "satiate" "satire" "satisfy" "saturate" "saunt&u_e;r" = "saunter" "sav&u_o;r" = "savor" "savage" "save" "savour" "scald" "scale" "scalp" "scamp" "scamp&u_e;r" = "scamper" "scan" "scandalize" "scar" "scare" "scatt&u_e;r" = "scatter" "scent" "schedule" "scheme" "school" "scoff" "scold" "scoop" "scorch" "score" "scorn" "scotch" "scour" "scout" "scowl" "scram" "scramble" "scrap" "scrape" "scratch" "scrawl" "scream" "screech" "screen" "screw" "scribble" "scrounge" "scrub" "scrutinize" "scuff" "sculpture" "scurry" "scuttle" "seal" "sear" "search" "seas&u_o;n" = "season" "seat" "secede" "seclude" "second" "secrete" "section" "secure" "sedate" "seduce" "seem" "seep" "seethe" "segment" "segregate" "seize" "select" "sense" "sentence" "separate" "serenade" "serialize" "serve" "service" "settle" "sev&u_e;r" = "sever" "shackle" "shade" "shadow" "sham" "shame" "shampoo" "shape" "share" "sharp&u_e;n" = "sharpen" "shatt&u_e;r" = "shatter" "shave" "sheathe" "shell" "shelt&u_e;r" = "shelter" "shelve" "shepherd" "shield" "shift" "shilly-shally" "shimm&u_e;r" = "shimmer" "shingle" "ship" "shirk" "shiv&u_e;r" = "shiver" "shock" "shop" "shore" "short&u_e;n" = "shorten" "short-circuit" "should&u_e;r" = "shoulder" "shout" "shove" "shovel" "show&u_e;r" = "shower" "shred" "shriek" "shrivel" "shroud" "shrug" "shudd&u_e;r" = "shudder" "shuffle" "shun" "shunt" "shuttle" "sick&u_e;n" = "sicken" "side" "sidetrack" "sidle" "sieve" "sift" "sigh" "sight" "sign" "signal" "signify" "silence" "silhouette" "simm&u_e;r" = "simmer" "simple" "simplify" "simulate" "sin" "singe" "single" "sip" "siph&u_o;n" = "siphon" "site" "situate" "size" "sizzle" "skate" "sketch" "ski" "skid" "skim" "skimp" "skin" "skip" "skipp&u_e;r" = "skipper" "skirmish" "skirt" "skive" "skulk" "slack" "slack&u_e;n" = "slacken" "slam" "sland&u_e;r" = "slander" "slant" "slap" "slash" "slate" "slaught&u_e;r" = "slaughter" "slave" "slice" "slight" "slim" "slip" "slith&u_e;r" = "slither" "slog" "slop" "slope" "slot" "slouch" "slow" "slug" "slump" "slur" "smack" "smart" "smash" "smear" "smile" "smoke" "smold&u_e;r" = "smolder" "smooth" "smoth&u_e;r" = "smother" "smould&u_e;r" = "smoulder" "smudge" "smuggle" "snag" "snap" "snare" "snarl" "snatch" "sneak" "sneer" "sneeze" "sniff" "snigg&u_e;r" = "snigger" "snip" "snoop" "snooze" "snore" "snort" "snow" "snub" "soak" "soar" "sob" "sob&u_e;r" = "sober" "socialize" "sock" "soft&u_e;n" = "soften" "soil" "sojourn" "solace" "sold&u_e;r" = "solder" "solic&u_i;t" = "solicit" "solidify" "solve" "somersault" "soothe" "sophisticate" "sort" "sound" "soundproof" "sour" "space" "span" "spank" "spare" "spark" "sparkle" "spatt&u_e;r" = "spatter" "spawn" "spear" "specialize" "specify" "speculate" "speed" "spew" "spice" "spill" "spin-dry" "spiral" "spite" "spitroast" "splash" "splice" "splint&u_e;r" = "splinter" "splutt&u_e;r" = "splutter" "sponge" "spons&u_o;r" = "sponsor" "spoon-feed" "sport" "spot" "spot-check" "spotlight" "spout" "sprain" "sprawl" "spray" "spring-clean" "sprinkle" "sprint" "sprout" "spur" "spurn" "spurt" "sputt&u_e;r" = "sputter" "spy" "stab" "stabilize" "stack" "staff" "stage" "stagg&u_e;r" = "stagger" "stagnate" "stain" "stake" "stalk" "stall" "stamm&u_e;r" = "stammer" "stamp" "stampede" "standardize" "staple" "star" "stare" "start" "startle" "starve" "state" "station" "staunch" "stave" "stay" "steady" "steam" "steep" "steer" "stem" "stencil" "step" "stereotype" "sterilize" "stew" "stiff&u_e;n" = "stiffen" "stifle" "stimulate" "stint" "stipulate" "stir" "stitch" "stock" "stockpile" "stoke" "stomach" "stone" "stoop" "stop" "stop-press" "store" "storm" "stow" "straddle" "strafe" "straggle" "straight&u_e;n" = "straighten" "strain" "strand" "strangle" "strap" "stratify" "stray" "streak" "stream" "streamline" "strength&u_e;n" = "strengthen" "stress" "stretch" "strew" "strip" "stripe" "stroke" "stroll" "struggle" "strum" "strut" "stub" "stud" "study" "stuff" "stumble" "stump" "stun" "stunt" "stupefy" "stutt&u_e;r" = "stutter" "subcategorize" "subcontract" "subdivide" "subdue" "subject" "submerge" "submerse" "submit" "subordinate" "suborn" "subpoena" "subrogate" "subscribe" "subside" "subsidize" "substantiate" "substitute" "subsume" "subtract" "succeed" "succumb" "suck" "suckle" "sue" "suff&u_e;r" = "suffer" "suffice" "suffix" "suffocate" "suffuse" "sug&u_a;r" = "sugar" "suggest" "suit" "sulk" "sum" "summ&u_o;n" = "summon" "summarize" "summons" "sunbathe" "superimpose" "supersede" "supervise" "supplant" "supplement" "supply" "support" "suppose" "suppress" "surcharge" "surface" "surge" "surmise" "surmount" "surpass" "surprise" "surrend&u_e;r" = "surrender" "surround" "survey" "survive" "suspect" "suspend" "sustain" "swab" "swagg&u_e;r" = "swagger" "swallow" "swamp" "swap" "swarm" "swat" "sway" "sweat" "sweet&u_e;n" = "sweeten" "swerve" "swill" "swindle" "swipe" "swirl" "swish" "switch" "swivel" "swoon" "swoop" "swop" "swot" "symbolize" "sympathize" "synchronize" "synthesize" "syph&u_o;n" = "syphon" "systematize" "table" "tabulate" "tack" "tackle" "tag" "tail" "tail&u_o;r" = "tailor" "taint" "talk" "tally" "tame" "tamp&u_e;r" = "tamper" "tan" "tangle" "tap" "tap&u_e;r" = "taper" "tape" "targ&u_e;t" = "target" "tarmac" "tarnish" "taste" "tattoo" "taunt" "tax" "taxi" "tease" "tee" "teem" "teet&u_e;r" = "teeter" "teethe" "telegraph" "telephone" "telescope" "televise" "temp&u_e;r" = "temper" "temporize" "tempt" "tend" "tend&u_e;r" = "tender" "tenderize" "term" "terminate" "terrify" "terrorize" "test" "testify" "teth&u_e;r" = "tether" "thank" "thaw" "theorize" "thick&u_e;n" = "thicken" "thieve" "thin" "thrash" "thread" "threat&u_e;n" = "threaten" "thresh" "thrill" "throb" "throttle" "thumb" "thump" "thund&u_e;r" = "thunder" "thwart" "tick" "tickle" "tidy" "tie" "tight&u_e;n" = "tighten" "till" "tilt" "time" "tin" "tinge" "tingle" "tink&u_e;r" = "tinker" "tinkle" "tint" "tip" "tipple" "tire" "titillate" "titt&u_e;r" = "titter" "toady" "toast" "toil" "tolerate" "toll" "tone" "tool" "toot" "top" "topple" "torment" "torpedo" "torture" "toss" "total" "tott&u_e;r" = "totter" "touch" "tough&u_e;n" = "toughen" "tour" "tout" "tow" "tow&u_e;r" = "tower" "toy" "trace" "track" "trade" "traffic" "trail" "train" "traipse" "tramp" "trample" "tran&qu;ilize" = "tranquilize" "transact" "transcend" "transcribe" "transfer" "transfigure" "transform" "translate" "transmit" "transpire" "transplant" "transport" "transpose" "transship" "trap" "travel" "traverse" "treasure" "treat" "treble" "trek" "tremble" "trespass" "trick" "trickle" "trifle" "trigg&u_e;r" = "trigger" "trim" "trip" "triple" "triumph" "troop" "trot" "trouble" "trounce" "truck" "trudge" "trump&u_e;t" = "trumpet" "trundle" "truss" "trust" "try" "tuck" "tug" "tumble" "tune" "tunnel" "turf" "turn" "tut&u_o;r" = "tutor" "twang" "twig" "twin" "twine" "twinkle" "twirl" "twist" "twitch" "type" "typify" "tyre" "umpire" "unable" "unburd&u_e;n" = "unburden" "unbutt&u_o;n" = "unbutton" "uncoil" "uncork" "uncov&u_e;r" = "uncover" "underestimate" "underlie" "underline" "undermine" "underpin" "underplay" "underprice" "underrate" "underscore" "undress" "unearth" "unfast&u_e;n" = "unfasten" "unfold" "unhook" "unify" "unite" "unleash" "unload" "unlock" "unmask" "unnerve" "unpack" "unplug" "unravel" "unroll" "unscrew" "unsettle" "untangle" "untie" "unveil" "unwind" "unwrap" "unzip" "update" "upend" "upgrade" "uphold" "uplift" "uproot" "upturn" "urbanize" "urge" "urinate" "use" "usurp" "utilize" "utt&u_e;r" = "utter" "vacate" "vaccinate" "validate" "value" "vandalize" "vanish" "vaporize" "varnish" "vary" "vault" "veer" "vegetate" "veil" "vend" "vent" "ventilate" "venture" "verbalize" "verge" "verify" "vest" "vet" "veto" "vex" "vibrate" "victimize" "vie" "view" "vilify" "vindicate" "violate" "vis&u_i;t" = "visit" "visualize" "vitiate" "voice" "void" "volley" "volunteer" "vom&u_i;t" = "vomit" "vote" "vouch" "vow" "wad" "wade" "waffle" "waft" "wag" "wage" "waggle" "wail" "wait" "waive" "wak&u_e;n" = "waken" "walk" "wall&u_o;p" = "wallop" "wallow" "wallpap&u_e;r" = "wallpaper" "waltz" "wand&u_e;r" = "wander" "wane" "wangle" "want" "ward" "warm" "warn" "warp" "warrant" "wash" "waste" "wat&u_e;r" = "water" "watch" "water-ski" "wav&u_e;r" = "waver" "wave" "wax" "waylay" "weak&u_e;n" = "weaken" "wean" "weary" "weath&u_e;r" = "weather" "wedge" "weed" "weigh" "welcome" "weld" "westernize" "wet" "whack" "wheel" "wheeze" "whet" "whimp&u_e;r" = "whimper" "whine" "whip" "whirl" "whirr" "whisk" "whisp&u_e;r" = "whisper" "whistle" "whit&u_e;n" = "whiten" "whitewash" "whittle" "whiz" "whizz" "wid&u_e;n" = "widen" "wield" "wiggle" "will" "wilt" "wince" "winch" "wink" "wint&u_e;r" = "winter" "wipe" "wire" "wish" "wit" "with&u_e;r" = "wither" "withdraw" "withhold" "witness" "wobble" "wond&u_e;r" = "wonder" "woo" "word" "work" "worry" "wors&u_e;n" = "worsen" "worship" "wound" "wrangle" "wrap" "wreck" "wrench" "wrestle" "wriggle" "wrinkle" "writhe" "wrong" "x-ray" "yacht" "yank" "yap" "yawn" "yearn" "yell" "yelp" "yield" "yodel" "zigzag" "zip" "zoom" V[ vfm=bse typ=v r=i1 ] "mow" "prove" "saw" "sew" "show" "slay" "sow" "swell" V[ vfm=bse typ=v r=i2 ] "&qu;it" = "quit" "arise" "awake" "bear" "beat" "become" "beget" "begin" "behold" "bend" "beseech" "beset" "bet" "bid" "bind" "bite" "bleed" "blow" "break" "breed" "bring" "broadcast" "browbeat" "build" "burst" "buy" "cast" "catch" "choose" "clear-cut" "cling" "come" "cost" "countersink" "creep" "cut" "deal" "deep-freeze" "dig" "draw" "drink" "drive" "dwell" "eat" "fall" "feed" "feel" "fight" "find" "flee" "fling" "fly" "forbid" "foreg&y_o;" = "forego" "foresake" "foresee" "foretell" "forget" "forgive" "freeze" "g&y_o;" = "go" "get" "give" "grind" "grow" "hear" "hide" "hit" "hold" "hurt" "keep" "know" "lay" "lead" "leave" "lend" "let" "lie" "light" "lose" "make" "mean" "meet" "mishear" "mislay" "mistake" "misunderstand" "offset" "outgrow" "overcome" "overhear" "overlay" "override" "overrun" "oversee" "overshoot" "oversleep" "overtake" "overthrow" "partake" "pay" "put" "read" "rend" "repay" "rer&u_u;n" = "rerun" "resell" "rethink" "rewrite" "rid" "ride" "ring" "rise" "run" "say" "see" "seek" "sell" "send" "shake" "shed" "shoe" "shoot" "shrink" "shut" "sing" "sink" "sit" "sleep" "slide" "sling" "speak" "spend" "spin" "split" "spread" "spring" "stand" "steal" "stick" "sting" "stink" "stride" "strike" "strive" "sublet" "swear" "sweep" "swim" "swing" "take" "teach" "tear" "tell" "think" "throw" "thrust" "tread" "unbend" "undercut" "underg&y_o;" = "undergo" "understand" "undertake" "underwrite" "undo" "upset" "wake" "wear" "weave" "weep" "win" "withstand" "wring" "write" V[ vfm=bse typ=v r=i3 ] "burn" "daydream" "dream" "earn" "kneel" "lean" "learn" "smell" "spell" "spoil" "thrive" V[ vfm=bse typ=v r=r|i2 ] "hang" "shine" "slit" "spit" "wind" V[ vfm=bse typ=v r=r|i3 ] "shear" V[ vfm=past|psp typ=v ] "&qu;it" = "quit" "baby-sat" = "baby-sit" "beheld" = "behold" "bent" = "bend" "beset" "besought" = "beseech" "bet" "bled" = "bleed" "bought" = "buy" "bound" = "bind" "bred" = "breed" "broadcast" "brought" = "bring" "built" = "build" "burnt" = "burn" "burst" "cast" "caught" = "catch" "clear-cut" "clung" = "cling" "cost" "crept" = "creep" "cut" "daydreamt" = "dream" "dealt" = "deal" "dreamt" = "dream" "dug" = "dig" "dwelt" = "dwell" "earnt" = "earn" "fed" = "feed" "felt" = "feel" "fled" = "flee" "flung" = "fling" "forecast" "foretold" = "foretell" "fought" = "fight" "gainsaid" = "gainsay" "got" = "get" "ground" = "grind" "heard" = "hear" "held" = "hold" "hit" "hung" = "hang" "hurt" "kept" = "keep" "knelt" = "kneel" "laid" = "lay" "leant" = "lean" "learnt" = "learn" "led" = "lead" "left" = "leave" "lent" = "lend" "let" "lipread" "lit" = "light" "lost" = "lose" "made" = "make" "meant" = "mean" "met" = "meet" "misheard" = "mishear" "mislaid" = "mislay" "misread" "misspelt" = "misspell" "misunderstood" = "misunderstand" "offset" "overheard" = "overhear" "overlaid" = "overlay" "overshot" = "overshoot" "overslept" = "oversleep" "paid" = "pay" "proofread" "put" "read" "rebuilt" = "rebuild" "rent" = "rend" "repaid" = "repay" "resold" = "resell" "rethought" = "rethink" "rewound" = "rewind" "rid" "said" = "say" "sat" = "sit" "sent" = "send" "shed" "shod" = "shoe" "shone" = "shine" "shot" = "shoot" "shut" "slept" = "sleep" "slid" = "slide" "slung" = "sling" "smelt" = "smell" "sold" = "sell" "sought" = "seek" "spat" = "spit" "spelt" = "spell" "spent" = "spend" "split" "spoilt" = "spoil" "spoon-fed" = "spoon-feed" "spotlit" = "spotlight" "spread" "stood" = "stand" "struck" = "strike" "stuck" = "stick" "stung" = "sting" "sublet" "swept" = "sweep" "taught" = "teach" "thought" = "think" "thrust" "told" = "tell" "unbent" = "unbend" "undercut" "understood" = "understand" "unwound" = "unwind" "upheld" = "uphold" "upset" "wed" "wept" = "weep" "withheld" = "withhold" "withstood" = "withstand" "wound" = "wind" "wrung" = "wring" V[ vfm=prp typ=a ] "being" = "be" "doing" = "do" "having" = "have" V[ vfm=psp typ=a ] "been" = "be" "done" = "do" V[ vfm=psp typ=v ] "arisen" = "arise" "awoken" = "awake" "beaten" = "beat" "become" "befallen" = "befall" "begotten" = "beget" "begun" = "begin" "bidden" = "bid" "bitten" = "bite" "blown" = "blow" "borne" = "bear" "broken" = "break" "browbeaten" = "browbeat" "chosen" = "choose" "come" "countersunk" = "countersink" "deep-frozen" = "deep-freeze" "drawn" = "draw" "driven" = "drive" "drunk" = "drink" "eaten" = "eat" "fallen" = "fall" "flown" = "fly" "forbidden" = "forbid" "foregone" = "forego" "foresaken" = "foresake" "foreseen" = "foresee" "forgiven" = "forgive" "forgotten" = "forget" "found" = "find" "frozen" = "freeze" "given" = "give" "gone" = "go" "gotten" = "get" "grown" = "grow" "hidden" = "hide" "known" = "know" "lain" = "lie" "mistaken" = "mistake" "mown" = "mow" "outgrown" = "outgrow" "overcome" "overridden" = "override" "overrun" "overseen" = "oversee" "overtaken" = "overtake" "overthrown" = "overthrow" "partaken" = "partake" "proven" = "prove" "redone" = "redo" "rerun" "rewritten" = "rewrite" "ridden" = "ride" "risen" = "rise" "run" "rung" = "ring" "sawn" = "saw" "seen" = "see" "sewn" = "sew" "shaken" = "shake" "shorn" = "shear" "shown" = "show" "shrunk" = "shrink" "slain" = "slay" "slit" "sown" = "sow" "spoken" = "speak" "sprung" = "spring" "spun" = "spin" "stolen" = "steal" "stricken" = "strike" "stridden" = "stride" "striven" = "strive" "stunk" = "stink" "sung" = "sing" "sunk" = "sink" "swollen" = "swell" "sworn" = "swear" "swum" = "swim" "swung" = "swing" "taken" = "take" "thriven" = "thrive" "thrown" = "throw" "torn" = "tear" "trodden" = "tread" "undergone" = "undergo" "underlain" = "underlie" "undertaken" = "undertake" "underwritten" = "underwrite" "undone" = "undo" "withdrawn" = "withdraw" "woken" = "wake" "won" = "win" "worn" = "wear" "woven" = "weave" "written" = "write" V[ vfm=psp typ=v r=i3 ] "wed" mmorph-2.3.4.2.orig/data/lex.exp.minor0100644000175000001440000002303706046143524016520 0ustar mvelausers; MULTEXT morphology tool ; English morphology description for mmorph ; Version 2.3, October 1995 ; Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland ;; Lexical entries for English; Adverbs etc. ;; Author: Graham Russell ;; Additions by: Susan Armstrong ;; ;; GJR ISSCO 20-1-95 ;; ;; SA ISSCO last change 16-5-95 ;;--------------------------------------------------------------- Adp[ ] "notwithstanding" Adp[ pos=post ] "ago" "away" Adp[ pos=pre ] "about" "above" "across" "after" "against" "along" "amid" "amidst" "among" "amongst" "apart" "around" "astride" "at" "barring" "before" "behind" "below" "beneath" "beside" "besides" "between" "beyond" "by" "concerning" "considering" "counter" "despite" "down" "during" "except" "excepting" "failing" "for" "from" "in" "including" "inside" "into" "irrespective" "like" "minus" "near" "next" "of" "off" "on" "onto" "onward" "opposite" "out" "outside" "outwith" "over" "past" "pending" "per" "pertaining" "plus" "re" "round" "save" "since" "thanks" "through" "throughout" "thru" "till" "to" "together" "toward" "towards" "under" "underneath" "unlike" "until" "up" "upon" "upper" "uppermost" "upward" "versus" "via" "vis-à-vis" "with" "within" "without" Adv[ deg=comp fn=mod wh=no ] "worse" = "badly" Adv[ deg=comp fn=spe wh=no ] "less" "more" Adv[ deg=pos fn=mod ] "whatever" "whatsoever" "whenever" "whereabouts" "wherefore" "wherever" "whyever" Adv[ deg=pos fn=mod wh=no ] "aback" "about" "above" "accordingly" "admittedly" "adoringly" "adrift" "after" "again" "ahead" "alarmingly" "alias" "alight" "alike" "all" "all-out" "allegedly" "almost" "aloft" "along" "alongside" "aloof" "aloud" "already" "alright" "also" "altogether" "always" "amiss" "amok" "anew" "anticlockwise" "any" "anyhow" "anytime" "anyway" "anywhere" "apart" "apiece" "approvingly" "apropos" "around" "as" "ashore" "aside" "askance" "askew" "assuredly" "astern" "astir" "astray" "astride" "asunder" "avowedly" "away" "awhile" "awry" "back" "backward" "backwards" "bareback" "barefoot" "bareheaded" "basically" "before" "beforehand" "behind" "below" "beneath" "besides" "best" = "well" "better" = "well" "between" "beyond" "bimonthly" "biweekly" "blindfold" "bodily" "both" "by" "carefreely" = "carefree" "cheap" "clear" "clockwise" "close" "counter" "counterclockwise" "course" "crosswise" "cuff" "daily" "dead" "deep" "ditto" "double" "doubtless" "down" "downhill" "downright" "downstairs" "downstream" "downtown" "downward" "downwards" "due" "duly" "early" "earnest" "east" "eastward" "eastwards" "easy" "edgeways" "either" "else" "elsewhere" "enough" "especially" "even" "ever" "everywhere" "exceedingly" "extra" "fair" "far" "farther" "fast" "fine" "first" "forever" "forth" "forthwith" "fortnightly" "forward" "forwards" "free" "freely" "full" "fully" "further" "furthermore" "gaily" = "gay" "gingerly" "half" "halfway" "hard" "headfirst" "headlong" "hear" "hence" "henceforth" "here" "hereabouts" "hereafter" "hereby" "herein" "heretofore" "herewith" "high" "hither" "hitherto" "home" "homeward" "hourly" "however" "inarticulate" "incognito" "indeed" "indoors" "inland" "inshore" "inside" "instead" "inward" "jolly" "just" "justly" "last" "late" "later" "left" "legibly" "leisurely" "lengthways" "lengthwise" "less" "likely" "likewise" "little" "long" "loud" "low" "maybe" "meantime" "meanwhile" "merely" "midway" "mighty" "monthly" "more" "moreover" "most" "mostly" "much" "namely" "nation-wide" "nationwide" "near" "nearby" "nearer" "neither" "never" "nevertheless" "next" "nightly" "non-stop" "nonetheless" "nor" "north" "northeast" "northward" "northwest" "not" "now" "nowadays" "nowhere" "o'clock" "offhand" "offshore" "offstage" "often" "once" "only" "onward" "onwards" "opposite" "otherwise" "outdoors" "outright" "outside" "outward" "overall" "overboard" "overhead" "overland" "overleaf" "overnight" "overseas" "overtime" "parrot" "part" "part-time" "partly" "past" "peg" "perhaps" "piecemeal" "piping" "plain" "please" "plumb" "point-blank" "presumably" "pretty" "pro" "prompt" "purposely" "quarterly" "quick" "quite" "rather" "ready" "regardless" "regretfully" "repeatedly" "reportedly" "right" "round" "second" "secondly" "seldom" "sharp" "sheer" "short" "sidesaddle" "sideways" "sidewise" "since" "single-handed" "slap" "slow" "so" "so-so" "solo" "some" "someday" "somehow" "someplace" "sometime" "sometimes" "somewhat" "somewhere" "soon" "sooner" "soprano" "south" "southeast" "southerly" "southern" "southward" "southwards" "southwest" "staccato" "stark" "step-by-step" "still" "straight" "such-and-such" "supposedly" "tax-free" "that" "then" "thence" "there" "thereabouts" "thereafter" "thereby" "therefore" "therefrom" "therein" "thereof" "thereto" "thereunder" "thereupon" "thirdly" "though" "threefold" "through" "throughout" "thru" "thus" "tight" "today" "together" "tomorrow" "tongue" "tonight" "too" "topsy-turvy" "trifle" "twice" "twofold" "unawares" "unbecoming" "unbeknown" "unbeknownst" "under" "underfoot" "underground" "underneath" "underwater" "unduly" "unknowingly" "unlikely" "uphill" "upright" "upside" "upstairs" "upstream" "uptown" "upward" "upwards" "verbatim" "very" "vice" "weekly" "well" "west" "westward" "westwards" "wholesale" "wholly" = "whole" "wide" "wit" "within" "worldwide" "wrong" "yearly" "yesterday" "yet" "yonder" Adv[ deg=pos fn=mod wh=q ] "why" Adv[ deg=pos fn=mod wh=q|r ] "when" "where" Adv[ deg=pos fn=spe wh=no ] "as" "much" "so" "too" "very" Adv[ deg=pos wh=q ] "how" Adv[ deg=sup fn=mod wh=no ] "worst" = "badly" Adv[ deg=sup fn=spe wh=no ] "least" "most" C[ typ=cmp ] "as" C[ typ=cmp cpos=m ] "than" C[ typ=crd cpos=i ] "either" "neither" C[ typ=crd cpos=m ] "and" "but" "nor" "or" C[ typ=sub ctyp=f ] "although" "as" "because" "before" "however" "if" "meanwhile" "once" "otherwise" "since" "supposing" "though" "till" "unless" "until" "when" "whenever" "where" "whereas" "whereby" "wherever" "whether" "while" "yet" C[ typ=sub ctyp=f|t ] "provided" "providing" "so" C[ typ=sub ctyp=i ] "for" C[ typ=sub ctyp=s ] "lest" C[ typ=sub ctyp=t ] "seeing" Det[ typ=def ] "the" Det[ typ=gen wh=no ] "any" "each" "no" "some" Det[ typ=gen wh=no num=pl ] "all" "both" "certain" "few" "many" "most" "other" "such" "these" "those" Det[ typ=gen wh=no num=sg ] "another" "either" "every" "less" "little" "much" "neither" "that" "this" Det[ typ=gen wh=q ] "what" "whatever" Det[ typ=gen wh=q|r ] "which" "whichever" Det[ typ=ind ] "a" "an" = "a" Det[ typ=poss wh=no p_num=pl p_per=1 ] "our" Det[ typ=poss wh=no p_num=pl p_per=3 ] "their" Det[ typ=poss wh=no p_num=sg p_per=1 ] "my" Det[ typ=poss wh=no p_num=sg p_per=3 p_gen=f ] "her" Det[ typ=poss wh=no p_num=sg p_per=3 p_gen=m ] "his" Det[ typ=poss wh=no p_num=sg p_per=3 p_gen=n ] "its" Det[ typ=poss wh=no p_per=2 ] "your" Det[ typ=poss wh=q|r ] "whose" N[ num=sg typ=c gen=n ] "billion" "eleven" "fifteen" "hundred" "million" "ten" "thousand" "trillion" Num[ typ=card ] "billion" "eight" "eighteen" "eighty" "eleven" "fifteen" "fifty" "five" "forty" "four" "fourteen" "hundred" "million" "nine" "nineteen" "ninety" "one" "seven" "seventeen" "seventy" "six" "sixteen" "sixty" "ten" "thirteen" "thirty" "thousand" "three" "trillion" "twelve" "twenty" "two" Num[ typ=ord ] "billionth" "eighteenth" "eighth" "eightieth" "eleventh" "fifth" "fiftieth" "first" "fortieth" "fourteenth" "fourth" "hundredth" "millionth" "nineteenth" "ninetieth" "ninth" "second" "seventeenth" "seventh" "seventieth" "sixteenth" "sixth" "sixtieth" "tenth" "third" "thirteenth" "thirtieth" "thousandth" "trillionth" "twelfth" "twentieth" Pro[ typ=gen wh=no per=3 gen=n ] "all" "any" "most" "none" "some" Pro[ typ=gen wh=no per=3 num=pl ] "others" "several" Pro[ typ=gen wh=no per=3 num=pl gen=n ] "both" "few" "many" "these" "those" Pro[ typ=gen wh=no per=3 num=sg ] "another" Pro[ typ=gen wh=no per=3 num=sg gen=m|f ] "anybody" "no-one" "nobody" "somebody" "someone" Pro[ typ=gen wh=no per=3 num=sg gen=n ] "anyone" "anything" "each" "either" "everybody" "everyone" "everything" "less" "neither" "nothing" "something" "that" "this" Pro[ typ=gen wh=q per=3 ] "what" Pro[ typ=gen wh=q|r per=3 ] "whatever" "which" "whichever" Pro[ typ=per wh=no num=pl case=nom ] "they" Pro[ typ=per wh=no num=sg case=nom ] "me" Pro[ typ=per wh=no per=1 num=pl case=acc ] "us" Pro[ typ=per wh=no per=1 num=pl case=nom ] "we" Pro[ typ=per wh=no per=1 num=sg case=nom ] "I" Pro[ typ=per wh=no per=2 ] "you" Pro[ typ=per wh=no per=3 num=pl case=acc ] "them" Pro[ typ=per wh=no per=3 num=sg gen=f case=acc ] "her" Pro[ typ=per wh=no per=3 num=sg gen=f case=nom ] "she" Pro[ typ=per wh=no per=3 num=sg gen=m case=acc ] "him" Pro[ typ=per wh=no per=3 num=sg gen=m case=nom ] "he" Pro[ typ=per wh=no per=3 num=sg gen=m|f ] "one" Pro[ typ=per wh=no per=3 num=sg gen=n ] "it" Pro[ typ=per wh=q|r ] "who" "whoever" Pro[ typ=per wh=q|r gen=m|f case=acc ] "whom" Pro[ typ=poss wh=no per=3 p_num=pl p_per=1 ] "ours" Pro[ typ=poss wh=no per=3 p_num=pl p_per=3 ] "theirs" Pro[ typ=poss wh=no per=3 p_num=sg p_gen=f p_per=3 ] "hers" Pro[ typ=poss wh=no per=3 p_num=sg p_gen=m p_per=3 ] "his" Pro[ typ=poss wh=no per=3 p_num=sg p_per=1 ] "mine" Pro[ typ=poss wh=no per=3 p_per=2 ] "yours" Pro[ typ=poss wh=q|r per=3 ] "whose" Pro[ typ=ref wh=no per=1 num=pl ] "ourselves" Pro[ typ=ref wh=no per=1 num=sg ] "myself" Pro[ typ=ref wh=no per=2 num=pl ] "yourselves" Pro[ typ=ref wh=no per=2 num=sg ] "yourself" Pro[ typ=ref wh=no per=3 num=pl ] "themselves" Pro[ typ=ref wh=no per=3 num=sg ] "oneself" Pro[ typ=ref wh=no per=3 num=sg gen=f ] "herself" Pro[ typ=ref wh=no per=3 num=sg gen=m ] "himself" Pro[ typ=ref wh=no per=3 num=sg gen=n ] "itself" mmorph-2.3.4.2.orig/data/lex.proper0100644000175000001440000002633306046143526016114 0ustar mvelausers; MULTEXT morphology tool ; English morphology description for mmorph ; Version 2.3, October 1995 ; Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland ;; Lexical entries for English proper nouns ;; Author: Graham Russell ;; Additions by: Susan Armstrong ;; ;; GJR ISSCO 20-1-95 ;; ;; SA ISSCO last change 16-5-95 ;;--------------------------------------------------------------- N[ typ=p1 ] "Aachen" "Aberdeen" "Aberystwyth" "Abidjan" "Abitibi" "Abkhazia" "Abruzzi" "Abuja" "Abyssinia" "Acadia" "Acapulco" "Accra" "Achaea" "Acropolis" "Adelaide" "Aden" "Adige" "Afghanistan" "Africa" "Alabama" "Alaska" "Albania" "Alberta" "Aldebaran" "Alderney" "Algeria" "Alsace" "Amazonia" "America" "Amsterdam" "Anatolia" "Andalusia" "Andorra" "Anglo-Saxon" "Angola" "Angus" "Ankara" "Antarctica" "Antigua" "Antrim" "Antwerp" "Aosta" "Apache" "Appenzell" "Apulia" "Aqaba" "Arabia" "Aran" "Arcadia" "Ardennes" "Argentina" "Argos" "Argyll" "Arizona" "Arkansas" "Arlberg" "Armagh" "Armenia" "Arnhem" "Arran" "Ashanti" "Asia" "Assam" "Asturias" "Athens" "Athos" "Atlanta" "Attica" "Augusta" "Australasia" "Australia" "Austria" "Avignon" "Ayr" "Ayrshire" "Azerbaijan" "Aztec" "Babylon" "Badajoz" "Badminton" "Baghdad" "Bahrain" "Ballymena" "Baluchistan" "Bamberg" "Banff" "Bangalore" "Bangkok" "Bangladesh" "Bangor" "Barbados" "Barcelona" "Basel" "Basle" "Basque" "Bavaria" "Beijing" "Beirut" "Belarus" "Belfast" "Belgium" "Belgrade" "Belgravia" "Belize" "Benares" "Benelux" "Bengal" "Benguela" "Bergamo" "Berkeley" "Berkshire" "Berlin" "Bermuda" "Bern" "Berne" "Betelgeuse" "Bethlehem" "Bhutan" "Birmingham" "Blantyre" "Bogotá" "Bogota" "Bohemia" "Bolivia" "Bologna" "Bombay" "Bonn" "Bordeaux" "Borneo" "Bosnia" "Bosnia-Herzegovina" "Boston" "Botswana" "Brandeis" "Brasilia" "Brazil" "Brazzaville" "Bremen" "Bremerhaven" "Brescia" "Brighton" "Brindisi" "Bristol" "Britain" "Britanny" "Brno" "Bromley" "Brooklyn" "Bruges" "Brunei" "Brussels" "Bucharest" "Buckingham" "Buckinghamshire" "Budapest" "Buddha" "Bulgaria" "Burgundy" "Burma" "Burundi" "Byelorussia" "Byzantium" "Cadiz" "Caernarvon" "Caerphilly" "Cairo" "Caithness" "Calabria" "Calais" "Caledonia" "Calgary" "California" "Cambodia" "Cambridge" "Camden" "Camelot" "Camembert" "Cameroon" "Canada" "Canberra" "Canterbury" "Canton" "Capri" "Cardiff" "Cardigan" "Carlisle" "Carrickfergus" "Cartagena" "Casablanca" "Catalan" "Catalonia" "Cervin" "Ceylon" "Chad" "Chalkidiki" "Champagne" "Chandigarh" "Channel" "Chartres" "Cherokee" "Cheshire" "Chester" "Cheyenne" "Chiapas" "Chiba" "Chicago" "Chicoutimi" "Chile" "China" "Chinook" "Chioggia" "Chitral" "Chittagong" "Choctaw" "Cincinnnati" "Ciskei" "Clare" "Cleveland" "Clwyd" "Clyde" "Colchester" "Cologne" "Colombia" "Colombo" "Colorado" "Columbia" "Comanche" "Commonwealth" "Compostella" "Connacht" "Connaught" "Connecticut" "Connemara" "Constantinople" "Copenhagen" "Cork" "Cornwall" "Corsica" "Cotswold" "Coventry" "Craigavon" "Crawley" "Crete" "Croatia" "Croydon" "Cuba" "Cumberland" "Cumbria" "Czechoslavakia" "Dacca" "Dagestan" "Dahomey" "Dakar" "Dakota" "Dallas" "Damascus" "Darjeeling" "Dartmoor" "Darwin" "Dayak" "Delaware" "Delft" "Delhi" "Delphi" "Deneb" "Denmark" "Derby" "Derbyshire" "Derry" "Detroit" "Devon" "Devonshire" "Djakarta" "Djibouti" "Dominica" "Donegal" "Dorset" "Dover" "Downpatrick" "Dresden" "Dublin" "Dumbarton" "Dumbartonshire" "Dumfries" "Dumfriesshire" "Dundalk" "Dundee" "Dunkerque" "Dunkirk" "Durham" "Dyfed" "Ecuador" "Edam" "Edinburgh" "Egypt" "Emmental" "Emmenthal" "Engadine" "England" "Enniskillen" "Erie" "Eritrea" "Erlangen" "Eskimo" "Essen" "Essex" "Estonia" "Ethiopia" "Etna" "Eton" "Europe" "Exeter" "Exmoor" "Fermanagh" "Fiat" "Fiji" "Finisterre" "Finland" "Florence" "Florida" "Folkestone" "Ford" "Forfar" "Forth" "France" "Frankfurt" "Franz" "Fribourg" "Friuli" "Friuli-Venezia" "Gabon" "Galicia" "Galilee" "Galway" "Gatineau" "Geneva" "Genoa" "Genova" "Georgia" "Germany" "Gibraltar" "Glasgow" "Gloucester" "Gloucestershire" "Goa" "Golan" "Gorgonzola" "Goth" "Graubünden" "Graubunden" "Greece" "Greenland" "Grenada" "Grenoble" "Grisons" "Guadeloupe" "Guam" "Guatemala" "Guernsey" "Guinea" "Gujarat" "Gulf" "Gurkha" "Guyana" "Gwent" "Gwynedd" "Hague" "Haiti" "Halifax" "Hamburg" "Hamilton" "Hampshire" "Hanoi" "Hanover" "Hansard" "Harlech" "Harlem" "Harvard" "Hastings" "Haute-Volta" "Havana" "Hawaii" "Hebrew" "Heidelberg" "Helvetia" "Hereford" "Herefordshire" "Hertford" "Hertfordshire" "Hibernia" "Hindi" "Hindu" "Hobart" "Hogmanay" "Hokkaido" "Holland" "Hollywood" "Honduras" "Honshu" "Houston" "Huambo" "Hudson" "Hull" "Humber" "Humberside" "Hungary" "Huntingdon" "Huntingdonshire" "Huron" "Hyderabad" "Ibadan" "Iberia" "Iberian" "Ibiza" "Iceland" "Idaho" "Illinois" "Imphal" "Inca" "India" "Indiana" "Indonesia" "Indus" "Inuit" "Inverness" "Iona" "Iowa" "Iraklion" "Iran" "Iraq" "Ireland" "Iroquois" "Islam" "Israel" "Istanbul" "Italy" "Ithaca" "Izmir" "Jain" "Jainism" "Jaipur" "Jakarta" "Jamaica" "Jammu" "Japan" "Java" "Jericho" "Jersey" "Jerusalem" "Jodhpur" "Jogjakarta" "Johannesburg" "Johore" "Jordan" "Judaea" "Judaism" "Jugoslavia" "Juneau" "Jupiter" "Jura" "Jutland" "Kabul" "Kagoshima" "Kalimantan" "Kamloops" "Kampala" "Kampuchea" "Kandy" "Kansas" "Karachi" "Karlsruhe" "Karnak" "Karnakata" "Kashmir" "Kattegat" "Kawasaki" "Kazakhstan" "Keflavik" "Kensington" "Kent" "Kentucky" "Kenya" "Khartoum" "Khmer" "Kigali" "Kikuyu" "Kildare" "Kiribati" "Kobe" "Koblenz" "Kodiak" "Korea" "Kos" "Kosovo" "Kowloon" "Kuwait" "Kyoto" "Kyushu" "Lagos" "Lanark" "Lanarkshire" "Lancashire" "Lancaster" "Laos" "Latin" "Latvia" "Laval" "Leicester" "Leicestershire" "Leinster" "Leipzig" "Leitrim" "Leningrad" "Lesbos" "Lesotho" "Lewis" "Lhasa" "Liberia" "Libya" "Liechtenstein" "Liguria" "Lima" "Limburg" "Limerick" "Lincoln" "Lincolnshire" "Linlithgow" "Lisbon" "Lisburn" "Lithuania" "Liverpool" "Lombardy" "London" "Londonderry" "Lords" "Lorraine" "Lucerne" "Lucknow" "Lugano" "Luxembourg" "Lyon" "Maastricht" "Macao" "Macedonia" "Madagascar" "Madeira" "Madras" "Madrid" "Magyar" "Maharashtra" "Main" "Maine" "Majorca" "Malacca" "Malaga" "Malagasy" "Malawi" "Malaya" "Malayalam" "Malaysia" "Mali" "Malta" "Manchester" "Manhattan" "Manila" "Manipur" "Manitoba" "Mannheim" "Mantua" "Manzanilla" "Maputo" "Marrakech" "Marrakesh" "Mars" "Marseilles" "Martinique" "Maryland" "Massachussetts" "Matsushima" "Mauritania" "Mauritius" "Mayfair" "Mecca" "Medway" "Mekong" "Melanesia" "Melbourne" "Mercury" "Merioneth" "Merionethshire" "Mersey" "Merseyside" "Mesopotamia" "Messina" "Mexico" "Miami" "Michigan" "Micronesia" "Middlesex" "Milan" "Milwaukee" "Mindanao" "Minnesota" "Minorca" "Mississippi" "Missouri" "Mogadishu" "Mohican" "Mojave" "Moldavia" "Mombasa" "Monaco" "Monaghan" "Mongolia" "Monmouth" "Montana" "Montevideo" "Montpellier" "Montréal" "Montreal" "Montreux" "Moravia" "Morocco" "Moscow" "Mozambique" "Munich" "Muscat" "Myanmar" "Mysore" "Nagasaki" "Nagorny-Karabakh" "Nairobi" "Namibia" "Nantes" "Naples" "Nara" "Narbonne" "Natal" "Naxos" "Nebraska" "Negev" "Nepal" "Neptune" "Netherlands" "Neuchâtel" "Neuchatel" "Nevada" "Nevis" "Newcastle" "Newfoundland" "Niagara" "Nicaragua" "Nidwald" "Nidwalden" "Niger" "Nigeria" "Nijmegen" "Nile" "Norfolk" "Normandy" "Northampton" "Northamptonshire" "Norway" "Norwich" "Nottingham" "Nottinghamshire" "Nuremburg" "Obwald" "Obwalden" "Oceania" "Offaly" "Ohio" "Okayama" "Okinawa" "Oklahoma" "Omaha" "Oman" "Omsk" "Ontario" "Oporto" "Oregon" "Orinoco" "Orissa" "Osaka" "Ossetia" "Ottawa" "Outremont" "Oxford" "Oxfordshire" "Pacific" "Paddington" "Pakistan" "Palestine" "Palma" "Panama" "Papua" "Paraguay" "Paris" "Parmesan" "Pategonia" "Patmos" "Patras" "Peking" "Peloponnese" "Pembroke" "Pembrokeshire" "Pennsylvania" "Pentagon" "Perpignan" "Persia" "Peru" "Peshawar" "Philadelphia" "Picardy" "Piedmont" "Pittsburgh" "Pluto" "Poland" "Polynesia" "Pondicherry" "Portland" "Portlaoighise" "Portsmouth" "Portugal" "Potsdam" "Poznan" "Prague" "Prestwick" "Pretoria" "Provence" "Punjab" "Pyongyang" "Qatar" "Québec" "Quebec" "Quechua" "Queensland" "Quemoy" "Réunion" "Radnor" "Radnorshire" "Rajastan" "Ranat" "Rangoon" "Rarotonga" "Rawalpindi" "Reading" "Reblochon" "Renault" "Reunion" "Reykjavik" "Rhodes" "Rhodesia" "Rialto" "Riga" "Riyadh" "Roman" "Romania" "Rome" "Roscommon" "Ross" "Rotterdam" "Roumania" "Russia" "Rutland" "Rwanda" "Ryukyu" "Saarbrücken" "Saarland" "Saigon" "Salamanca" "Salisbury" "Samoa" "Samos" "Santander" "Santiago" "Sapporo" "Sarajevo" "Sardinia" "Sasebo" "Saskatchewan" "Saskatoon" "Saturn" "Savoy" "Saxon" "Scandinavia" "Schaffhausen" "Schiphol" "Schleswig-Holstein" "Scotland" "Seattle" "Selangor" "Sellafield" "Sendai" "Senegal" "Seoul" "Serbia" "Serbo-Croatian" "Severn" "Seveso" "Seville" "Shannon" "Shantung" "Sheffield" "Shetland" "Siam" "Siberia" "Sicily" "Sidney" "Sikh" "Sikkim" "Singapore" "Sioux" "Siracusa" "Skagerak" "Skopje" "Slovakia" "Slovenia" "Snowdon" "Snowdonia" "Sofia" "Solomon" "Somalia" "Somerset" "Southampton" "Spain" "Staffordshire" "Stalingrad" "Staten" "Stockholm" "Stonehenge" "Stormont" "Strabane" "Strasbourg" "Strathclyde" "Stuttgart" "Sudan" "Suez" "Suffolk" "Sulawesi" "Sumatra" "Superior" "Surrey" "Sussex" "Sutherland" "Sverdlovsk" "Swahili" "Swansea" "Swaziland" "Sweden" "Switzerland" "Sydney" "Syracuse" "Syria" "Szechuan" "Tübingen" "Tadzhikistan" "Tagalog" "Tahiti" "Taipei" "Taiwan" "Tanganyika" "Tanzania" "Tasmania" "Tatar" "Tbilisi" "Teesside" "Tehran" "Telugu" "Tennessee" "Texas" "Thailand" "Thames" "Thanet" "Thessaloniki" "Thrace" "Thurgau" "Thurgovie" "Tibet" "Ticino" "Timbuktu" "Timor" "Tipperary" "Tobago" "Togo" "Tokyo" "Tonga" "Toronto" "Trafalgar" "Trentino" "Trieste" "Trinidad" "Tripoli" "Troy" "Tuareg" "Tunisia" "Turin" "Turkey" "Tuscany" "Tutsi" "Tuvalu" "Tweed" "Tyne" "Tyrol" "UK" "US" "USA" "USSR" "Uganda" "Ulster" "Umbria" "Unix" "Uranus" "Uruguay" "Ushuaia" "Utah" "Utrecht" "Uzbekistan" "Valencia" "Valhalla" "Valkyrie" "Vancouver" "Varanasi" "Vatican" "Vaucluse" "Vaud" "Veneto" "Venezuela" "Venice" "Venus" "Vermont" "Versailles" "Vesuvius" "Victoria" "Vienna" "Vientiane" "Vietnam" "Viking" "Virginia" "Vladivostok" "Volgograd" "Vorarlberg" "Waadt" "Wales" "Wallis" "Warwick" "Warwickshire" "Washington" "Waterford" "Watergate" "Waterloo" "Weimar" "Wellington" "Wembley" "Wessex" "Westfalen" "Westmeath" "Westminster" "Westmorland" "Westphalia" "Whitmonday" "Whitsun" "Whitsunday" "Whitsuntide" "Wicklow" "Wight" "Wiltshire" "Wimbledon" "Winchester" "Windsor" "Winnipeg" "Wisconsin" "Woodstock" "Worcester" "Wyoming" "Xerox" "Xmas" "Yale" "Yellowstone" "Yemen" "Yokohama" "Yokosuka" "York" "Yorkshire" "Yoruba" "Yugoslavia" "Zagreb" "Zaire" "Zambia" "Zermatt" "Zimbabwe" "Zion" "Zug" "Zulu" "Zurich" N[ typ=p2 ] "Adriatic" "Aegean" "Amazon" "Americas" "Andes" "Antarctic" "Apennines" "Arctic" "Argentine" "Atlantic" "Azores" "Bahamas" "Balkans" "Baltic" "Bible" "Bosporus" "Bronx" "Caicos" "Cairngorms" "Canaries" "Capitol" "Caribbean" "Caucasus" "Celebes" "Chilterns" "Congo" "Crimea" "Danube" "Deccan" "Dodecanese" "Dolomites" "Earth" "Faeroe" "Falkland" "Grenadines" "Hebrides" "Highlands" "Himalayas" "Jungfrau" "Karakoram" "Lebanon" "Leeward" "Maghreb" "Maldives" "Matterhorn" "Mediterranean" "Midlands" "Moluccas" "Orkneys" "Oval" "Philippines" "Pleiades" "Pyrenees" "Rhine" "Rhone" "Ruhr" "Sahara" "Seychelles" "Solent" "Tees" "Transvaal" "Trossachs" "Turks" "Ukraine" "Valais" "Vosges" "Wear" "Yangtze" "Yukon" "Zambezi" mmorph-2.3.4.2.orig/util/0040755000175000001440000000000006046146552014135 5ustar mvelausersmmorph-2.3.4.2.orig/util/factorize0100755000175000001440000000130506045657433016051 0ustar mvelausers#!/bin/csh -f # mmorph, MULTEXT morphology tool # Version 2.3, October 1995 # Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland # Dominique Petitpierre, if ($#argv < 1 || $#argv > 2) then set Cmd=$0 set Cmd=$Cmd:t echo "Usage: $Cmd mmorphdecl [mmorphlex]" exit 1 endif set add ="" if ($#argv > 1 ) then set add = (-a $2:q) endif echo "" >/tmp/newline$$ mmorph -z -m $1:q $add:q \ | tr '\011\012' '\012\011' \ | cat - /tmp/newline$$ \ | sort -t' ' +0 -1 \ | tr '\012\011' '\011\012' \ | nawk '/]$/ { \ if ( $0 != previous_tfs) { \ previous_tfs = $0 ;\ print ;\ } \ next ;\ } \ { print ;\ }' rm /tmp/newline$$ mmorph-2.3.4.2.orig/util/swap0100755000175000001440000000051706045657436015044 0ustar mvelausers#!/bin/sed -f # mmorph, MULTEXT morphology tool # Version 2.3, October 1995 # Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland # Dominique Petitpierre, /^[ ]*"/!b : looplex /\[/b looptfs N b looplex :looptfs /\]/b swap N b looptfs : swap s/^\(.*\)[ ]\([^ ][^ ]*\[.*\].*\)$/\2 \1/ mmorph-2.3.4.2.orig/00CHANGES0100644000175000001440000000545206045461410014306 0ustar mvelausersVersion history for the mmorph package ====================================== (see also comments in file 00RELEASE_NOTES) version 2.3.4: October 31st 1995 - adapted to latest record/field format - added option to overwrite annotations in record/field mode (-O). - fixed bug in record/field mode whe line was reallocated version 2.3.3: July 10th 1995 - in lookup mode, a prompt is printed only if input and output are terminal - augmented bucket size for DB to avoid running out of hash overflow pages version 2.3.2: July 2nd 1995 - corrected bug when updating with option -a version 2.3.1: June 26th 1995 - more options to handle capitalized words: -b and -k. - changed option -Y into -z, -V into -v - improved layout of synopsis and usage - corrected handling of escape sequence in strings - locate xdr library Version 2.3: June 15th 1995 - added record/field mode (determined by option "-C lookup_classes") - started to tackle the capitalization problem (option "-B class") - option to mark unknown words (-U) - option to extend annotation (-E) - fixed bug in calculation of CRC Version 2.2: June 5th 1995 - possibility to factorize feature structures in @Lexicon declarations: ::= LEXICALSTRING ? + is replaced by ::= + ::= LEXICALSTRING ? - no more core dump if first significant character is '"'. - database files now contain a signature that is checked when re-used. This replaces the date checking mechanism. - a new tfs database file is created (*.tfs). - database file size is reduced (*.db). - added options -p and -q to dump the content of the database. - added options -y and -Y to do syntax checking and normalization The lexical descriptions written for previous versions should be converted to the new format; see 00RELEASE_NOTES. Version 2.1: March 24th 1995 - corrected some bugs Version 2.0: March 1st 1995 - added spelling rule annotations (constraints) - added unary rules - allow letter strings in the definition of classes Example: Punctuation: "." "," "?" "!" - added option "-f" to flush after each solution - added option "-i" to identify input segments - looking up words with non declared alphabetical symbols no longer causes mmorph to stop with an error. The word is simply rejected. - ported to Sun/Solaris, RS6000/AIX, Silicon Graphic/IRIX, Alpha/OSF/1 - distribution of an augmented sample french morphological description - distribution of an example morphological description (german nouns) The grammars running with mmorph 1.0 will run with mmorph 2.0 with no changes. Version 1.0: September 15th 1994 initial distributed version mmorph-2.3.4.2.orig/00COPYRIGHT0100644000175000001440000000143007112523171014575 0ustar mvelausersCOPYRIGHT mmorph, MULTEXT morphology tool Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. mmorph-2.3.4.2.orig/00INSTALL0100644000175000001440000000742506046146343014354 0ustar mvelausers# # mmorph, MULTEXT morphology tool # Version 2.3, October 1995 # Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland # Dominique Petitpierre, How to install mmorph ===================== Prerequisite: GNU flex-2.4.7 and Berkeley db.1.79 or later ---------------------------------------------------------- The mmorph program needs GNU flex and the Berkeley db librairies. Flex is distributed in the framework of the GNU project and can be found on any archive server carrying the GNU programs. For example: issco-ftp.unige.ch:/pub/flex.tar.gz prep.ai.mit.edu:pub/gnu/flex-2.5.2.tar.gz When configuring flex, make sure you generate an 8 bits scanner (specify DEFS=-DDEFAULT_CSIZE=256). You can tell the version and compilation options of an already installed flex with: "flex -V" or "flex -v". Flex has to be accessible (in one of the directories of the environment variable PATH), when performing "make". The original sources of the Berkeley db librairies package are available from (last version is 1.85): issco-ftp.unige.ch:/pub/db.tar.Z ftp.cs.berkeley.edu:ucb/4bsd/db.tar.Z Here are the steps I had to perform in order to install properly DB: (your mileage may vary) cd PORT/ make cp libdb.a /lib cp include/db.h /include mkdir /include/sys cp include/sys/cdefs.h /include/sys/cdefs.h Where is the directory of PORT corresponding to your machine, and is a path of the local hierachy (usually "/usr/local"). Making the binary ----------------- Before trying to compile, you may want to edit the file Makefile.in to adapt the values of USRLOCALDIR, MTHOME, USERSECT and FILESECT (see below). If you have afterthoughts you may specify them later on the make command line (see below). Compiling is done in two steps: configuration and compilation: ./configure make or ./configure make USRLOCALDIR= Where is the hierarchy were Berkeley DB is installed. To change permanently the value of USRLOCALDIR, edit Makefile.in before using configure. "configure" will test for the presence of alternative C compilers and prefer "gcc" over "cc". If you want to force a particular compiler, you may specify the environment variable CC before running "configure". You must clear the configuration cache "config.cache" for the change to take effect. For example to force the use of "cc" you do in csh: rm -f config.cache setenv CC cc ./configure in sh: rm -f config.cache CC=cc ./configure Testing the binary ------------------ Type make test If it passes the test, the result should be "test passed OK! ;-)". If not you may consult the file example.out to see if there are any error messages or compare it with data/example.test. Installing the binary and man pages ----------------------------------- To install the package. type make install or make MTHOME= USERSECT= FILESECT= install Where is the path of the hierarchy were mmorph has to be installed (in /bin and /man/man1 and /man/man5 ), and USERSECT (default 1) and FILSECT (default 5) are the number of the manual sections where applications and file format manual pages go. You can also edit the file Makefile.in, before running configure To adapt the values of these parameters. Bug reports and support ----------------------- I would be happy to know about your experience installing or using this program. Here is my contact information: Mr. Dominique Petitpierre | Internet: petitp@divsun.unige.ch ISSCO, University of Geneva | X400: C=ch; ADMD=400net; PRMD=switch; 54 route des Acacias | O=unige; OU=divsun; S=petitp CH-1227 GENEVA (Switzerland) | Tel: +41/22/705 7117 | Fax: +41/22/300 1086 mmorph-2.3.4.2.orig/00INSTALL.configure0100644000175000001440000001540305725326651016334 0ustar mvelausersBasic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Using a Different Build Directory ================================= You can compile the package in a different directory from the one containing the source code. Doing so allows you to compile it on more than one kind of computer at the same time. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Save the results of the tests in FILE instead of `config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. mmorph-2.3.4.2.orig/00README0100644000175000001440000000252606046146617014204 0ustar mvelausers# # mmorph, MULTEXT morphology tool # Version 2.3, October 1995 # Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland # Dominique Petitpierre, This directory contains the distribution of version 2.3 of the MULTEXT morphology tool: mmorph. The following documentation files are available: 00COPYRIGHT copyright notice 00INSTALL instructions on how to install mmorph 00INSTALL.configure generic instructions for configure 00CHANGES History of changes in mmorph versions 00RELEASE_NOTES Release notes to read when upgrading mmorph.1 mmorph program manual page (nroff -man format) mmorph.5 mmorph syntax description manual page (nroff) mmorph-v2.tex MULTEXT deliverable report (TeX format) Example of morphological descriptions can be found in the directory data: data/example small didactic example for French adjectives data/german sample rules for German nouns data/english rules for English For matters relating to this tool, please contact: Mr. Dominique Petitpierre | Internet: petitp@divsun.unige.ch ISSCO, University of Geneva | X400: C=ch; ADMD=400net; PRMD=switch; 54 route des Acacias | O=unige; OU=divsun; S=petitp CH-1227 GENEVA (Switzerland) | Tel: +41/22/705 7117 | Fax: +41/22/300 1086 mmorph-2.3.4.2.orig/00RELEASE_NOTES0100644000175000001440000001313506046146347015275 0ustar mvelausersCollected release notes for the various distributed versions of mmorph ====================================================================== (See also the summary of changes in file 00CHANGES). Release notes for mmorph version 2.3.1 -------------------------------------- Version 2.3.1 has 2 new options to handle lookup of capitalized words: -b and -k. See manual page mmorph(1). Together with option -B, this is a first go at the capitalization problem and will probably change in the future. For the moment the assumption is that converting uppercase letters to lowercase in a word will help looking it up. For now it handles languages where there was no loss of information during capitalization such as English or Canadian French. A more robust mechanism should be provided for the cases where there is loss of information, for example when a letter lost its accent when it was capitalized like in French (é -> E). Release notes for mmorph version 2.3 ------------------------------------ Version 2.3 has 4 new options to handle record/field mode for lookup: -C classes , -B class, -U and -E. See manual page mmorph(1). Here are a few examples of use: - to lookup words in record/field mode, only those in records of class T, Compd, Abbr, Enc, Proc, Init, Tit: mmorph -C T,Compd,Abbr,Enc,Proc,Init,Tit -m rules out.seg out.lex - idem, with annotating the other records and marking unknown words with ??\?? (option -U). mtlexpunct < out.seg \ | mtlexnum \ | mmorph -U -C T,Compd,Abbr,Enc,Proc,Init,Tit -m rules > out.lex - idem, but with looking up of folded capitalized words starting sentences. Option -B specifies what is the record class that precede the first word of a sentence (e.g. Otag). mmorph -B Otag -C T,Compd,Abbr,Enc,Proc,Init,Tit -m rules out.seg out.lex Does not yet work with capitals that have lost their accent. Conversion of uppercase to lowercase is done according to the character set in effect given by the environment variable LC_CTYPE (cf. setlocale(3) and locale(5)). - two passes to extend annotations (option -E) mmorph -C T,Compd,Abbr,Enc,Proc,Init,Tit -m rules out.seg \ | mmorph -E -C Abbr -m rules_abbreviations > out.lex The number of options starts to get ridiculous. Next version will probably have three programs: for generation, simple lookup, record/field lookup. If you have problems with these changes, contact Mr. Dominique Petitpierre | Internet: petitp@divsun.unige.ch ISSCO, University of Geneva | X400: C=ch; ADMD=arcom; PRMD=switch; 54 route des Acacias | O=unige; OU=divsun; S=petitp CH-1227 GENEVA (Switzerland) | Tel: +41/22/705 7117 | Fax: +41/22/300 1086 Release notes for mmorph version 2.2 ------------------------------------ This version is faster and creates smaller files, an lets you factorize the typed feature structures in the lexical declarations. To allow this factorisation the syntax of the descriptions in @Lexicon which was like this: ::= LEXICALSTRING ? + is replaced by this (cf "man 5 mmorph"): ::= + ::= LEXICALSTRING ? In order to convert your files written for earlier versions of mmorph (2.1 and before), you can use the utilities you'll find in the directory ./util: swap swaps the strings and typed feature structures of lexical entries factorize factorizes the lexical entries' TFS with respect to the strings For each file containing lexical entries (@Lexicon section only, in whole or part) you can do the following (description file name is "rules", lexical entries file name is "lex"): 1) swap lex >lex.new 2) mv lex lex.old 3) factorize rules lex.new >lex If the lexical entries are at the end of the file "rules", extract them in a separate file "lex", proceed as above and then replace the lexical entries in "rules" with the new content of "lex". The utility "swap" does not handle #include directives. It also might need some adjustements (it is a sed script) or pre-processing if you have fancy layout of lexical entries. Tell me if you have problems with this conversion. If you send me your mmorph description files I can do this for you. You should get a substantial reduction on the size of the descriptions and generated database. Typically the description is only one fifth of the original size, and the generated database one third. Your mileage may vary (measure the databases size with "du -a" instead of "ls" to avoid counting the holes in the files). The utility "factorize" can be used on it own in order to restructure lexical entries written independantly, or to merge two lexical description files. Version 2.2 has four new options (cf "man mmorph"): -p to print the list of the projected tfs contained in a database: mmorph.new -p -m morph-lexicon.fr >tfs -q to print the list of all forms with their projected tfs: mmorph.new -q -m morph-lexicon.fr >forms The forms are not listed in order of generation (for that use "mmorph -n"). If option "-d 16" is used together with option -p or -q some statistics are displayed. -y parse only. Do not generate anything, just check the syntax. -z normalize, implies -y. Print on standard output the lexical entries, in normalized form. If you have problems with these changes, contact Mr. Dominique Petitpierre | Internet: petitp@divsun.unige.ch ISSCO, University of Geneva | X400: C=ch; ADMD=400net; PRMD=switch; 54 route des Acacias | O=unige; OU=divsun; S=petitp CH-1227 GENEVA (Switzerland) | Tel: +41/22/705 7117 | Fax: +41/22/300 1086 mmorph-2.3.4.2.orig/Makefile0100644000175000001440000002572006313321647014620 0ustar mvelausers# Generated automatically from Makefile.in by configure. # # mmorph, MULTEXT morphology tool # Version 2.3, October 1995 # Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland # Dominique Petitpierre, # use with # make target # where target is one of: # all build everything (default) # install build and install everything from a source distribution # realclean remove every reconstructible file # test test the compiled tool against some saved results # ############################################################################ # Macros most likely to be subject to customization # directory where to install this package MTHOME=/usr/local/pck/multext # manual section for user commands USERSECT=1 # manual section for file formats FILESECT=5 # directory containing lib/libdb.a and include/db.h # /usr/local defaults to /usr/local, but this can be changed with the # option --prefix of configure (cf. 00INSTALL.configure) USRLOCALDIR=/usr/local # you probably don't need to change anything below this line #========================================================================== # directory in user's PATH BINDIR=$(MTHOME)/bin # directory in user's MANPATH MANDIR=$(MTHOME)/man INSTALLBIN=cp INSTALLMAN=cp # directory containing libdb.a DBLIBDIR=$(USRLOCALDIR)/lib # directory containing db.h DBINCLUDEDIR=$(USRLOCALDIR)/include # need flex, lex does not handle 8 bit character codes LEX=flex # optimize what you can LFLAGS=-8 -Ca YACC=bison -y INCLUDEDIRS=-I$(DBINCLUDEDIR) # librairies where to find system things: # on Solaris: -lnsl for xdr functions LIBS= LDLIBS= $(LIBS) -L$(DBLIBDIR) -ldb # gcc defaults to gcc if it is available, cc otherwise. # It can be changed by setting the environment variable CC prior to # running ./configure (cf. 00INSTALL.configure) CC=gcc # On IBM's AIX, -O breaks the program: For the moment avoid with # CFLAGS= # On Silicon Graphics IRIX, strange interference with db.h (symbol UINT_MAX). # For the moment avoid with -cckr: # CFLAGS=-cckr # On Alpha: to allow enough room for optimizing # CFLAGS=-O1000 # CFLAGS=-pg -g -DDEBUG CFLAGS=-O -g INCLUDES= config.h user.h symbols.h unify.h bitmap.h chain.h mymalloc.h \ combine.h database.h spell.h output.h tfs.h crc32file.h \ tbl.h version.h CSOURCES=symbols.c unify.c bitmap.c chain.c output.c mymalloc.c \ combine.c main.c database.c lookup.c spell.c tfs.c \ crc32file.c tbl.c OBJS=main.o tokenize.o y.tab.o symbols.o unify.o bitmap.o chain.o \ output.o mymalloc.o combine.o database.o lookup.o spell.o \ tfs.o crc32file.o tbl.o # evaluate make commands in the Bourne shell SHELL=/bin/sh # MAKE=make macro definition PROGRAM=mmorph all: all_tools all_tools: $(PROGRAM) tokenize.c: tokenize.l rm -f $@ $(LEX) $(LFLAGS) -t $< >$@ y.tab.h y.tab.c: user.y rm -f y.tab.h y.tab.c $(YACC) -dvt user.y 2>&1 \ | sed -f yacc.sed tokenstr.h: y.tab.h tokenstr.sed rm -f $@ sed -f tokenstr.sed -n y.tab.h >$@ y.tab.o: y.tab.c $(INCLUDES) y.tab.h parse.h tokenize.o: tokenize.c $(INCLUDES) y.tab.h parse.h main.o: main.c $(INCLUDES) y.tab.h parse.h tokenstr.h symbols.o: symbols.c $(INCLUDES) unify.o: unify.c $(INCLUDES) bitmap.o: bitmap.c bitmap.h mymalloc.h config.h chain.o: chain.c chain.h mymalloc.h config.h output.o: output.c output.h parse.h config.h mymalloc.o: mymalloc.c mymalloc.h config.h combine.o: combine.c $(INCLUDES) lookup.o: lookup.c $(INCLUDES) tfs.o: tfs.c $(INCLUDES) tbl.o: tbl.c $(INCLUDES) crc32file.o: crc32file.c database.o: database.c $(INCLUDES) $(CC) $(CFLAGS) $(CPPFLAGS) -c $(INCLUDEDIRS) $< spell.o: spell.c $(INCLUDES) $(PROGRAM): $(OBJS) $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(OBJS) $(LDLIBS) clean: rm -f *.o tokenize.c y.tab.h y.tab.c tokenstr.h y.output \ *.CKP */*.CKP .emacs_[0-9]* *.dvi *.txt *.log \ example.out example.errs data/example.db data/example.tfs \ *.aux latex2text*.tex gmon.out mon.out \ config.log configure.scan config.cache distclean: realclean realclean: clean rm -f $(PROGRAM) tags test *.BAK *.bak tokenize config.status \ stamp-h.in stamp-h */*.BAK */*.bak check: test test: test1 test2 test1: $(PROGRAM) LC_CTYPE=C ./$(PROGRAM) -n -m data/example -l example.out @if { diff data/example.test example.out; } ;\ then echo "test1 passed OK! ;-)" ;\ else echo "test1 failed! :-(" ;\ exit 1 ;\ fi test2: $(PROGRAM) rm -f data/example.db data/example.tfs LC_CTYPE=C ./$(PROGRAM) -c -m data/example \ -l example.errs data/example.words example.out @if { diff data/example.lookup example.out; } ;\ then echo "test2 passed OK! ;-)" ;\ else echo "test2 failed! :-(" ;\ exit 1 ;\ fi install: install_tools install_man install_tools: install_bin install_bin: $(PROGRAM) $(BINDIR) rm -f $(BINDIR)/$(PROGRAM) $(INSTALLBIN) $(PROGRAM) $(BINDIR)/$(PROGRAM) install_man: install_man1 install_man5 install_man1: mmorph.1 $(MANDIR)/man$(USERSECT) rm -f $(MANDIR)/man$(USERSECT)/mmorph.$(USERSECT) $(INSTALLMAN) mmorph.1 $(MANDIR)/man$(USERSECT)/mmorph.$(USERSECT) install_man5: mmorph.5 $(MANDIR)/man$(FILESECT) rm -f $(MANDIR)/man$(FILESECT)/mmorph.$(FILESECT) $(INSTALLMAN) mmorph.5 $(MANDIR)/man$(FILESECT)/mmorph.$(FILESECT) $(MANDIR)/man$(USERSECT): $(MANDIR) ./mkdirhier $@ $(MANDIR)/man$(FILESECT): $(MANDIR) ./mkdirhier $@ # Do not create MANDIR if it does not exist: the man pages would be # probably be inaccessible anyway. $(MANDIR): @if [ ! -d $@ ] ; then \ echo "Manual hierarchy $@ does not exist, please create it." ;\ echo "Alternatively: adjust macro MANDIR in Makefile.in to be one" ;\ echo "of the existing paths in your MANPATH environment variable" ;\ echo 'then run "./configure" and "make install" again.' ;\ exit 1 ;\ fi # Do not create BINDIR if it does not exist: the programs would be # probably be inaccessible anyway. $(BINDIR): @if [ ! -d $@ ] ; then \ echo "Binary location $@ does not exist, please create it." ;\ echo "Alternatively: adjust macro BINDIR in Makefile.in to be one" ;\ echo "of the existing paths in your PATH environment variable" ;\ echo 'then run "./configure" and "make install" again.' ;\ exit 1 ;\ fi #================================================================ # The following are ad'hoc targets used by the developper. # Adapt and use at your own risk # force the use of gcc. same as "make -k CC=gcc CFLAGS=" GCC=gcc GCCFLAGS=-g -O -ansi -Wall gcc: $(MAKE) -k CC="$(GCC)" CFLAGS="$(GCCFLAGS)" LDLIBS="$(LDLIBS)" \ INCLUDEDIRS="$(INCLUDEDIRS)" MTHOME=$(MTHOME) \ USERSECT=$(USERSECT) FILESECT=$(FILESECT) \ USRLOCALDIR=$(USRLOCALDIR) malloc: $(MAKE) -k CFLAGS=-g \ CPPFLAGS="-I/usr/local/include" \ DBLIBDIR="/usr/local/lib -lmalloc" malloc2: $(MAKE) -k CFLAGS=-g \ CPPFLAGS="-DMALLOC_FUNC_CHECK -I/usr/local/include" \ DBLIBDIR="/usr/local/lib -lmalloc" data/example.test: $(PROGRAM) data/example LC_CTYPE=C ./$(PROGRAM) -n -m data/example -l $@ data/example.words: data/example.test LC_CTYPE=iso_8859_1 ./$(PROGRAM) -n -m data/example 2>&1 \ | cut -d\" -f2 |sort -u >$@ data/example.lookup: $(PROGRAM) data/example.words rm -f data/example.db data/example.tfs LC_CTYPE=C ./$(PROGRAM) -c -m data/example data/example.words $@ DISTFILES= tokenize.l user.y $(CSOURCES) $(INCLUDES) parse.h Makefile \ yacc.sed tokenstr.sed lint.sed \ 00INSTALL 00INSTALL.configure 00README 00CHANGES 00COPYRIGHT \ 00RELEASE_NOTES mmorph.1 mmorph.5 mmorph_v2.tex mkdirhier \ data/example data/example.test data/example.lookup \ data/example.words data/french data/english \ data/lex.exp.A data/lex.exp.N data/lex.exp.V data/lex.exp.minor \ data/lex.proper data/german util/swap util/factorize \ configure configure.in Makefile.in config.h.in mkf: make -f Makefile.mkf Makefile Coda_server: FORCE echo '{' >tmp echo $(DISTFILES) \ | tr ' ' '\012' \ | sed -e '/^Makefile$$/d' -e '/^config.h$$/d' \ -e 's/^/"/' -e 's/$$/"/' >>tmp echo '}' >>tmp sed -e '/{/r tmp' -e '/{/,/}/d' Coda_server >Coda_server.new mv Coda_server.new Coda_server rm -rf tmp FORCE: tokenize: tokenize.c $(CC) -DTEST -o tokenize tokenize.c indent: for f in $(CSOURCES) $(INCLUDES) parse.h ;\ do if [ -f $$f ] ;\ then indent $$f ;\ mv $$f.BAK $$f.bak ;\ fi ; \ done tags: indent ctags -t tokenize.l user.y $(CSOURCES) $(INCLUDES) parse.h REMOTE=issun9 backup: realclean (ls -d alpha* mmorph-* *.ps data/*.db data/*.tfs data/*.forms \ data/*.out data/*.out.gz \ data/lex* data2 bug >/tmp/exclude.$$ ;\ gtar --block-compress --totals -cvzf $(REMOTE):/dev/fd0 -b 36 \ . $$CVSROOT/mmorph -X /tmp/exclude.$$ ;\ rm -f /tmp/exclude.$$) make tags # prepare for new work phase (indent,tags and .BAK files) cp user.y user.y.bak cp tokenize.l tokenize.l.bak backup2: (ls -d alpha* mmorph-* *.ps data/*.db data/*.tfs data/*.forms \ data/*.out data/*.out.gz \ data/lex* data2 bug *.BAK *.bak tags >/tmp/exclude.$$ ;\ gtar --block-compress --totals -cvzf $(REMOTE):/dev/fd0 -b 36 \ . $$CVSROOT/mmorph -X /tmp/exclude.$$ ;\ rm -f /tmp/exclude.$$) restore: mkdir backup (cd backup ;\ GZIP="-q" gtar --block-compress -xzf $(REMOTE):/dev/rfd0 -b 36) lint: y.tab.c y.tab.h tokenstr.h tokenize.c lint $(INCLUDEDIRS) $(CSOURCES) y.tab.c tokenize.c \ | sed -f lint.sed cvstag: cvs tag multext_2_3_4 $(DISTFILES) solaris: rdist -d 'FILES=( ${DISTFILES} )' solaris aix: rdist -d 'FILES=( ${DISTFILES} )' aix alpha: rdist -d 'FILES=( ${DISTFILES} )' alpha irix: rdist -d 'FILES=( ${DISTFILES} )' irix sun3: rdist -d 'FILES=( ${DISTFILES} )' sun3 archive: tar cvf - ${DISTFILES} | gzip >mmorph-2.0.tar.gz run: $(PROGRAM) $(PROGRAM) -d1 -n -m example MMORPHVERSION=2 DELIVERABLEID=D2_3_1B postscript: mmorph.1.ps mmorph.5.ps mmorph_v$(MMORPHVERSION).ps text: mmorph.1.txt mmorph.5.txt mmorph_v$(MMORPHVERSION).txt PSROFF=groff -Tps mmorph.1.ps: mmorph.1 $(PSROFF) -man mmorph.1 >mmorph.1.ps mmorph.5.ps: mmorph.5 $(PSROFF) -man mmorph.5 >mmorph.5.ps mmorph_v$(MMORPHVERSION).ps: mmorph_v$(MMORPHVERSION).tex latex mmorph_v$(MMORPHVERSION) latex mmorph_v$(MMORPHVERSION) dvitps mmorph_v$(MMORPHVERSION) >mmorph_v$(MMORPHVERSION).ps mmorph.1.txt: mmorph.1 nroff -Tlpr -man mmorph.1 | col -b >mmorph.1.txt mmorph.5.txt: mmorph.5 nroff -Tlpr -man mmorph.5 | col -b >mmorph.5.txt mmorph_v$(MMORPHVERSION).txt: mmorph_v$(MMORPHVERSION).tex latex2text mmorph_v$(MMORPHVERSION) > mmorph_v$(MMORPHVERSION).txt packdoc: mmorph.1 mmorph.1.txt mmorph.1.ps mmorph.5 mmorph.5.txt \ mmorph.5.ps mmorph_v$(MMORPHVERSION).tex \ mmorph_v$(MMORPHVERSION).txt mmorph_v$(MMORPHVERSION).ps \ README.$(DELIVERABLEID) mkdir $(DELIVERABLEID) ln mmorph_v$(MMORPHVERSION).tex mmorph_v$(MMORPHVERSION).txt \ mmorph_v$(MMORPHVERSION).ps \ mmorph.1 mmorph.1.txt mmorph.1.ps \ mmorph.5 mmorph.5.txt mmorph.5.ps \ $(DELIVERABLEID) ln README.$(DELIVERABLEID) $(DELIVERABLEID)/README tar cvf - $(DELIVERABLEID) | gzip > $(DELIVERABLEID).tar.gz rm -rf $(DELIVERABLEID) mmorph-2.3.4.2.orig/Makefile.in0100644000175000001440000002564606045657114015237 0ustar mvelausers# # mmorph, MULTEXT morphology tool # Version 2.3, October 1995 # Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland # Dominique Petitpierre, # use with # make target # where target is one of: # all build everything (default) # install build and install everything from a source distribution # realclean remove every reconstructible file # test test the compiled tool against some saved results # ############################################################################ # Macros most likely to be subject to customization # directory where to install this package MTHOME=/usr/local/pck/multext # manual section for user commands USERSECT=1 # manual section for file formats FILESECT=5 # directory containing lib/libdb.a and include/db.h # @prefix@ defaults to /usr/local, but this can be changed with the # option --prefix of configure (cf. 00INSTALL.configure) USRLOCALDIR=@prefix@ # you probably don't need to change anything below this line #========================================================================== # directory in user's PATH BINDIR=$(MTHOME)/bin # directory in user's MANPATH MANDIR=$(MTHOME)/man INSTALLBIN=cp INSTALLMAN=cp # directory containing libdb.a DBLIBDIR=$(USRLOCALDIR)/lib # directory containing db.h DBINCLUDEDIR=$(USRLOCALDIR)/include # need flex, lex does not handle 8 bit character codes LEX=flex # optimize what you can LFLAGS=-8 -Ca YACC=@YACC@ INCLUDEDIRS=-I$(DBINCLUDEDIR) # librairies where to find system things: # on Solaris: -lnsl for xdr functions LIBS=@LIBS@ LDLIBS= $(LIBS) -L$(DBLIBDIR) -ldb # @CC@ defaults to gcc if it is available, cc otherwise. # It can be changed by setting the environment variable CC prior to # running ./configure (cf. 00INSTALL.configure) CC=@CC@ # On IBM's AIX, -O breaks the program: For the moment avoid with # CFLAGS= # On Silicon Graphics IRIX, strange interference with db.h (symbol UINT_MAX). # For the moment avoid with -cckr: # CFLAGS=-cckr # On Alpha: to allow enough room for optimizing # CFLAGS=-O1000 # CFLAGS=-pg -g -DDEBUG CFLAGS=-O INCLUDES= config.h user.h symbols.h unify.h bitmap.h chain.h mymalloc.h \ combine.h database.h spell.h output.h tfs.h crc32file.h \ tbl.h version.h CSOURCES=symbols.c unify.c bitmap.c chain.c output.c mymalloc.c \ combine.c main.c database.c lookup.c spell.c tfs.c \ crc32file.c tbl.c OBJS=main.o tokenize.o y.tab.o symbols.o unify.o bitmap.o chain.o \ output.o mymalloc.o combine.o database.o lookup.o spell.o \ tfs.o crc32file.o tbl.o # evaluate make commands in the Bourne shell SHELL=@BOURNESHELL@ # MAKE=make macro definition @SET_MAKE@ PROGRAM=mmorph all: all_tools all_tools: $(PROGRAM) tokenize.c: tokenize.l rm -f $@ $(LEX) $(LFLAGS) -t $< >$@ y.tab.h y.tab.c: user.y rm -f y.tab.h y.tab.c $(YACC) -dvt user.y 2>&1 \ | sed -f yacc.sed tokenstr.h: y.tab.h tokenstr.sed rm -f $@ sed -f tokenstr.sed -n y.tab.h >$@ y.tab.o: y.tab.c $(INCLUDES) y.tab.h parse.h tokenize.o: tokenize.c $(INCLUDES) y.tab.h parse.h main.o: main.c $(INCLUDES) y.tab.h parse.h tokenstr.h symbols.o: symbols.c $(INCLUDES) unify.o: unify.c $(INCLUDES) bitmap.o: bitmap.c bitmap.h mymalloc.h config.h chain.o: chain.c chain.h mymalloc.h config.h output.o: output.c output.h parse.h config.h mymalloc.o: mymalloc.c mymalloc.h config.h combine.o: combine.c $(INCLUDES) lookup.o: lookup.c $(INCLUDES) tfs.o: tfs.c $(INCLUDES) tbl.o: tbl.c $(INCLUDES) crc32file.o: crc32file.c database.o: database.c $(INCLUDES) $(CC) $(CFLAGS) $(CPPFLAGS) -c $(INCLUDEDIRS) $< spell.o: spell.c $(INCLUDES) $(PROGRAM): $(OBJS) $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(OBJS) $(LDLIBS) clean: rm -f *.o tokenize.c y.tab.h y.tab.c tokenstr.h y.output \ *.CKP */*.CKP .emacs_[0-9]* *.dvi *.txt *.log \ example.out example.errs data/example.db data/example.tfs \ *.aux latex2text*.tex gmon.out mon.out \ config.log configure.scan config.cache distclean: realclean realclean: clean rm -f $(PROGRAM) tags test *.BAK *.bak tokenize config.status \ stamp-h.in stamp-h */*.BAK */*.bak check: test test: test1 test2 test1: $(PROGRAM) LC_CTYPE=C ./$(PROGRAM) -n -m data/example -l example.out @if { diff data/example.test example.out; } ;\ then echo "test1 passed OK! ;-)" ;\ else echo "test1 failed! :-(" ;\ exit 1 ;\ fi test2: $(PROGRAM) rm -f data/example.db data/example.tfs LC_CTYPE=C ./$(PROGRAM) -c -m data/example \ -l example.errs data/example.words example.out @if { diff data/example.lookup example.out; } ;\ then echo "test2 passed OK! ;-)" ;\ else echo "test2 failed! :-(" ;\ exit 1 ;\ fi install: install_tools install_man install_tools: install_bin install_bin: $(PROGRAM) $(BINDIR) rm -f $(BINDIR)/$(PROGRAM) $(INSTALLBIN) $(PROGRAM) $(BINDIR)/$(PROGRAM) install_man: install_man1 install_man5 install_man1: mmorph.1 $(MANDIR)/man$(USERSECT) rm -f $(MANDIR)/man$(USERSECT)/mmorph.$(USERSECT) $(INSTALLMAN) mmorph.1 $(MANDIR)/man$(USERSECT)/mmorph.$(USERSECT) install_man5: mmorph.5 $(MANDIR)/man$(FILESECT) rm -f $(MANDIR)/man$(FILESECT)/mmorph.$(FILESECT) $(INSTALLMAN) mmorph.5 $(MANDIR)/man$(FILESECT)/mmorph.$(FILESECT) $(MANDIR)/man$(USERSECT): $(MANDIR) ./mkdirhier $@ $(MANDIR)/man$(FILESECT): $(MANDIR) ./mkdirhier $@ # Do not create MANDIR if it does not exist: the man pages would be # probably be inaccessible anyway. $(MANDIR): @if [ ! -d $@ ] ; then \ echo "Manual hierarchy $@ does not exist, please create it." ;\ echo "Alternatively: adjust macro MANDIR in Makefile.in to be one" ;\ echo "of the existing paths in your MANPATH environment variable" ;\ echo 'then run "./configure" and "make install" again.' ;\ exit 1 ;\ fi # Do not create BINDIR if it does not exist: the programs would be # probably be inaccessible anyway. $(BINDIR): @if [ ! -d $@ ] ; then \ echo "Binary location $@ does not exist, please create it." ;\ echo "Alternatively: adjust macro BINDIR in Makefile.in to be one" ;\ echo "of the existing paths in your PATH environment variable" ;\ echo 'then run "./configure" and "make install" again.' ;\ exit 1 ;\ fi #================================================================ # The following are ad'hoc targets used by the developper. # Adapt and use at your own risk # force the use of gcc. same as "make -k CC=gcc CFLAGS=" GCC=gcc GCCFLAGS=-g -O -ansi -Wall gcc: $(MAKE) -k CC="$(GCC)" CFLAGS="$(GCCFLAGS)" LDLIBS="$(LDLIBS)" \ INCLUDEDIRS="$(INCLUDEDIRS)" MTHOME=$(MTHOME) \ USERSECT=$(USERSECT) FILESECT=$(FILESECT) \ USRLOCALDIR=$(USRLOCALDIR) malloc: $(MAKE) -k CFLAGS=-g \ CPPFLAGS="-I/usr/local/include" \ DBLIBDIR="/usr/local/lib -lmalloc" malloc2: $(MAKE) -k CFLAGS=-g \ CPPFLAGS="-DMALLOC_FUNC_CHECK -I/usr/local/include" \ DBLIBDIR="/usr/local/lib -lmalloc" data/example.test: $(PROGRAM) data/example LC_CTYPE=C ./$(PROGRAM) -n -m data/example -l $@ data/example.words: data/example.test LC_CTYPE=iso_8859_1 ./$(PROGRAM) -n -m data/example 2>&1 \ | cut -d\" -f2 |sort -u >$@ data/example.lookup: $(PROGRAM) data/example.words rm -f data/example.db data/example.tfs LC_CTYPE=C ./$(PROGRAM) -c -m data/example data/example.words $@ DISTFILES= tokenize.l user.y $(CSOURCES) $(INCLUDES) parse.h Makefile \ yacc.sed tokenstr.sed lint.sed \ 00INSTALL 00INSTALL.configure 00README 00CHANGES 00COPYRIGHT \ 00RELEASE_NOTES mmorph.1 mmorph.5 mmorph_v2.tex mkdirhier \ data/example data/example.test data/example.lookup \ data/example.words data/french data/english \ data/lex.exp.A data/lex.exp.N data/lex.exp.V data/lex.exp.minor \ data/lex.proper data/german util/swap util/factorize \ configure configure.in Makefile.in config.h.in mkf: make -f Makefile.mkf Makefile Coda_server: FORCE echo '{' >tmp echo $(DISTFILES) \ | tr ' ' '\012' \ | sed -e '/^Makefile$$/d' -e '/^config.h$$/d' \ -e 's/^/"/' -e 's/$$/"/' >>tmp echo '}' >>tmp sed -e '/{/r tmp' -e '/{/,/}/d' Coda_server >Coda_server.new mv Coda_server.new Coda_server rm -rf tmp FORCE: tokenize: tokenize.c $(CC) -DTEST -o tokenize tokenize.c indent: for f in $(CSOURCES) $(INCLUDES) parse.h ;\ do if [ -f $$f ] ;\ then indent $$f ;\ mv $$f.BAK $$f.bak ;\ fi ; \ done tags: indent ctags -t tokenize.l user.y $(CSOURCES) $(INCLUDES) parse.h REMOTE=issun9 backup: realclean (ls -d alpha* mmorph-* *.ps data/*.db data/*.tfs data/*.forms \ data/*.out data/*.out.gz \ data/lex* data2 bug >/tmp/exclude.$$ ;\ gtar --block-compress --totals -cvzf $(REMOTE):/dev/fd0 -b 36 \ . $$CVSROOT/mmorph -X /tmp/exclude.$$ ;\ rm -f /tmp/exclude.$$) make tags # prepare for new work phase (indent,tags and .BAK files) cp user.y user.y.bak cp tokenize.l tokenize.l.bak backup2: (ls -d alpha* mmorph-* *.ps data/*.db data/*.tfs data/*.forms \ data/*.out data/*.out.gz \ data/lex* data2 bug *.BAK *.bak tags >/tmp/exclude.$$ ;\ gtar --block-compress --totals -cvzf $(REMOTE):/dev/fd0 -b 36 \ . $$CVSROOT/mmorph -X /tmp/exclude.$$ ;\ rm -f /tmp/exclude.$$) restore: mkdir backup (cd backup ;\ GZIP="-q" gtar --block-compress -xzf $(REMOTE):/dev/rfd0 -b 36) lint: y.tab.c y.tab.h tokenstr.h tokenize.c lint $(INCLUDEDIRS) $(CSOURCES) y.tab.c tokenize.c \ | sed -f lint.sed cvstag: cvs tag multext_2_3_4 $(DISTFILES) solaris: rdist -d 'FILES=( ${DISTFILES} )' solaris aix: rdist -d 'FILES=( ${DISTFILES} )' aix alpha: rdist -d 'FILES=( ${DISTFILES} )' alpha irix: rdist -d 'FILES=( ${DISTFILES} )' irix sun3: rdist -d 'FILES=( ${DISTFILES} )' sun3 archive: tar cvf - ${DISTFILES} | gzip >mmorph-2.0.tar.gz run: $(PROGRAM) $(PROGRAM) -d1 -n -m example MMORPHVERSION=2 DELIVERABLEID=D2_3_1B postscript: mmorph.1.ps mmorph.5.ps mmorph_v$(MMORPHVERSION).ps text: mmorph.1.txt mmorph.5.txt mmorph_v$(MMORPHVERSION).txt PSROFF=groff -Tps mmorph.1.ps: mmorph.1 $(PSROFF) -man mmorph.1 >mmorph.1.ps mmorph.5.ps: mmorph.5 $(PSROFF) -man mmorph.5 >mmorph.5.ps mmorph_v$(MMORPHVERSION).ps: mmorph_v$(MMORPHVERSION).tex latex mmorph_v$(MMORPHVERSION) latex mmorph_v$(MMORPHVERSION) dvitps mmorph_v$(MMORPHVERSION) >mmorph_v$(MMORPHVERSION).ps mmorph.1.txt: mmorph.1 nroff -Tlpr -man mmorph.1 | col -b >mmorph.1.txt mmorph.5.txt: mmorph.5 nroff -Tlpr -man mmorph.5 | col -b >mmorph.5.txt mmorph_v$(MMORPHVERSION).txt: mmorph_v$(MMORPHVERSION).tex latex2text mmorph_v$(MMORPHVERSION) > mmorph_v$(MMORPHVERSION).txt packdoc: mmorph.1 mmorph.1.txt mmorph.1.ps mmorph.5 mmorph.5.txt \ mmorph.5.ps mmorph_v$(MMORPHVERSION).tex \ mmorph_v$(MMORPHVERSION).txt mmorph_v$(MMORPHVERSION).ps \ README.$(DELIVERABLEID) mkdir $(DELIVERABLEID) ln mmorph_v$(MMORPHVERSION).tex mmorph_v$(MMORPHVERSION).txt \ mmorph_v$(MMORPHVERSION).ps \ mmorph.1 mmorph.1.txt mmorph.1.ps \ mmorph.5 mmorph.5.txt mmorph.5.ps \ $(DELIVERABLEID) ln README.$(DELIVERABLEID) $(DELIVERABLEID)/README tar cvf - $(DELIVERABLEID) | gzip > $(DELIVERABLEID).tar.gz rm -rf $(DELIVERABLEID) mmorph-2.3.4.2.orig/bitmap.c0100644000175000001440000001213306045657116014577 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* bitmap.c handle arbitary length bit maps Dominique Petitpierre, ISSCO Summer 1994 */ #include "bitmap.h" #include "mymalloc.h" long next_bit(bitmap, from_position) s_bitmap *bitmap; long from_position; { register long pos; /* TODO skip zero chunks */ pos = from_position; /* there is a sentinel bit at the end of the bitmap */ while (!TEST_BIT(bitmap->bits[WORD_OFFSET(pos)], pos)) pos++; if (pos < bitmap->size) return (pos); else return (-1); } void unset_bit(bitmap, pos) s_bitmap *bitmap; long pos; { #ifdef DEBUG if (pos < 0 || pos > bitmap->size) /* allow for sentinel */ fatal_error("bit position is %d, bitmap size=%d", pos, bitmap->size); #endif /* beware: bit position not checked */ UNSET_BIT(bitmap->bits[WORD_OFFSET(pos)], pos); } void set_bit(bitmap, pos) s_bitmap *bitmap; long pos; { #ifdef DEBUG if (pos < 0 || pos > bitmap->size) /* allow for sentinel */ fatal_error("bit position is %d, bitmap size=%d", pos, bitmap->size); #endif /* beware: bit position not checked */ SET_BIT(bitmap->bits[WORD_OFFSET(pos)], pos); } int /* boolean */ test_bit(bitmap, pos) s_bitmap *bitmap; long pos; { #ifdef DEBUG if (pos < 0 || pos > bitmap->size) /* allow for sentinel */ fatal_error("bit position is %d, bitmap size=%d", pos, bitmap->size); #endif /* beware: bit position not checked */ return (TEST_BIT(bitmap->bits[WORD_OFFSET(pos)], pos)); } s_bitmap * new_bitmap(size) long size; { s_bitmap *bitmap; MY_MALLOC(bitmap, s_bitmap); MY_CALLOC(bitmap->bits, size / BITS(WORD_TYPE) + 1, WORD_TYPE); bitmap->size = size; /* add sentinel bit */ set_bit(bitmap, size); return (bitmap); } void free_bitmap(bitmap) s_bitmap *bitmap; { if (bitmap->bits != NULL) MY_FREE(bitmap->bits); MY_FREE(bitmap); } /* return a boolean value */ int has_unique_bit(word) WORD_TYPE word; { /* could be improved by considering the bytes composing the word */ if (word == NO_BITS) return (0); else { register WORD_TYPE w; w = word; /* shift until a bit appears in position 1 */ while (!(w & FIRST_BIT)) w >>= 1; return (w == FIRST_BIT); } } int /* boolean */ set_if_not_set(bitmap, pos) s_bitmap *bitmap; long pos; { #ifdef DEBUG if (pos < 0 || pos > bitmap->size) /* allow for sentinel */ fatal_error("bit position is %d, bitmap size=%d", pos, bitmap->size); #endif /* beware: bit position not checked */ if (TEST_BIT(bitmap->bits[WORD_OFFSET(pos)], pos)) return (0); else { SET_BIT(bitmap->bits[WORD_OFFSET(pos)], pos); return (1); } } /* bitmap equivalent of b1 & b2 assume that the sizes are identical */ int test_and(bitmap1, bitmap2) s_bitmap *bitmap1; s_bitmap *bitmap2; { register WORD_TYPE *bits1; register WORD_TYPE *bits2; register WORD_TYPE *last_word; bits1 = bitmap1->bits; bits2 = bitmap2->bits; last_word = bitmap1->bits + bitmap1->size / BITS(WORD_TYPE); while (bits1 < last_word) if (*bits1++ & *bits2++) return (1); return (*bits1 & *bits2 & FULL_SET(bitmap1->size & MODULO_MASK) != NO_BITS); } void empty_bitmap(bitmap) s_bitmap *bitmap; { register WORD_TYPE *bits; register WORD_TYPE *last_word; bits = bitmap->bits; last_word = bits + bitmap->size / BITS(WORD_TYPE) + 1; while (bits < last_word) *bits++ = NO_BITS; set_bit(bitmap, bitmap->size); /* sentinel */ } void fill_bitmap(bitmap) s_bitmap *bitmap; { register WORD_TYPE *bits; register WORD_TYPE *last_word; bits = bitmap->bits; last_word = bits + bitmap->size / BITS(WORD_TYPE) + 1; while (bits < last_word) *bits++ = ALL_BITS; } /* bitmap equivalent of b1 |= b2 assume that the sizes are identical */ void assign_or(bitmap1, bitmap2) s_bitmap *bitmap1; s_bitmap *bitmap2; { register WORD_TYPE *bits1; register WORD_TYPE *bits2; register WORD_TYPE *last_word; bits1 = bitmap1->bits; bits2 = bitmap2->bits; last_word = bits1 + bitmap1->size / BITS(WORD_TYPE) + 1; while (bits1 < last_word) *bits1++ |= *bits2++; } /* bitmap equivalent of b1 &= b2 assume that the sizes are identical */ void assign_and(bitmap1, bitmap2) s_bitmap *bitmap1; s_bitmap *bitmap2; { register WORD_TYPE *bits1; register WORD_TYPE *bits2; register WORD_TYPE *last_word; bits1 = bitmap1->bits; bits2 = bitmap2->bits; last_word = bitmap1->bits + bitmap1->size / BITS(WORD_TYPE) + 1; while (bits1 < last_word) *bits1++ &= *bits2++; } /* bitmap equivalent of b1 = ~ b1 */ void negate_bitmap(bitmap) s_bitmap *bitmap; { register WORD_TYPE *bits; register WORD_TYPE *last_word; bits = bitmap->bits; last_word = bitmap->bits + bitmap->size / BITS(WORD_TYPE) + 1; while (bits < last_word) { *bits = ~(*bits); bits++; } /* restore the sentinel bit */ set_bit(bitmap, bitmap->size); } mmorph-2.3.4.2.orig/bitmap.h0100644000175000001440000000277106045657120014606 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef bitmap_h #define bitmap_h #include "config.h" #include #define WORD_TYPE unsigned long #define WORD_SIZE BITS(WORD_TYPE) #define MODULO_MASK (WORD_SIZE-1) /* DIV_SHIFT is log2(WORD_SIZE) */ #if SIZEOF_LONG == 4 #define DIV_SHIFT 5 #endif #if SIZEOF_LONG == 8 #define DIV_SHIFT 6 #endif #define FIRST_BIT ((WORD_TYPE) 1L) #define NO_BITS ((WORD_TYPE) 0L) #define ALL_BITS (~ NO_BITS) #define WORD_OFFSET(n) ((WORD_TYPE) (n) >> DIV_SHIFT) #define BIT_N(n) (FIRST_BIT << ((int) (n) & MODULO_MASK)) #define SET_BIT(word,bit) ((word) |= BIT_N(bit)) #define UNSET_BIT(word,bit) ((word) &= ~ BIT_N(bit)) #define TEST_BIT(word,bit) ((word) & BIT_N(bit)) #define FULL_SET(n) (ALL_BITS >> (WORD_SIZE - (int)(n))) #define FOR_EACH_BIT(map,n) \ for ((n) = next_bit((map), 0L); (n) >= 0L;\ (n) = next_bit((map), (long) ((n) + 1L))) typedef struct { long size; WORD_TYPE *bits; } s_bitmap; extern long next_bit(); extern void unset_bit(); extern void set_bit(); extern int test_bit(); extern s_bitmap *new_bitmap(); extern void free_bitmap(); extern int has_unique_bit(); extern void assign_and(); extern void assign_or(); extern void negate_bitmap(); extern void empty_bitmap(); extern void fill_bitmap(); extern int set_if_not_set(); extern int test_and(); #endif /* bitmap_h */ mmorph-2.3.4.2.orig/chain.c0100644000175000001440000000416506045657122014410 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* bitmap.c handle circular list (chains) used to preserve order of insertion. Dominique Petitpierre, ISSCO Summer 1994 */ #include "config.h" #include "chain.h" #include "mymalloc.h" s_chain * insert_chain_link(chain, item) s_chain *chain; char *item; { s_chain *new_chain_link; MY_MALLOC(new_chain_link, s_chain); new_chain_link->item = item; if (chain) { new_chain_link->next = chain->next; /* keep track of first link */ chain->next = new_chain_link; /* append link */ } else { new_chain_link->next = new_chain_link; /* first link is last link */ } return (new_chain_link); /* last link */ } s_chain * reverse_chain(chain) s_chain *chain; { s_chain *previous_chain_link; s_chain *next_current; s_chain *current_chain_link; s_chain *start_chain; if (chain) { previous_chain_link = chain; start_chain = chain->next; current_chain_link = start_chain; do { next_current = current_chain_link->next; current_chain_link->next = previous_chain_link; previous_chain_link = current_chain_link; current_chain_link = next_current; } while (current_chain_link != start_chain); return (current_chain_link); /* new last link */ } else return (chain); } void map_chain(chain, action) s_chain *chain; void (*action) (); { s_chain *start_chain; s_chain *current_chain_link; if (chain) { start_chain = chain->next; current_chain_link = start_chain; do { action(current_chain_link->item); current_chain_link = current_chain_link->next; } while (current_chain_link != start_chain); } } void free_chain(chain) s_chain *chain; { s_chain *current_chain_link; s_chain *next; if (chain) { current_chain_link = chain; do { next = current_chain_link->next; MY_FREE(current_chain_link); current_chain_link = next; } while (current_chain_link != chain); } } mmorph-2.3.4.2.orig/chain.h0100644000175000001440000000071406045657124014413 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef chain_h #define chain_h typedef struct chain_s { char *item; struct chain_s *next; } s_chain; extern s_chain *insert_chain_link(); extern s_chain *reverse_chain(); extern void map_chain(); extern void free_chain(); #endif /* chain_h */ mmorph-2.3.4.2.orig/combine.c0100644000175000001440000002432306045657126014744 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* combine.c handle combination of affix and binary rules Dominique Petitpierre, ISSCO Summer 1994 */ #include "user.h" s_bitmap *rule_maps[_last_rule_kind]; static int combined_rule_card; int rule_instance_card; s_rule_instance **rule_instance_ref; /* for every binary rule, for every affix try to combine the affix on the right and on the left of the rule. Each combined rule is put in the applicable rule list. TODO: involve unary rules in the process (chain of unary rules). */ static s_var_map * new_var_map(local_index, foreign_index) t_index local_index; t_index foreign_index; { s_var_map *var_map; MY_MALLOC(var_map, s_var_map); var_map->local_index = local_index; var_map->foreign_index = foreign_index; return (var_map); } void fill_rule_maps(rule_ref) s_symbol **rule_ref; { s_symbol **ref; for (ref = rule_ref; *ref != NULL; ref++) { set_bit(rule_maps[(*ref)->data->rule.instance->rule_kind], (long) (ref - rule_ref)); } } /* perform the unification of two tfs that have been checked to match */ static s_tfs * unify_tfs(rule_tfs, lex_tfs) s_tfs *rule_tfs; s_tfs *lex_tfs; { s_tfs *result_tfs; register t_value *t; register t_value *r; register t_value *l; result_tfs = new_tfs(rule_tfs->type); t = result_tfs->att_list; r = rule_tfs->att_list; l = lex_tfs->att_list; while ((*t++ = *r++ & *l++) != NO_BITS) { } return (result_tfs); } static s_tfs * copy_tfs(result_tfs, master_tfs, var_source_tfs, variable_ref, master_index, var_source_index) s_tfs *result_tfs; s_tfs *master_tfs; s_tfs *var_source_tfs; s_symbol **variable_ref; int master_index; int var_source_index; { register t_value *val_result; register t_value *val_master; register t_value *val_source; t_value v; s_var_map **var_map; int var_map_size; s_symbol **var; t_index *tfs_index; t_boolean is_new; is_new = (result_tfs == NULL); if (is_new) { result_tfs = new_tfs(master_tfs->type); } val_result = result_tfs->att_list; val_master = master_tfs->att_list; while ((*val_result++ = *val_master++) != NO_BITS) { } var_map = NULL; var_map_size = 0; val_result = result_tfs->att_list; val_source = var_source_tfs->att_list; for (var = variable_ref; *var != NULL; var++) { tfs_index = (*var)->data->variable.tfs_index; if (tfs_index[master_index] != NO_INDEX && tfs_index[var_source_index] != NO_INDEX) { /* copy the possibly new corresponding value. no need to unify since all variable positions have already been unified in check_var_map() */ v = val_result[tfs_index[master_index]] = val_source[tfs_index[var_source_index]]; if (!has_unique_bit(v)) { if (var_map_size == 0) { MY_CALLOC(var_map, 2, s_var_map *); } else { MY_REALLOC(var_map, var_map_size + 2, s_var_map *); } var_map[var_map_size + 1] = NULL; /* sentinel */ if (is_new) var_map[var_map_size] = new_var_map(tfs_index[master_index], /* local_index */ tfs_index[var_source_index]); /* foreign */ else /* affix branch will never provide values again but might want to receive some at percolate down time */ var_map[var_map_size] = new_var_map(tfs_index[var_source_index], /* local */ tfs_index[master_index]); /* foreign */ var_map_size++; } } } if (is_new) result_tfs->var_map = var_map; else var_source_tfs->var_map = var_map; return (result_tfs); } static t_str concat_3_strings(string1, string2, string3) t_str string1; t_str string2; t_str string3; { int length1; int length1_2; t_str string_new; length1 = strlen(string1); length1_2 = length1 + strlen(string2); MY_STRALLOC(string_new, length1_2 + strlen(string3) + 1); (void) strcpy(string_new, string1); (void) strcpy(string_new + length1, string2); (void) strcpy(string_new + length1_2, string3); return (string_new); } static s_rule_instance * combine_rule(binary_index, lexical_index, rule_ref, rule_kind) long binary_index; long lexical_index; s_symbol **rule_ref; e_rule_kind rule_kind; { s_rule_instance *result; s_rule_instance *binary_rule; s_rule_instance *lexical_rule; s_tfs *affix_tfs; s_tfs *arg_tfs; int affix_side; int arg_side; s_symbol **variable_ref; s_symbol *new_rule_sym; binary_rule = rule_ref[binary_index]->data->rule.instance; lexical_rule = rule_ref[lexical_index]->data->rule.instance; if (rule_kind == Prefix) { affix_tfs = binary_rule->first; arg_tfs = binary_rule->second; affix_side = 1; arg_side = 2; } else { /* suffix */ affix_tfs = binary_rule->second; arg_tfs = binary_rule->first; affix_side = 2; arg_side = 1; } if (match_tfs(affix_tfs, lexical_rule->lhs)) { MY_MALLOC(result, s_rule_instance); result->rule_kind = rule_kind; result->second = unify_tfs(affix_tfs, lexical_rule->lhs); variable_ref = rule_ref[binary_index]->data->rule.variable_set.ref; result->first = /* NULL indicate that creation is necessary */ copy_tfs((s_tfs *) NULL, arg_tfs, result->second, variable_ref, arg_side, affix_side); result->lhs = /* NULL indicate that creation is necessary */ copy_tfs((s_tfs *) NULL, binary_rule->lhs, arg_tfs, variable_ref, 0, arg_side); result->lhs = copy_tfs(result->lhs, binary_rule->lhs, result->second, variable_ref, 0, affix_side); result->lex = lexical_rule->lex; /* watchout when freeing */ result->lex_length = lexical_rule->lex_length; MY_MALLOC(new_rule_sym, s_symbol); new_rule_sym->kind = Rule; new_rule_sym->name = concat_3_strings(rule_ref[binary_index]->name, (rule_kind == Prefix ? "<" : ">"), rule_ref[lexical_index]->name); if (debug & DEBUG_COMBINE) print_out("combined rule: %s\n", new_rule_sym->name); new_rule_sym->ordinal = combined_rule_card++; /* no used ?? */ /* the data part is not filled */ result->rule_link = new_rule_sym; return (result); } else return (NULL); } t_ptr *current_ref; /* extra argument passed to ref_is_item() */ /* action passed to map_chain */ static void ref_is_arg(item) t_ptr item; { *current_ref = item; current_ref++; } static void warn_for_each_member(rule_map, rule_ref, format) s_bitmap *rule_map; s_symbol **rule_ref; char *format; { int rule_index; for (rule_index = next_bit(rule_map, 0L); rule_index >= 0L; rule_index = next_bit(rule_map, rule_index + 1L)) { print_warning(format, rule_ref[rule_index]->name); } } void combine_all(binary_map, lexical_map, rule_ref) s_bitmap *binary_map; s_bitmap *lexical_map; s_symbol **rule_ref; { long binary_index; long lexical_index; s_rule_instance *result_suffix; s_rule_instance *result_prefix; s_chain *rule_chain; int binary_count; int lexical_count; int suffix_count; int prefix_count; s_bitmap *suffix_map; s_bitmap *prefix_map; s_bitmap *temp_bitmap; rule_chain = NULL; combined_rule_card = 0; binary_count = 0; lexical_count = 0; /* in case there is no binary rules */ prefix_map = new_bitmap(lexical_map->size); suffix_map = new_bitmap(lexical_map->size); for (binary_index = next_bit(binary_map, 0L); binary_index >= 0L; binary_index = next_bit(binary_map, binary_index + 1L)) { binary_count++; lexical_count = 0; suffix_count = 0; prefix_count = 0; for (lexical_index = next_bit(lexical_map, 0L); lexical_index >= 0L; lexical_index = next_bit(lexical_map, lexical_index + 1L)) { lexical_count++; /* count many times but who cares */ result_prefix = combine_rule(binary_index, lexical_index, rule_ref, Prefix); if (result_prefix != NULL) { rule_chain = insert_chain_link(rule_chain, (t_ptr) result_prefix); prefix_count++; set_bit(prefix_map, lexical_index); } result_suffix = combine_rule(binary_index, lexical_index, rule_ref, Suffix); if (result_suffix != NULL) { rule_chain = insert_chain_link(rule_chain, (t_ptr) result_suffix); suffix_count++; set_bit(suffix_map, lexical_index); } } if (suffix_count > 0 && prefix_count > 0) print_warning("binary rule \"%s\" %s", rule_ref[binary_index]->name, "combines both with prefixes and suffixes"); else if (suffix_count == 0 && prefix_count == 0) print_warning("binary rule \"%s\" %s", rule_ref[binary_index]->name, "does not combine with any affix"); } temp_bitmap = new_bitmap(lexical_map->size); assign_or(temp_bitmap, suffix_map); assign_and(temp_bitmap, prefix_map); warn_for_each_member(temp_bitmap, rule_ref, "affix rule \"%s\" combines both as prefix and suffix"); assign_or(prefix_map, suffix_map); negate_bitmap(prefix_map); assign_and(prefix_map, lexical_map); warn_for_each_member(prefix_map, rule_ref, "affix rule \"%s\" does not combine with any binary rule"); free_bitmap(temp_bitmap); free_bitmap(suffix_map); free_bitmap(prefix_map); /* put all interesting rule instances in an array new ones and old ones that are neither binary nor affix (Lexical). */ rule_instance_card = symbol_set[Rule].card - lexical_count - binary_count + combined_rule_card; MY_CALLOC(rule_instance_ref, rule_instance_card + 1, s_rule_instance *); rule_instance_ref[rule_instance_card] = NULL; /* sentinel */ current_ref = (t_ptr *) rule_instance_ref; /* global argument */ map_chain(rule_chain, ref_is_arg); /* TODO preserve rule order */ assign_or(binary_map, lexical_map); negate_bitmap(binary_map); /* binary_map is now non_binary_map! */ for (binary_index = next_bit(binary_map, 0L); binary_index >= 0L; binary_index = next_bit(binary_map, binary_index + 1L)) { *current_ref++ = (t_ptr) rule_ref[binary_index]->data->rule.instance; } free_chain(rule_chain); } mmorph-2.3.4.2.orig/combine.h0100644000175000001440000000063606045657127014753 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef combine_h #define combine_h extern s_bitmap *rule_maps[]; extern int rule_instance_card; extern s_rule_instance **rule_instance_ref; extern void fill_rule_maps(); extern void combine_all(); #endif /* combine_h */ mmorph-2.3.4.2.orig/config.h0100644000175000001440000000255306241557100014570 0ustar mvelausers/* config.h. Generated automatically by configure. */ /* config.h.in. Generated automatically from configure.in by autoheader. */ #ifndef config_h #define config_h /* Define to empty if the keyword does not work. */ /* #undef const */ /* Define to `long' if doesn't define. */ /* #undef off_t */ /* Define to `unsigned' if doesn't define. */ /* #undef size_t */ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* The number of bytes in a long. */ #define SIZEOF_LONG 4 /* Define if you have the header file. */ #define HAVE_LIMITS_H 1 /* Define if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define if you have the header file. */ #define HAVE_STRING_H 1 /* Define if you have the header file. */ #define HAVE_SYS_FILE_H 1 /* Define if you have the header file. */ #define HAVE_UNISTD_H 1 /* this file will be appended to the bottom of config.h */ #ifdef HAVE_SYS_FILE_H # include #endif #ifdef HAVE_UNISTD_H # include #endif /* TODO: An ANSI string.h and pre-ANSI memory.h might conflict. */ #if defined (HAVE_STRING_H) # include #else # include #endif #if defined (HAVE_MEMORY_H) # include #else # define memcpy(D, S, N) bcopy((S), (D), (N)) #endif #endif /* ! config_h */ mmorph-2.3.4.2.orig/config.h.in0100644000175000001440000000241405725326666015212 0ustar mvelausers/* config.h.in. Generated automatically from configure.in by autoheader. */ #ifndef config_h #define config_h /* Define to empty if the keyword does not work. */ #undef const /* Define to `long' if doesn't define. */ #undef off_t /* Define to `unsigned' if doesn't define. */ #undef size_t /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS /* The number of bytes in a long. */ #undef SIZEOF_LONG /* Define if you have the header file. */ #undef HAVE_LIMITS_H /* Define if you have the header file. */ #undef HAVE_MEMORY_H /* Define if you have the header file. */ #undef HAVE_STRING_H /* Define if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define if you have the header file. */ #undef HAVE_UNISTD_H /* this file will be appended to the bottom of config.h */ #ifdef HAVE_SYS_FILE_H # include #endif #ifdef HAVE_UNISTD_H # include #endif /* TODO: An ANSI string.h and pre-ANSI memory.h might conflict. */ #if defined (HAVE_STRING_H) # include #else # include #endif #if defined (HAVE_MEMORY_H) # include #else # define memcpy(D, S, N) bcopy((S), (D), (N)) #endif #endif /* ! config_h */ mmorph-2.3.4.2.orig/configure0100755000175000001440000011133206000476342015056 0ustar mvelausers#!/bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.1 # Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE # Initialize some other variables. subdirs= ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -build | --build | --buil | --bui | --bu | --b) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=PREFIX install architecture-dependent files in PREFIX [same as prefix] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR --enable and --with options recognized:$ac_help EOF exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.1" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 unused; standard input # 1 file creation # 2 errors and warnings # 3 unused; some systems may open it to /dev/tty # 4 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 4>/dev/null else exec 4>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set LANG and LC_ALL to C if already set. # These must not be set unconditionally because not all systems understand # e.g. LANG=C (notably SCO). if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LANG+set}" = set; then LANG=C; export LANG; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=user.y # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} $CFLAGS $CPPFLAGS conftest.$ac_ext -c 1>&5 2>&5' ac_link='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext -o conftest $LIBS 1>&5 2>&5' if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi # Extract the first word of "byacc", so it can be a program name with args. set dummy byacc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_prog_BYACC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else if test -n "$BYACC"; then ac_cv_prog_BYACC="$BYACC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_BYACC="byacc" break fi done IFS="$ac_save_ifs" fi fi BYACC="$ac_cv_prog_BYACC" if test -n "$BYACC"; then echo "$ac_t""$BYACC" 1>&4 else echo "$ac_t""no" 1>&4 fi # Extract the first word of "bison", so it can be a program name with args. set dummy bison; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_prog_BISON'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else if test -n "$BISON"; then ac_cv_prog_BISON="$BISON" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_BISON="bison -y" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_BISON" && ac_cv_prog_BISON="BYACC" fi fi BISON="$ac_cv_prog_BISON" if test -n "$BISON"; then echo "$ac_t""$BISON" 1>&4 else echo "$ac_t""no" 1>&4 fi # Extract the first word of "yacc", so it can be a program name with args. set dummy yacc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_prog_YACC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_YACC="yacc" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_YACC" && ac_cv_prog_YACC="BISON" fi fi YACC="$ac_cv_prog_YACC" if test -n "$YACC"; then echo "$ac_t""$YACC" 1>&4 else echo "$ac_t""no" 1>&4 fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&4 else echo "$ac_t""no" 1>&4 fi echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else cat > conftest.c <&5 | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&4 if test $ac_cv_prog_gcc = yes; then GCC=yes if test "${CFLAGS+set}" != set; then echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_prog_gcc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_gcc_g=yes else ac_cv_prog_gcc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_gcc_g" 1>&4 if test $ac_cv_prog_gcc_g = yes; then CFLAGS="-g -O" else CFLAGS="-O" fi fi else GCC= test "${CFLAGS+set}" = set || CFLAGS="-g" fi echo $ac_n "checking whether ${MAKE-make} sets \$MAKE""... $ac_c" 1>&4 set dummy ${MAKE-make}; ac_make=$2 if eval "test \"`echo '${'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else cat > conftestmake <<\EOF all: @echo 'ac_maketemp="${MAKE}"' EOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftestmake fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$ac_t""yes" 1>&4 SET_MAKE= else echo "$ac_t""no" 1>&4 SET_MAKE="MAKE=${MAKE-make}" fi # Extract the first word of "sh", so it can be a program name with args. set dummy sh; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_path_BOURNESHELL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else case "$BOURNESHELL" in /*) ac_cv_path_BOURNESHELL="$BOURNESHELL" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_path_BOURNESHELL="$ac_dir/$ac_word" break fi done IFS="$ac_save_ifs" ;; esac fi BOURNESHELL="$ac_cv_path_BOURNESHELL" if test -n "$BOURNESHELL"; then echo "$ac_t""$BOURNESHELL" 1>&4 else echo "$ac_t""no" 1>&4 fi echo $ac_n "checking for -lc""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_lib_c'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else ac_save_LIBS="$LIBS" LIBS="$LIBS -lc " cat > conftest.$ac_ext <&4 LIBS="$LIBS" else echo "$ac_t""no" 1>&4 echo $ac_n "checking for -lnsl""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_lib_nsl'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else ac_save_LIBS="$LIBS" LIBS="$LIBS -lnsl " cat > conftest.$ac_ext <&4 ac_tr_lib=HAVE_LIB`echo nsl | tr 'a-z' 'A-Z'` cat >> confdefs.h <&4 fi fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&4 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '${'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi fi CPP="$ac_cv_prog_CPP" echo "$ac_t""$CPP" 1>&4 # If we cannot run a trivial program, we must be cross compiling. echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_c_cross'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else if test "$cross_compiling" = yes; then ac_cv_cross=yes else cat > conftest.$ac_ext </dev/null; then ac_cv_c_cross=no else ac_cv_c_cross=yes fi fi rm -fr conftest* fi cross_compiling=$ac_cv_c_cross echo "$ac_t""$ac_cv_c_cross" 1>&4 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else cat > conftest.$ac_ext < #include #include #include EOF eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then ac_cv_header_stdc=no else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF eval $ac_link if test -s conftest && (./conftest; exit) 2>/dev/null; then : else ac_cv_header_stdc=no fi fi rm -fr conftest* fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&4 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi for ac_hdr in limits.h sys/file.h unistd.h memory.h string.h do ac_safe=`echo "$ac_hdr" | tr './\055' '___'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else cat > conftest.$ac_ext < EOF eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&4 ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'` cat >> confdefs.h <&4 fi done echo $ac_n "checking for working const""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else cat > conftest.$ac_ext <j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } ; return 0; } EOF if eval $ac_compile; then rm -rf conftest* ac_cv_c_const=yes else rm -rf conftest* ac_cv_c_const=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_c_const" 1>&4 if test $ac_cv_c_const = no; then cat >> confdefs.h <<\EOF #define const EOF fi echo $ac_n "checking for off_t""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_type_off_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "off_t" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_off_t=yes else rm -rf conftest* ac_cv_type_off_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_off_t" 1>&4 if test $ac_cv_type_off_t = no; then cat >> confdefs.h <<\EOF #define off_t long EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "size_t" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_size_t=yes else rm -rf conftest* ac_cv_type_size_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_size_t" 1>&4 if test $ac_cv_type_size_t = no; then cat >> confdefs.h <<\EOF #define size_t unsigned EOF fi echo $ac_n "checking size of long""... $ac_c" 1>&4 if eval "test \"`echo '${'ac_cv_sizeof_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&4 else if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext < main() { FILE *f=fopen("conftestval", "w"); if (!f) exit(1); fprintf(f, "%d\n", sizeof(long)); exit(0); } EOF eval $ac_link if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_sizeof_long=`cat conftestval` fi fi rm -fr conftest* fi echo "$ac_t""$ac_cv_sizeof_long" 1>&4 cat >> confdefs.h < $cache_file <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # Ultrix sh set writes to stderr and can't be redirected directly. (set) 2>&1 | sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p" \ >> $cache_file else echo "not updating unwritable cache $cache_file" fi trap 'rm -fr conftest* confdefs* core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 DEFS=-DHAVE_CONFIG_H # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.1" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir trap 'rm -fr Makefile config.h conftest*; exit 1' 1 2 15 # Protect against being on the right side of a sed subst in config.status. sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF $ac_vpsub $extrasub s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@BYACC@%$BYACC%g s%@BISON@%$BISON%g s%@YACC@%$YACC%g s%@CC@%$CC%g s%@SET_MAKE@%$SET_MAKE%g s%@BOURNESHELL@%$BOURNESHELL%g s%@CPP@%$CPP%g CEOF EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust relative srcdir, etc. for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/$ac_dir" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g " -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file fi; done rm -f conftest.subs # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' ac_dC='\3' ac_dD='%g' # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='\([ ]\)%\1#\2define\3' ac_uC=' ' ac_uD='\4%g' # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_eB='$%\1#\2define\3' ac_eC=' ' ac_eD='%g' CONFIG_HEADERS=${CONFIG_HEADERS-"config.h"} for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then # Support "outfile[:infile]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac echo creating $ac_file rm -f conftest.frag conftest.in conftest.out cp $ac_given_srcdir/$ac_file_in conftest.in EOF # Transform confdefs.h into a sed script conftest.vals that substitutes # the proper values into config.h.in to produce config.h. And first: # Protect against being on the right side of a sed subst in config.status. # Protect against being in an unquoted here document in config.status. rm -f conftest.vals cat > conftest.hdr <<\EOF s/[\\&%]/\\&/g s%[\\$`]%\\&%g s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp s%ac_d%ac_u%gp s%ac_u%ac_e%gp EOF sed -n -f conftest.hdr confdefs.h > conftest.vals rm -f conftest.hdr # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >> conftest.vals <<\EOF s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% EOF # Break up conftest.vals because some shells have a limit on # the size of here documents, and old seds have small limits too. # Maximum number of lines to put in a single here document. ac_max_here_lines=12 rm -f conftest.tail while : do ac_lines=`grep -c . conftest.vals` # grep -c gives empty output for an empty file on some AIX systems. if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi # Write a limited-size here document to conftest.frag. echo ' cat > conftest.frag <> $CONFIG_STATUS sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS echo 'CEOF sed -f conftest.frag conftest.in > conftest.out rm -f conftest.in mv conftest.out conftest.in ' >> $CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail rm -f conftest.vals mv conftest.tail conftest.vals done rm -f conftest.vals cat >> $CONFIG_STATUS <<\EOF rm -f conftest.frag conftest.h echo "/* $ac_file. Generated automatically by configure. */" > conftest.h cat conftest.in >> conftest.h rm -f conftest.in if cmp -s $ac_file conftest.h 2>/dev/null; then echo "$ac_file is unchanged" rm -f conftest.h else rm -f $ac_file mv conftest.h $ac_file fi fi; done date >stamp-h exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS mmorph-2.3.4.2.orig/configure.in0100644000175000001440000000226406000476344015465 0ustar mvelausersdnl Process this file with autoconf to produce a configure script. AC_INIT(user.y) dnl main configure file AC_CONFIG_HEADER(config.h) dnl Checks for programs. dnl AC_PROG_YACC dnl prefer yacc to bison to byacc: AC_CHECK_PROG(BYACC, byacc, byacc) AC_CHECK_PROG(BISON, bison, bison -y, BYACC) AC_CHECK_PROG(YACC, yacc, yacc, BISON) dnl prefer gcc to local cc AC_PROG_CC dnl prefer local cc to gcc: dnl AC_CHECK_PROG(GCC, gcc, gcc) dnl AC_CHECK_PROG(CC, cc, cc, GCC) AC_PROG_MAKE_SET AC_PATH_PROG(BOURNESHELL, sh) AC_CHECK_LIB(c, xdr_void, LIBS="$LIBS" , AC_CHECK_LIB(nsl, xdr_void)) dnl should check that flex is installed dnl AC_PROG_LEX dnl should check that db is installed dnl Checks for libraries. dnl AC_CHECK_LIB(db, dbopen) dnl Checks for header files. AC_HEADER_STDC dnl AC_CHECK_HEADERS(fcntl.h) AC_CHECK_HEADERS(limits.h sys/file.h unistd.h memory.h string.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_OFF_T AC_TYPE_SIZE_T AC_CHECK_SIZEOF(long) dnl Checks for library functions. dnl AC_FUNC_VPRINTF write _doprint code if not available dnl AC_CHECK_FUNCS(strdup) might miss a prototype with POSIX compliance AC_OUTPUT(Makefile, date >stamp-h) mmorph-2.3.4.2.orig/crc32file.c0100644000175000001440000001236705775622500015106 0ustar mvelausers/* a few improvements by DJB 930708 */ /* nonreverse table included by DJB 930622 */ /* interface mods by DJB 930529 */ /* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or */ /* code or tables extracted from it, as desired without restriction. */ /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */ /* polynomial $edb88320 */ #include "crc32file.h" static unsigned long crc_32_tab[] = { 0x0, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 }; void crc32file_clear(c) crc32file *c; { c->c = 0; c->len[0] = c->len[1] = c->len[2] = c->len[3] = c->len[4] = c->len[5] = c->len[6] = c->len[7] = 0; } void crc32file_addn(c, s, n) crc32file *c; register unsigned char *s; int n; { register unsigned long x; unsigned char newc; register int i; i = n; while (i >= 256) { if (!++c->len[1]) if (!++c->len[2]) if (!++c->len[3]) if (!++c->len[4]) if (!++c->len[5]) if (!++c->len[6]) ++c->len[7]; i -= 256; } newc = i; if ((c->len[0] += newc) < newc) if (!++c->len[1]) if (!++c->len[2]) if (!++c->len[3]) if (!++c->len[4]) if (!++c->len[5]) if (!++c->len[6]) ++c->len[7]; i = n; x = c->c; while (i--) x = crc_32_tab[(int) ((x >> 24) ^ *s++) & 0xff] ^ (x << 8); c->c = x; } void crc32file_add(c, ch) crc32file *c; unsigned char ch; { register unsigned long x; x = c->c; c->c = crc_32_tab[(int) ((x >> 24) ^ ch) & 0xff] ^ (x << 8); if (!++c->len[0]) if (!++c->len[1]) if (!++c->len[2]) if (!++c->len[3]) if (!++c->len[4]) if (!++c->len[5]) if (!++c->len[6]) ++c->len[7]; } void crc32file_hash(c, h) crc32file *c; unsigned char *h; { register unsigned long x; unsigned char len[8]; int i; for (i = 0; i < 8; ++i) len[i] = c->len[i]; for (i = 7; i >= 0; --i) if (len[i]) break; crc32file_addn(c, len, i + 1); x = ~c->c; h[0] = x & 255; x /= 256; h[1] = x & 255; x /= 256; h[2] = x & 255; x /= 256; h[3] = x & 255; } mmorph-2.3.4.2.orig/crc32file.h0100644000175000001440000000043605767007350015106 0ustar mvelausers#ifndef CRC32FILE_H #define CRC32FILE_H typedef struct { unsigned long c; unsigned char len[8]; } crc32file; #define CRC32FILE_HASHLEN 4 extern void crc32file_clear(); extern void crc32file_add(); extern void crc32file_addn(); extern void crc32file_hash(); #endif mmorph-2.3.4.2.orig/database.c0100644000175000001440000003420206265176137015073 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* database.c handle the database storing and access modules Dominique Petitpierre, Summer 94 */ #include "user.h" #include #ifdef HAVE_LIMITS_H #include #endif /* redefine UINT_MAX for /usr/ucb/cc and SparcWorks compiler with option -Xs */ #if defined(sun) && defined(__unix) && defined(sparc) && ! defined(__STDC__) #ifdef UINT_MAX #undef UINT_MAX #define UINT_MAX 0xFFFFFFFF #endif #endif #include #include #include #include "mymalloc.h" #ifdef FLOCK #ifndef STDC_HEADERS extern int flock(); #endif #endif #define RECORD_CHUNK_SIZE 128 #define CHECK_RECORD_SIZE(size,incr,max) \ if (((size) += (incr)) > (max)) \ fatal_error("error in database: inconsistant record"); extern DB *dbopen(); static DB *db_forms; t_db_operation db_operation; static u_record_data db_record; /* storage for copying records from database */ static size_t db_record_size; static size_t max_db_record_size; /* allocated size of db_record */ /* open a hash database according to the operation to perform */ static DB * db_init(db_file_name, db_operation) char *db_file_name; t_db_operation db_operation; { char *error_msg; DB *db; HASHINFO hashinfo; max_db_record_size = RECORD_CHUNK_SIZE; MY_STRALLOC(db_record.string, max_db_record_size); db_record_size = 0; hashinfo.bsize = 1024; /* better for disk access, power of 2 */ hashinfo.ffactor = 25; /* average # of records per block of bsize */ hashinfo.nelem = 1; /* don't know how big */ hashinfo.cachesize = 64 * 1024; /* at least 6*bsize */ hashinfo.hash = NULL; /* default hash */ hashinfo.lorder = 4321; /* big endian */ /* [Dec1996 - anieto@crea.rae.es] */ #if defined(linux) hashinfo.lorder = 1234; /* little endian for linux on Intel x86 */ #endif if (db_operation & Create) { db = dbopen(db_file_name, O_CREAT | O_RDWR | O_TRUNC | O_EXCL, DB_MODE, DB_HASH, &hashinfo); error_msg = "for creation, or file exists already"; } else if (db_operation & Update) { /* TODO: find out if exclusive opening can be enforced */ db = dbopen(db_file_name, O_RDWR, DB_MODE, DB_HASH, &hashinfo); error_msg = "for updating,\nor file is in use"; } else { /* db_operation == Lookup */ db = dbopen(db_file_name, O_RDONLY, DB_MODE, DB_HASH, &hashinfo); error_msg = "for lookup"; } if (db == NULL) fatal_error("cannot open file \"%s\" %s (errno=%d)", db_file_name, error_msg, errno); #ifdef FLOCK /* timid attempt to limit risks of corruption with locks. Does not work across NFS. */ if (db_operation & (Create | Update)) { /* exclusive lock no one else is or will use the file */ if (flock((db->fd) (db), LOCK_EX | LOCK_NB) < 0) fatal_error("file %s is already in use (errno=%d)", db_file_name, errno); } else { /* shared lock: only other lookups can be done */ if (flock((db->fd) (db), LOCK_SH | LOCK_NB) < 0) fatal_error("file %s is beeing updated (errno=%d)", db_file_name, errno); } #endif #ifdef LOCKF /* Attempt to limit risks of corruption with locks. should work across NFS. Does not work because lockf does not let you have read locks (shared locks) */ if (db_operation & (Create | Update)) { /* exclusive lock no one else is or will use the file */ if (lockf((db->fd) (db), F_TLOCK, 0L) < 0) fatal_error("file %s is already in use (errno=%d)", db_file_name, errno); } else { /* shared lock: only other lookups can be done */ if (lockf((db->fd) (db), F_TEST, 0L) < 0) fatal_error("file %s is beeing updated (errno=%d)", db_file_name, errno); } #endif return (db); } /* wrapper to open db_forms */ void db_forms_init(db_file_name, db_operation) char *db_file_name; t_db_operation db_operation; { db_forms = db_init(db_file_name, db_operation); } /* creates an external representation of the tfs, append it at the end of record->data and update record->size suitable to be stored in the database. */ static void make_db_record(surface_lex, base_lex, tfs_index) t_letter *surface_lex; t_letter *base_lex; int tfs_index; { u_record_data data; int entry_length; int base_lex_length; size_t initial_size; /* TODO: squeeze into as little bits as possible. Use XDR to have an external representation */ if (strcmp((char *) surface_lex, (char *) base_lex) == 0) base_lex_length = 0; /* beware: this prevents zero length words */ else base_lex_length = strlen((char *) base_lex); if (base_lex_length > UCHAR_MAX) { print_warning("base form string truncated to %d characters:\n\"", UCHAR_MAX); print_string(logfile, base_lex); print_log("\"\n"); base_lex_length = UCHAR_MAX; } entry_length = base_lex_length + sizeof(t_card) + 1; initial_size = db_record_size; /* save initial value */ db_record_size += entry_length; if (db_record_size > max_db_record_size) { max_db_record_size = db_record_size + RECORD_CHUNK_SIZE; MY_REALLOC(db_record.string, max_db_record_size, char); } data.string = db_record.string + initial_size; *(data.string++) = (char) base_lex_length; (void) strcpy((char *) data.string, (char *) base_lex); data.string += base_lex_length; T_CARD_TO_STRING(tfs_index, data.string); } static void db_store_entry(db, surface_lex, surface_lex_length, base_lex, tfs_index) DB *db; t_letter *surface_lex; int surface_lex_length; t_letter *base_lex; int tfs_index; { DBT key; DBT record; int db_status; int error; key.size = (size_t) surface_lex_length; key.data = (void *) surface_lex; db_status = (db->get) (db, &key, &record, 0); if (db_status < 0) { /* is surface_lex already there? */ error = errno; /* save value */ print_log("for search key: \""); print_string(logfile, surface_lex); fatal_error("error while reading database (errno=%d=%s)", error, (error < sys_nerr ? sys_errlist[error] : "?")); } if (db_status > 0) { /* new lex */ db_record_size = 0; make_db_record(surface_lex, base_lex, tfs_index); record.data = (void *) db_record.string; record.size = db_record_size; db_status = (db->put) (db, &key, &record, 0); } else { /* lex exists in db */ db_record_size = record.size; if (db_record_size > max_db_record_size) { max_db_record_size = db_record_size + RECORD_CHUNK_SIZE; MY_FREE(db_record.string); MY_STRALLOC(db_record.string, max_db_record_size); } (void) memcpy((T_PTR) db_record.string, (T_PTR) record.data, db_record_size); make_db_record(surface_lex, base_lex, tfs_index); record.data = (void *) db_record.string; record.size = db_record_size; db_status = (db->put) (db, &key, &record, 0); } if (db_status < 0) { error = errno; /* save value */ print_log("for search key: \""); print_string(logfile, surface_lex); fatal_error("\" error while writing database (errno=%d=%s)", error, (error < sys_nerr ? sys_errlist[error] : "?")); } } /* wrapper to db_store_entry */ void db_store_form(surface_lex, surface_lex_length, base_lex, tfs_index) t_letter *surface_lex; int surface_lex_length; t_letter *base_lex; int tfs_index; { db_store_entry(db_forms, surface_lex, surface_lex_length, base_lex, tfs_index); } static void db_lookup_entry(db, surface_lex, record) DB *db; t_letter *surface_lex; DBT *record; { DBT key; int db_status; int error; key.size = (size_t) strlen((char *) surface_lex); key.data = (void *) surface_lex; db_status = (db->get) (db, &key, record, 0); if (db_status < 0) { /* is surface_lex there? */ error = errno; /* save value */ print_log("for search key: \""); print_string(logfile, surface_lex); fatal_error("\" error while reading database (errno=%d=%s)", error, (error < sys_nerr ? sys_errlist[error] : "?")); } if (db_status > 0) { record->data = NULL; record->size = 0; } } static void print_projection(segment_id, record, surface_lex) t_segment_id segment_id; DBT *record; t_letter *surface_lex; { u_record_data data; int size; int length; unsigned char base_lex_length; t_card tfs_index; size = 0; data.string = (char *) record->data; while (size < record->size) { /* for each sub record */ base_lex_length = (unsigned char) *data.string; /* check that the string length is reasonable */ length = base_lex_length + 1; CHECK_RECORD_SIZE(size, length + sizeof(t_card), record->size); if (want_segment_id) print_out("%d\t\"", segment_id); else print_out("\""); print_string(outfile, surface_lex); print_out("\" = \""); if (base_lex_length >= 1) print_string_l(outfile, (t_letter *) data.string + 1, (int) base_lex_length); else print_string(outfile, surface_lex); print_out("\" "); data.string += length; STRING_TO_T_CARD(data.string, tfs_index); print_tfs_proj(&tfs_table[tfs_index]); data.string += sizeof(t_card); } } static void print_projection_tbl(record, surface_lex) DBT *record; t_letter *surface_lex; { u_record_data data; int size; int length; unsigned char base_lex_length; t_card tfs_index; size = 0; data.string = (char *) record->data; while (size < record->size) { /* for each sub record */ if (size != 0) print_out("%c", SUBFIELD_SEP); base_lex_length = (unsigned char) *data.string; /* check that the string length is reasonable */ length = base_lex_length + 1; CHECK_RECORD_SIZE(size, length + sizeof(t_card), record->size); if (base_lex_length >= 1) { print_string_l(outfile, (t_letter *) data.string + 1, (int) base_lex_length); print_out("%c", SUBSUBFIELD_SEP); } else if (surface_lex == NULL) print_out("=%c", SUBSUBFIELD_SEP); else { print_string(outfile, surface_lex); print_out("%c", SUBSUBFIELD_SEP); } data.string += length; STRING_TO_T_CARD(data.string, tfs_index); print_tfs_proj_tbl(&tfs_table[tfs_index]); data.string += sizeof(t_card); } } t_boolean db_forms_lookup(segment_id, surface_lex, tfs) t_segment_id segment_id; t_letter *surface_lex; s_tfs *tfs; { DBT record; db_lookup_entry(db_forms, surface_lex, &record); /* not implemented: unify the tfs */ if (record.data == NULL) return (FALSE); else { print_projection(segment_id, &record, surface_lex); return (TRUE); } } t_boolean db_forms_lookup_tbl(surface_lex, append, decapitalized) t_letter *surface_lex; t_boolean append; t_boolean decapitalized; { DBT record; db_lookup_entry(db_forms, surface_lex, &record); /* not implemented: unify the tfs */ if (record.data == NULL) return (FALSE); else { if (append) print_out("%c", SUBFIELD_SEP); if (decapitalized) print_projection_tbl(&record, surface_lex); else print_projection_tbl(&record, (t_letter *) NULL); return (TRUE); } } /* wrapper for db->close */ void db_forms_close() { #ifdef FLOCK /* sync and unlock not necessary: db->close takes care of that if ((db_forms->sync)(db_forms, 0) < 0) fatal_error("cannot flush database (errno=%d)",errno); if(flock((db_forms->fd)(db_forms), LOCK_UN|LOCK_NB) < 0) fatal_error("cannot unlock database (errno=%d)",errno); */ #endif #ifdef LOCKF /* should test if there is still a lock */ if ((db_forms->sync) (db_forms, 0) < 0) fatal_error("cannot flush database (errno=%d)", errno); lseek((db_forms->fd) (db_forms), (off_t) 0L, SEEK_SET); if (lockf((db_forms->fd) (db_forms), F_ULOCK, 0L) < 0) fatal_error("cannot unlock database (errno=%d)", errno); #endif if ((db_forms->close) (db_forms) < 0) fatal_error("cannot close database (errno=%d=%s)", errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); } /* After all writing is completed, let other processes use the database for reading. (db_operation is Create or Update) */ void db_forms_complete() { if ((db_forms->sync) (db_forms, 0) < 0) fatal_error("cannot flush database (errno=%d=%s)", errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); #ifdef FLOCK if (flock((db_forms->fd) (db_forms), LOCK_SH | LOCK_NB) < 0) fatal_error("cannot change lock on database (errno=%d)", errno); #endif #ifdef LOCKF lseek((db_forms->fd) (db_forms), (off_t) 0L, SEEK_SET); if (lockf((db_forms->fd) (db_forms), F_ULOCK, 0L) < 0) fatal_error("cannot change lock on database (errno=%d)", errno); #endif } void db_forms_dump() { DBT key; DBT record; int db_status; int sum; int sum_keys; int key_card; int size; int max_key; sum = 0; key_card = 0; sum_keys = 0; max_key = 0; db_status = (db_forms->seq) (db_forms, &key, &record, R_FIRST); while (db_status == 0) { (void) memcpy((T_PTR) concatenation, (T_PTR) key.data, key.size); concatenation[key.size] = NUL_LETTER; /* TODO: count the internal records */ print_projection((t_segment_id) key_card, &record, concatenation); size = key.size + record.size; max_key = MAX(max_key, size); sum += size; key_card++; sum_keys += key.size; db_status = (db_forms->seq) (db_forms, &key, &record, R_NEXT); } if (db_status < 0) fatal_error("error while reading next key in database (errno=%d=%s)", errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); if (debug & DEBUG_STAT) { max_key += 2 * sizeof(record.size); size = sizeof(record.size) * key_card; sum_keys += size; sum += 2 * size; print_log("%d keys, sum keys = %d, sum records = %d, total = %d\n", key_card, sum_keys, sum - sum_keys, sum); print_log("%s %.1f, %s %.1f, %s %.1f, %s %d\n", "average key =", (float) (sum_keys) / key_card, "avg record =", (float) (sum - sum_keys) / key_card, "avg entry =", (float) (sum) / key_card, "max entry size =", max_key); } } mmorph-2.3.4.2.orig/database.h0100644000175000001440000000147006045657133015075 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef database_h #define database_h #define DB_MODE 0666 #ifndef NULL #define NULL 0 #endif #define Create (1) #define Update (1 << 1) #define Lookup (1 << 2) typedef unsigned long t_db_operation; typedef union { t_value *value; char *string; } u_record_data; #define EMPTY 1 #define NON_EMPTY 0 extern t_db_operation db_operation; extern void db_store_form(); extern void db_forms_init(); extern void db_forms_close(); extern t_boolean db_forms_lookup(); extern t_boolean db_forms_lookup_tbl(); extern void db_forms_complete(); extern void db_forms_dump(); #endif /* database_h */ mmorph-2.3.4.2.orig/lint.sed0100644000175000001440000000052005637336550014621 0ustar mvelausers#!/bin/sed -f s/^\([^ (]*\)(\([0-9]*\)):/"\1", line \2:/ s/^[^ ]*[ ]*\([^ (]*\)(\([0-9]*\))[ ]*::[ ]*\([^ (]*\)(\([0-9]*\))$/"\3", line \4: &\ "\1", line \2: &/ s/\n"llib-/\ "\/usr\/lib\/lint\/llib-/ s/^\(.*defined\)( \([^(]*\)(\([0-9][0-9]*\)) )/"\2", line \3: \1/ s/^\(.*used\)( \([^(]*\)(\([0-9][0-9]*\)) )/"\2", line \3: \1/ mmorph-2.3.4.2.orig/lookup.c0100644000175000001440000000672406045657135014646 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* lookup.c quick hack to lookup words in the database should be changed to use SGML API */ #include #include "user.h" #define MAXSTRLNG 128 /* Read one word per line, and look it up. All characters count except newline. */ static t_boolean get_segment(infile, segment_id, segment, tfs) FILE *infile; t_segment_id *segment_id; /* output */ char **segment; /* output */ s_tfs **tfs; /* output */ { static char string_segment[MAXSTRLNG]; static t_segment_id id_count = 0; /* 32 bits = 4294967296 ids */ char *s; int c; /* read a word, i.e all the characters on the line fgets is not used because it takes the newline in. */ s = string_segment; while ((c = getc(infile)) != EOF && (s - string_segment < MAXSTRLNG - 1) && (c != (int) '\n')) { *s++ = (char) c; } *s = '\0'; *segment_id = id_count++; *segment = string_segment; *tfs = NULL; /* no yet implemented */ if (c == (int) '\n') return (TRUE); else if (c == EOF) if (s == string_segment) return (FALSE); /* normal EOF */ else { print_warning("input file does not terminate %s", "with a newline"); return (TRUE); } else fatal_error("word too long (max %d):\n %s", MAXSTRLNG - 1, string_segment); return (FALSE); /* shut up gcc -Wall */ /* NOTREACHED */ } /* see print_projection() put_lex(segment_id,record, surface_lex) { } */ static void reject_segment(segment_id, segment) t_segment_id segment_id; /* output */ char *segment; /* output */ { if (want_segment_id) print(rejectfile, "%d\t", segment_id); print(rejectfile, "%s\n", segment); } void lookup(infile) FILE *infile; { t_segment_id segment_id; char *segment; s_tfs *tfs; t_letter surface_lex[MAXSTRLNG]; t_boolean found; t_boolean folded; t_boolean prompt_user; /* read a word and look-it up */ prompt_user = isatty(fileno(infile)) && isatty(fileno(outfile)); if (prompt_user) { print_out("%s", prompt); if (want_flush) /* normally not necessary for ttys; just in case */ flush_out(); } while (get_segment(infile, &segment_id, &segment, &tfs)) { if (fold_case_always) { folded = fold_case((unsigned char *) segment, (unsigned char *) surface_lex); found = (map_letter((char *) surface_lex, surface_lex, Surface_Letter) && db_forms_lookup(segment_id, surface_lex, tfs)); } else { folded = FALSE; found = (map_letter(segment, surface_lex, Surface_Letter) && db_forms_lookup(segment_id, surface_lex, tfs)); } if (!fold_case_always && fold_case_fallback && !found) { folded = fold_case((unsigned char *) segment, (unsigned char *) surface_lex); if (folded) found |= (map_letter((char *) surface_lex, surface_lex, Surface_Letter) && db_forms_lookup(segment_id, surface_lex, tfs)); } if (!found) { reject_segment(segment_id, segment); if (want_segment_id) print_out("%d\t\n", segment_id); else print_out("\n"); } else if (!want_segment_id) print_out("\n"); /* separator between possible analyses */ if (prompt_user) print_out("%s", prompt); if (want_flush) flush_out(); } if (prompt_user) print_out("\n"); } mmorph-2.3.4.2.orig/main.c0100644000175000001440000002713106045657137014256 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* main.c */ #include #include #include #include "user.h" #include "parse.h" #include "y.tab.h" #include "tokenstr.h" static char rcsid[] = "@(#)main.c,v 2.21 1995/11/01 11:47:43 petitp Exp"; extern char *optarg; extern int optind; extern int opterr; extern void lookup(); static char *version_string = VERSION_STR; static char *patch_version_string = PATCH_VERSION_STR; char *db_file_name; char *gram_file_name; char *augment_file_name; int trace_level = 0; int spell_trace_level = 0; int parsing = FALSE; crc32file crc; unsigned char crc_hash[CRC32FILE_HASHLEN]; unsigned long debug = 0L; static char *progname; static char *fullprogname; static char *db_suffix = ".db"; static char *tfs_suffix = ".tfs"; static FILE *infile; t_boolean want_segment_id; t_boolean want_flush; t_boolean parse_only; t_boolean normalize; t_boolean normalize_flag; t_boolean mark_unknown; t_boolean fold_case_always; t_boolean fold_case_fallback; t_boolean extend_morph_field; t_boolean overwrite_morph_field; char *begin_sentence_class; void yyerror(s) char *s; { fatal_error("%s; lookahead is \"%s\" (token %s %d)", s, yytext, ((yychar < FIRSTTOKEN || yychar > LASTTOKEN) ? "code" : token[yychar - FIRSTTOKEN]), yychar ); } static void init() { init_symbol(); /* setlocale is useful for isprint() in output.c and fold_case() */ (void) setlocale(LC_CTYPE, ""); /* if (setlocale(LC_CTYPE, "") == NULL) TODO: do something, locale will be probably default "C" */ } static void print_usage() { print_log("Usage for %s:\n", fullprogname); print_log("info:\t %s%s\n", progname, " [-vh]"); print_log("parse:\t %s%s%s\n", progname, " -y | -z [-a addfile]\n", "\t\t-m morphfile [-d debugmap] [-l logfile] [infile [outfile]]"); print_log("gen:\t %s%s%s\n", progname, " -n | -c [-t gram_trace] [-s spell_trace] [-a addfile]\n", "\t\t-m morphfile [-d debugmap] [-l logfile] [infile [outfile]]"); print_log("lookup:\t %s%s%s\n", progname, " [-fi] [-b | -k] [-r rejectfile]\n", "\t\t-m morphfile [-d debugmap] [-l logfile] [infile [outfile]]"); print_log("r/f:\t %s%s%s\n", progname, " -C lookup_classes [-fU] [-E | -O] [-b | [-k] [-B bos_class]]\n", "\t\t-m morphfile [-d debugmap] [-l logfile] [infile [outfile]]"); print_log("dump:\t %s%s%s\n", progname, " -p | -q\n", "\t\t-m morphfile [-d debugmap] [-l logfile] [infile [outfile]]"); print_log("\n%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", " -a addfile\n\tadd morphological entries from addfile\n", " -B bos_class\n\tbeginning of sentence class: which precedes the first word of a sentence\n", " -b\tfold case before lookup\n", " -C lookup_classes\n\tlist of lookup classes (any suitable separator will do)\n", " -c\tcreate full forms database\n", " -d debugmap\n\tprint debug messages\n", "\tdebugmap is composed of the following bits:\n", "\t0x1 debug initialisation\n", "\t0x2 debug yacc parsing\n", "\t0x4 debug rule combination\n", "\t0x8 debug spelling application\n", "\t0x10 print statistics with -p or -q options\n", " -E\textend existing morphological annotation\n", " -O\toverwrite existing morphological annotation\n", " -f\tflush output after each word lookup\n", " -h\tprint help and exit\n", " -i\tprint input segment sequential number before each lookup result\n", " -k\tfold case fallback\n", " -l logfile\n\tfile for trace and error messages\n", " -m morphfile\n\tfile containing the morphology description\n", " -n\tno database (test mode)\n", " -p\tdump tfs database\n", " -q\tdump forms database\n", " -r rejectfile\n\tfile for rejected words\n", ""); print_log("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", " -s trace_level\n\ttrace spelling rule application\n", "\ttrace_level can be (a level imply all preceding ones):\n", "\t1 trace valid surface forms\n", "\t2 trace rules whose lexical part match\n", "\t3 trace surface left context match (surface word construction)\n", "\t4 trace surface right context mismatch and rule blocking\n", "\t5 trace rule non blocking\n", " -t trace_level\n\ttrace grammar rule application\n", "\ttrace_level can be (a level imply all preceding ones):\n", "\t1 trace goal rules that apply\n", "\t2 trace all rules that apply\n", "\t10 trace rules that are tried but did not apply\n", " -U\tmark unknown words\n", " -v\tprint version and exit\n", " -y\tparse only\n", " -z\tparse and output normalized form\n", " infile\ttext input file, one word per line\n", " outfile\tambiguously tagged text output\n", ""); } void main(argc, argv) int argc; char *argv[]; { int c; int rval; int name_length; t_boolean usage_error; t_boolean nflag; t_boolean cflag; t_boolean dump_db; struct stat file_stat; char *lookup_classes; extern int optind; extern char *optarg; fullprogname = argv[0]; progname = strrchr(fullprogname, (int) '/'); if (progname == NULL) progname = fullprogname; else progname++; outfile = stdout; /* fatal_error needs it */ logfile = stderr; /* fatal_error needs it */ rejectfile = stderr; gram_file_name = NULL; augment_file_name = NULL; db_operation = Lookup; /* default operation */ usage_error = FALSE; nflag = FALSE; cflag = FALSE; want_segment_id = FALSE; want_flush = FALSE; parse_only = FALSE; normalize = FALSE; normalize_flag = FALSE; mark_unknown = FALSE; fold_case_always = FALSE; fold_case_fallback = FALSE; lookup_classes = NULL; begin_sentence_class = "\n"; /* cannot occur */ extend_morph_field = FALSE; overwrite_morph_field = FALSE; dump_db = 0; while ((c = getopt(argc, argv, "a:bcd:fhikl:m:npqr:s:t:vyzB:C:EOU")) != -1) { switch (c) { case 'd': if (sscanf(optarg, "%li", &debug) != 1) { usage_error = TRUE; print_log("error: bad debugmap: %s", optarg); } else { if (debug & DEBUG_YACC) yydebug = 1; } break; case 't': if (sscanf(optarg, "%d", &trace_level) != 1) { usage_error = TRUE; print_log("error: bad trace level: %s", optarg); } break; case 's': if (sscanf(optarg, "%d", &spell_trace_level) != 1) { usage_error = TRUE; print_log("error: bad trace level: %s", optarg); } break; case 'v': print_out("%s version %s\n%s\n", progname, patch_version_string, rcsid); EXIT(0); /* to shut up lint: */ /* FALLTHROUGH */ case 'h': print_out("%s version %s\n", progname, patch_version_string); print_usage(); EXIT(0); /* to shut up lint: */ /* FALLTHROUGH */ case 'l': if ((logfile = fopen(optarg, "w")) == NULL) { logfile = stderr; fatal_error("cannot open log file: %s", optarg); } break; case 'r': if ((rejectfile = fopen(optarg, "w")) == NULL) { fatal_error("cannot open reject file: %s", optarg); } break; case 'm': gram_file_name = optarg; break; case 'c': cflag = TRUE; if (nflag) usage_error = TRUE; else db_operation |= Create; /* create new database */ break; case 'n': nflag = TRUE; if (cflag) usage_error = TRUE; else db_operation &= ~(Create | Lookup); /* no database */ break; case 'a': db_operation |= Update; /* augment */ augment_file_name = optarg; break; case 'i': want_segment_id = TRUE; break; case 'b': /* don't bother checking -b/-k/-B incompatibilities */ fold_case_always = TRUE; fold_case_fallback = FALSE; break; case 'k': fold_case_fallback = TRUE; fold_case_always = FALSE; break; case 'f': want_flush = TRUE; break; case 'p': dump_db = 1; break; case 'q': dump_db = 2; break; case 'z': normalize_flag = TRUE; /* FALLTHROUGH */ case 'y': parse_only = TRUE; db_operation &= ~(Create | Lookup); break; case 'U': mark_unknown = TRUE; break; case 'E': extend_morph_field = TRUE; overwrite_morph_field = FALSE; break; case 'O': overwrite_morph_field = TRUE; extend_morph_field = FALSE; break; case 'C': lookup_classes = optarg; break; case 'B': begin_sentence_class = optarg; break; default: usage_error = TRUE; break; } } if (usage_error) { print_usage(); EXIT(2); } if (gram_file_name == NULL) { print_usage(); fatal_error("error: no grammar file provided"); } initfile(gram_file_name); if (!(db_operation & Lookup)) { if (spell_trace_level < 1) spell_trace_level = 1; /* don't be completely silent! */ } else { /* make the database name from the description file name */ name_length = strlen(gram_file_name); MY_STRALLOC(db_file_name, name_length + MAX((int) strlen(db_suffix), (int) strlen(tfs_suffix)) + 1); (void) strcpy(db_file_name, gram_file_name); (void) strcpy(db_file_name + name_length, db_suffix); if (!(db_operation & Create)) { if (stat(gram_file_name, &file_stat) < 0) fatal_error("cannot access file \"%s\" (errno=%d=%s)", gram_file_name, errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); #ifdef COMMENTED_OUT time_t gram_file_mtime; /* this code is replaced by the crc checking */ gram_file_mtime = file_stat.st_mtime; if (stat(db_file_name, &file_stat) < 0) fatal_error("cannot access file \"%s\" (errno=%d=%s)", db_file_name, errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); if (gram_file_mtime > file_stat.st_mtime) fatal_error("database file \"%s\" %s%s\"%s\": %s", db_file_name, "is out of date with respect to\n", "the morphology description in", gram_file_name, "please recreate it"); #endif } db_forms_init(db_file_name, db_operation); (void) strcpy(db_file_name + name_length, tfs_suffix); open_tfs_file(db_file_name, db_operation); } if (optind >= argc) { infile = stdin; } else { if (!(db_operation & Lookup)) print_warning("input file \"%s\" will be ignored", argv[optind]); if ((infile = fopen(argv[optind], "r")) == NULL) fatal_error("cannot open input file: %s", argv[optind]); optind++; } if (optind >= argc) { outfile = stdout; } else { if ((outfile = fopen(argv[optind], "w")) == NULL) fatal_error("cannot open output file: %s", argv[optind]); optind++; } init(); parsing = TRUE; crc32file_clear(&crc); rval = yyparse(); parsing = FALSE; /* parse complete, error message format change */ if (debug & DEBUG_INIT) print_log("parse = %d\n", rval); if (rval != 0) fatal_error("parsing aborted (code %d)", rval); if (db_operation & Lookup) { if (db_operation & (Create | Update)) { db_forms_complete(); /* save what's done */ tfs_table_write(db_operation, db_file_name, crc_hash); } if (dump_db == 1) dump_tfs_table(); /* dump on outfile, stat on logfile */ else if (dump_db == 2) db_forms_dump(); /* dump on outfile, stat on logfile */ else if (lookup_classes) lookup_tbl(infile, lookup_classes); else lookup(infile); db_forms_close(); } EXIT(0); /* NOTREACHED */ } mmorph-2.3.4.2.orig/mkdirhier0100755000175000001440000000162005771321233015053 0ustar mvelausers#!/bin/sh # $XConsortium: mkdirhier.sh,v 1.6 91/08/13 18:13:04 rws Exp $ # Courtesy of Paul Eggert newline=' ' IFS=$newline case ${1--} in -*) echo >&2 "mkdirhier: usage: mkdirhier directory ..."; exit 1 esac status= for directory do case $directory in '') echo >&2 "mkdirhier: empty directory name" status=1 continue;; *"$newline"*) echo >&2 "mkdirhier: directory name contains a newline: \`\`$directory''" status=1 continue;; ///*) prefix=/;; # See Posix 2.3 "path". //*) prefix=//;; /*) prefix=/;; -*) prefix=./;; *) prefix= esac IFS=/ set x $directory IFS=$newline shift for filename do path=$prefix$filename prefix=$path/ shift test -d "$path" || { paths=$path for filename do if [ "$filename" != "." ]; then path=$path/$filename paths=$paths$newline$path fi done mkdir $paths || status=$? break } done done exit $status mmorph-2.3.4.2.orig/mmorph.10100644000175000001440000003062606045657140014547 0ustar mvelausers.\" @(#)mmorph.5 October 1995 ISSCO; .\" mmorph, MULTEXT morphology tool .\" Version 2.3, October 1995 .\" Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland .\" Dominique Petitpierre, .TH MMORPH 5 "Version 2.3, October 1995" .SH NAME mmorph \- MULTEXT morphology tool .SH SYNOPSIS .HP information: .br \fBmmorph\fP [ .B \-vh ] .HP parse only: .br \fBmmorph\fP .B \-y | .B \-z [ .B \-a .I addfile ] .br .B \-m .I morphfile [ .B \-d .I debug_map ] [ .B \-l .I logfile ] [ .I infile [ .I outfile ]] .HP generate: .br \fBmmorph\fP .B \-c | .B \-n [ .B \-t .I trace_level ] [ .B \-s .I trace_level ] [ .B \-a .I addfile ] .br .B \-m .I morphfile [ .B \-d .I debug_map ] [ .B \-l .I logfile ] [ .I infile [ .I outfile ]] .HP simple lookup: .br \fBmmorph\fP [ .B \-fi ] [ .B \-b | .B \-k ] [ .B \-r .I rejectfile ] .br .B \-m .I morphfile [ .B \-d .I debug_map ] [ .B \-l .I logfile ] [ .I infile [ .I outfile ]] .HP record/field lookup: .br \fBmmorph\fP .B \-C .I classes [ .B \-fU ] [ .B \-E | .B \-O ] [ .B \-b | [ .B \-k ] [ .B \-B .I class ]] .br .B \-m .I morphfile [ .B \-d .I debug_map ] [ .B \-l .I logfile ] [ .I infile [ .I outfile ]] .HP dump database: .br \fBmmorph\fP \-p | \-q .br .B \-m .I morphfile [ .B \-d .I debug_map ] [ .B \-l .I logfile ] [ .I infile [ .I outfile ]] .SH DESCRIPTION .LP In the simplest mode of operation, with just the \fB-m\fP \fImorphfile\fP option, .B mmorph operates in lookup mode: it will open an existing database called \fImorphfile.db\fR and lookup all the string segments (usually corresponding to words) in the input. .LP To create the database from the lexical entries specified in "morphfile", use \fB-c -m\fP \fImorphfile\fP. The file \fImorphfile\fB.db\fR should not exist. When the database is complete it will lookup the segments in the input. If used ineractively (input and output is a terminal), a prompt is printed when the program expects the user to type a segment string. No prompting occurs in record/field mode. .LP To test the rule applications on the lexical entries specified in \fImorphfile\fP, without creating a database and without looking up segments, use \fB-n -m\fP \fImorphfile\fP. This automatically sets the trace level to 1 if it was not specified. .LP In order to do the same operations as above, but on the alternate set of lexical entries in \fIaddfile\fP, use the extra option \fB-a \fIaddfile\fR. The lexical entries in morphfile will be ignored. This is useful when making additions to a standard morphological description. Be aware that entries added to the database \fImorphfile.db\fP do not replace existing ones. .SS "How to test a morphological description" Use the \fB-n\fP option. In the Grammar section, specify goal rules that will match the desired results. In the Lexicon section specify the lexical items you want to test. When running all rules will be applied (recursively) to the lexical items, if the rule is a goal, then the result of the application is printed on the output. .LP Suggestion: Put the two parts mentioned above (goal rules and Lexicon section) in separate files and reference these files with an \fB#include\fP directive where they should occur in the main input file. .LP If you are using an existing description and want to test only new lexical entries, use the options \fB-n -a\fP \fIaddfile\fP, and put the lexical entries in \fIaddfile\fP. .SH OPTIONS .TP \fB\-a\fP \fIaddfile\fP Ignore lexical entries in morphfile, take them from \fIaddfile\fP instead. .TP \fB\-B\fP \fIclass\fP Specifies the record class that occurs before the beginning of a sentence. Capitalized words occurring just after such records will also be looked up with all their letters converted to lowercase (according to LC_CTYPE, see below). .TP \fB\-b\fP fold case before lookup. Uppercase letters are converted to lowercase letters (according to LC_CTYPE, see below) before a word is looked up. .TP \fB\-C\fP \fIclasses\fP Determines record/field mode. Specifies the record classes that should be looked up. Class names should be separated by comma ",", TAB, space, bar "|" or backslash "\e". .TP \fB\-c\fP Create a new database for lookup. The name of the created file is the name of \fImorphfile\fP (\fB\-m\fP option) with suffix \fB.db\fP. It should not exist; if it exists the user should remove it manually before running \fBmmorph -c\fP (this is a minimal protection against accidental overwriting a database that might have taken a long time to create). .TP \fB\-d\fP \fIdebug_map\fP Specify which debug options are wanted. Each bit in \fIdebug_map\fP corresponds to an option. .nf .ta 0.3iR 1.1iR 1.3iL 2.0iL bit decimal hexadecimal purpose no bits 0 0x0 no debug option (default) 1 1 0x1 debug initialisation 2 2 0x2 debug yacc parsing 3 4 0x4 debug rule combination 4 8 0x8 debug spelling application 5 16 0x10 print statistics with -p or -q options all bits -1 0xffff all debug options whatever they are .fi To combine options add the decimal or hexadecimal values together. Example: -t 0x5 specifies bits (options) 1 and 4. .TP \fB\-E\fP In record/field mode, extends the morphology annotations if they already exist (the default is to leave existing annotations as is). .TP \fB\-O\fP In record/field mode, overwrite the morphology annotations if they already exist (the default is to leave existing annotations as is). .TP \fB\-f\fP Flush the output after each segment lookup. This is useful only if input and output are piped from and to a program that needs to synchronize them. .TP \fB\-h\fP Print help and exit. .TP \fB\-i\fP Prepend the result of each lookup with the identifier of the input segment it corresponds to. Currently input segments are identified by their sequential number, starting at 0. With this indication, the extra newline separating the solutions for different input segments is not printed because it is not needed. If a lookup has no solutions, only the segment identifier is printed on the output. The segment identifier is also prepended to rejected segments. A tab always follows the segment identifier. .TP \fB\-k\fP fallback fold case. If a word lookup failed, then convert all uppercase letters to lowercase and try lookup again. (conversion is done according to LC_CTYPE, see below). .TP \fB\-l\fP \fIlogfile\fP Specify the file for writing trace and error messages. Defaults to standard error. .TP \fB\-m\fP \fImorphfile\fP Specify the file containing the morphology description. See \fBmmorph (5)\fP for a description of the formalism's syntax. .TP \fB\-n\fP No database creation or lookup (test mode). .TP \fB\-p\fP Dump the typed feature structure database to outfile (or standard output). The count of distinct tfs is given in the logfile (or standard error) if bit 5 of debug option is set. .TP \fB\-q\fP Dump the forms in the database to outfile (or standard output). Some statistics are given in the logfile (or standard error) if bit 5 of debug option is set. .TP \fB\-r\fP \fIrejectfile\fP In non record/field mode, specifies the file where to write input segments that could not be looked up. Defaults to standard error. .TP \fB\-s\fP \fItrace_level\fP Trace spelling rule application: .br 0 no tracing (default). .br 1 trace valid surface forms. .br 2 trace rules whose lexical part match. .br 3 trace surface left context match (surface word construction). .br 4 trace surface right context mismatch and rule blocking. .br 5 trace rule non blocking. .br A trace_level implies all preceding ones. .TP \fB\-t\fP \fItrace_level\fP Specify the level of tracing for rule application: .br 0 no tracing (default). .br 1 trace goal rules that apply. .br 2 trace all rules that apply, indentation indicates the recursion depth. .br 10 trace also rules that were tried but did not apply .br A trace_level implies all preceding ones. .TP \fB\-U\fP In record/field mode, unknown words (i.e. that were unsuccessfully looked up) are annotated with ??\\??. .TP \fB\-v\fP Print version and exit. .TP \fB\-y\fP Parse only: do not process the description other than for syntax checking. While developping a morphology description you may use this option to catch syntax errors quickly after each modification before running it "for real". .TP \fB\-z\fP implies -y. Parse and output the lexical descriptions in normalized form. .TP \fIinfile\fP file containing the segments to lookup, one per line. Defaults to the standard input. .TP \fIoutfile\fP file in which the output of the program is written. One line per solution. Solutions of different input segments are separated by an empty line. Defaults to the standard output. .SH "WORD GRAMMAR AND SPELLING RULES" For a detailed account of the principles and mechanisms used in .B mmorph, please refer to the documents cited in the SEE ALSO section below. .LP Briefly sketched, morphosyntactic descriptions written for mmorph describe how words are constructed by the concatenation of morphemes, and how this concatenation process changes the spelling of these morphemes. The first part, the word structure grammar, is specified by restricted context free rewrite rules whose formalism is inspired by unification based systems (cf. Shieber 1986). The second part, the spelling changes, is specified by spelling rules in a formalism based on the two level model of morphology. This approach to morphology is described in Ritchie, Russell et. al, 1992 and more concisely in Pulman and Hepple 1993. .SH "ENVIRONMENT VARIABLES" To decide which characters are displayable on the output, .B mmorph uses the language specific description that .BR setlocale (3) sets according to the environment variable .B LC_CTYPE. For the languages that are dealt with in MULTEXT it is a good idea to have that variable set to .B iso_8859_1. .SH EXAMPLES Here is a summary of the common usage of mmorph options: .RS .ft B .nf mmorph -n -m morphfile .fi .RE .ft R Test mode: reads the whole of morphfile and prints results on standard error. No database is created, no words are looked up. .RS .ft B .nf mmorph -c -m morphfile .fi .RE .ft R Database creation: reads the whole of morphfile and stores the results in a database (morphfile.db). Typed feature structures are collected in a separate file (morphfile.tfs). Standard input is read for words to look up in the new database. .RS .ft B .nf mmorph -m morphfile .fi .RE .ft R Lookup mode: reads only the Alphabets, Attributes and Types sections of morphfile. Standard input is read for words to look up according to the existing database (mmorphfile.db and morphfile.tfs). .RS .ft B .nf mmorph -m morphfile -a addfile .fi .RE .ft R Addition mode: ignores the Lexicon section of morphfile, but addfile is consulted, and the results are added to the database. Standard input is read for words to look up according to the augmented database (mmorphfile.db and morphfile.tfs). .SH DIAGNOSTICS Error messages should be self explanatory. Please refer to .BR mmorph (5) for a formal description of the syntax. .SH FILES .TP \fImorphfile\fR.db database file of forms generated for descriptions in file \fImorphfile\fR given as option \-m. .TP \fImorphfile\fR.tfs database file of typed feature structures associated to \fImorphfile\fR.db. .SH SEE\ ALSO .BR mmorph (5), .BR setlocale (3). .HP G. Russell and D. Petitpierre, \fIMMORPH \- The Multext Morphology Program\fP, Version 2.3, October1995, MULTEXT deliverable report for task 2.3.1. .HP Ritchie, G. D., G.J. Russell, A.W. Black and S.G. Pulman (1992), \fIComputational Morphology: Practical Mechanisms for the English Lexicon\fP, Cambridge Mass., MIT Press. .HP Pulman, S.G. and M.R. Hepple, (1993) ``A feature-based formalism for two level phonology: a description and implementation'', \fIComputer Speech and Language\fP 7, pp.333-358. .HP Shieber, S.M. (1986), \fIAn Introduction to Unification-Based Approaches to Grammar\fP, CSLI Lecture Notes Number 4, Stanford University .SH AUTHOR Dominique Petitpierre, ISSCO, .SH ACKNOWLEDGEMENTS The parser for the morphology description formalism was written using .BR yacc (1) and .BR flex (1). Flex was written by Vern Paxson, , and is distributed in the framework of the GNU project under the condition of the GNU General Public License .LP The database module in the current version uses the .B db library package developed at the University of California, Berkeley by Margo Seltzer, Keith Bostic and Ozan Yigit. .LP The crc procedures used for taking a signature of the typed feature structure declarations are taken from the .B fingerprint package by Daniel J.\ Bernstein and use code written by Gary S.\ Brown. mmorph-2.3.4.2.orig/mmorph.50100644000175000001440000004343306045657142014555 0ustar mvelausers.\" @(#)mmorph.1 October 1995 ISSCO; .\" mmorph, MULTEXT morphology tool .\" Version 2.3, October 1995 .\" Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland .\" Dominique Petitpierre, .TH MMORPH 5 "Version 2.3, October 1995" .SH NAME mmorph \- MULTEXT morphology tool formalism syntax .SH DESCRIPTION A .B mmorph morphology description file is divided into declaration sections. Each section starts by a section header (`\fB@\ Alphabets\fP', `\fB@\ Attributes\fP', etc.) followed by a sequence of declarations. Each declaration starts by a name, followed by a colon (`\fB:\fP') and the definition associated to the name. Here is a brief description of each section: .br .SH "\s+2@ Alphabets" In this section the lexical and surface alphabet are declared. All symbols forming each alphabet has to be listed. Symbols may appear in both the lexical and surface alphabet definition in which case it is considered a bi-level symbol, otherwise it is a lexical only or surface only symbol. Symbols are usually letters (eg. \fBa, b, c\fP) , but may also consist of longer names (\fBbeta\fP, \fBschwa\fP). Symbol names consisting of one special character (`\fB:\fP' or `\fB(\fP') may be specified by enclosing them in double quotes (`\fB:\fP' or `\fB(\fP'). .br Example: .RS .HP .ft B Lexical : 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 "\-" "." "," "?" "!" "\\"" "'" ":" ";" "(" ")" strong_e .HP .ft B Surface : 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 "\-" "." "," "?" "!" "\\"" "'" ":" ";" "(" ")" "\ " .RE .LP In this example, the symbol \fBstrong_e\fP is lexical only, the symbol \fB"\ "\fP (space) is surface only. All the other symbols are bi-level. .LP All the strings appearing in the rest of the grammar will be made exclusively of symbols declared in this section. .SH "\s+2@ Attributes" In this section, the name of attributes (sometimes called features) and their associated value set. At most 32 different values may be declared for an attribute. .br Examples: .RS .ft B .nf Gender : feminine masculine neuter Number : singular plural Person : 1st 2nd 3rd Transitive : yes no Inflection : base intermediate final .fi .RE .LP In the current version of the implementation value sets of different attributes are incompatible, even if they are defined identically. To overcome this restriction, in a future version this section will be split into two: declaration of value sets and declaration of attributes. .RE .SH "\s+2@ Types" In this section, the different types of feature structures are declared. The attributes allowed for each type are listed. Attributes that are only used within the scope of the tool and have no meaning outside can be listed after a bar (`\fB|\fP'). The values of these local attributes ar not stored in the database or written on the final output of the program. .br Examples: .RS .ft B .nf Noun : Gender Number Verb : Tense Person Gender Number Transitive | Inflection .fi .RE .SH "\s+2Typed feature structures" Typed feature structures are used in the grammar and spelling rules. It is the specification of a type and the value of some associated attributes. The list of attribute specifications is enclosed in square brackets (`\fB[\fP' and `\fB]\fP'). .br Example: .RS .nf .ft B Noun[ Gender=feminine Number=singular ] .fi .RE .PP It is possible to specify a set of values for an attribute by listing the possible valuse separated with a bar (`\fB|\fP'), or the complement of a set (with respect to all possible values of that attribute) indicated with `\fB!=\fP' instead of `\fB=\fP'. .br Example: Assuming the declaration of \fBGender\fP as above, the following two typed feature structures are equivalent .RS .ft B .nf Noun[ Gender=masculine|neuter ] Noun[ Gender!=feminine ] .fi .RE .SH "\s+2@ Grammar" This section contains the rules that specify the structure of words. It has the general shape of a context free grammar over typed feature structures. There are three basic types of rules: binary, goal and affixes. .PP Binary rules specify the result of the concatenation of two elements. This is written as: .RS .ft B .nf \fIRule_name\fP : \fILhs\fP <\- \fIRhs1 Rhs2\fP .fi .RE .LP where \fILhs\fP is called the left hand side, and \fIRhs1\fP and \fIRhs2\fP the first and second part of the right hand side. \fILhs\fP, \fIRhs1\fP and \fIRhs2\fP are specified as typed feature structures. .br Example: .RS .ft B .nf .ta 0.8iL 1.1iL Rule_1 : Noun[ Gender=feminine Number=singular ] <\- Noun[ Gender=feminine Number=singular ] NounSuffix[ Gender=feminine ] .fi .RE .PP Variables can be used to indicate that some attributes have the same value. A variable is a name starting with a dollar (`\fB$\fP'). .br Example: .nf .RS .ft B .nf .ta 0.8iL 1.1iL Rule_2 : Noun[ Gender=$A Number=$number ] <\- Noun[ Gender=$A Number=$number ] NounSuffix[ Gender=$A ] .fi .RE .PP If needed, both a variable and a value specification can be given for an attribute (only once per attribute): .br Example: .RS .ft B .nf .ta 0.8iL 1.1iL Rule_3 : Noun[ Gender=$A Number=$number ] <\- Noun[ Gender=$A Number=$number ] NounSuffix[ Gender=$A=masculine|neuter ] .fi .RE .PP Affix rules define basic elements of the concatenations specified by binary rules (together with lexical entries, see the section \fB@\ Lexicon\fP below). An affix rule consists of lexical string associated to a typed feature structure. .br Examples: .nf .RS .ft B .nf Plural_s : "s" NounSuffix[ Number=plural ] Feminine_e : "e" NounSuffix[ Gender=feminine ] ing : "ing" VerbSuffix[ Tense=present_participle ] .fi .RE .PP Goal rules specify the valid results constructed by the grammar. They consist of just a typed feature structure. .br Examples: .nf .RS .ft B .nf Goal_1 : Noun[] Goal_2 : Verb[ inflection=final ] .fi .RE .PP In addition to these three basic rule types, there are prefix or suffix composite rules and unary rules. A unary rule consist of a left hand side and a right hand side. .br Example: .RS .ft B .ta 0.8iL 1.1iL .nf Rule_4 : Noun[ gender=$G number=plural ] <\- Noun[ gender=$G number=singular invariant=yes] .fi .RE .PP Prefix and suffix composite rules have the same shape as binary rules except that one part of the right hand side is an affix (i.e. has an associated string). .br Examples: .nf .RS .ft B .nf .ta 0.8iL 1.1iL Append_e : Noun[ Gender=feminine Number=$number ] <\- Noun[ Gender=feminine Number=$number ] "e" NounSuffix[ Gender=feminine ] anti : Noun[ Gender=$gender Number=$number ] <\- "anti" NounPrefix[] Noun[ Gender=$gender Number=$number ] .fi .RE .SH "\s+2@ Classes" This optional section contains the definition of symbol classes. Each class is defined as a set of symbols, or other classes. If the class contains only bi-level elements it is a bi-level class, otherwise it is a lexical or surface class. .br Examples: .RS .ft B .nf Dental : d t Vowel : a e i o u Vowel_y : Vowel y Consonant: b c d f g h j k l m n p q r s t v w x z .fi .RE .SH "\s+2@ Pairs" This optional section contains the definition of pair disjunctions. Each disjunction is defined as a set of pairs. Explicit pairs specify a sequence of surface symbols and a sequence of zero or one lexical symbol, one of them possibly empty. A sequence is enclosed between angle brackets `\fB<\fP' and `\fB>\fP'. The empty sequence is indicated with `\fB<>\fP'. In the current implementation only the surface part of a pair can be a sequence of more than one element. The special symbol `\fB?\fP' stands for the class of all possible symbols, including the morpheme and word boundary. .br Examples: .RS .ft B .nf s_x_z_1 : s/s x/x z/z VowelPair1: a/a e/e i/i o/o u/u VowelPair2: Vowel/Vowel ie.y: /y Delete_e: <>/e Insert_d: d/<> Surface_Vowel: Vowel/? Lexical_s: ?/s .fi .HP .ft B DoubleConsonant: /b /d /f /g /k /m /p /s /t /v /z .RE .LP Note that \fBVowelPair1\fP and \fBVowelPair2\fP don't specify the same thing: \fBVowelPair2\fP would match \fBa/o\fP but \fBVowelPair1\fP would not. .LP Implicit pairs are specified by the name of a bi-level symbol or a bi-level class. .br Examples: the following \fBs_x_z_2\fP and \fBVowelPair3\fP are equivalent to the above \fBs_x_z_1\fP and \fBVowelPair2\fP (assuming that \fBs\fP, \fBx\fP, \fBz\fP and \fBVowel\fP are bi-level symbols and classes). .RS .ft B .nf s_x_z_2 : s x z VowelPair3 : Vowel .fi .RE .LP In a pair disjunction all lexical parts should be disjoint. This means you cannot specify for the same pair disjunction \fBa/a\fP and \fBo/a\fP or \fBa/a\fP and \fBVowel/Vowel.\fP .LP In a future version this section will be split in two: simple pair disjunctions and pair sequences. .SH "\s+2@ Spelling" In this section are declared the two level spelling rules. A spelling rule consist of a kind indicator followed by a left context a focus and a right context. The kind indicator is `\fB=>\fP' if the rule is optional, `\fB<=>\fP' if it is obligatory and `\fB<=\fP' if it is a surface coercion rule. The contexts may be empty. The focus is surrounded by two `\fB\-\fP'. The contexts and the focus consist of a sequence of pairs or pair disjunctions declared in the `\fB@\ Pairs\fP section. A morpheme boundary is indicated by a `\fB+\fP' or a `\fB*\fP', a word boundary is indicated by a `\fB~\fP'. .br Examples: .RS .ft B .nf Sibilant_s: <=> s_x_z_1 * \- e/<> \- s Gemination: <=> Consonant Vowel \- DoubleConsonant \- * Vowel i_y_optionnel: => a \- i/y \- * ?/e .fi .RE .LP Constraints may be specified in the form of a list of typed feature structures. They are affix-driven: the rule is licensed if at least one of them subsumes the closest corresponding affix. The morpheme boundary indicated by a star (`\fB*\fP') will be used to determine which affix it is. If there is no such indication, then the affix adjacent to the morpheme where the first character of the focus occurs is used. In case there is no affix, the typed feature structure of the lexical stem is used. .br Example: .RS .ft B .nf Sibilant_s: <=> s_x_z_1 * \- e/<> \- s NounSuffix[ Number=plural ] .fi .RE .SH "\s+2@ Lexicon" This section is optional and can also be repeated. This section lists all the lexical entries of the morphological description. Unlike the other sections, definitions do not have a name. A definition consist of a typed feature strucure followed by a list of lexical stems that share that feature structure. A lexical stem consists of the string used in the concatenation specified by the grammar rules followed by `\fB=\fP' and a reference string. The reference string can be anything and usually is used to indicate the canonical form of the word or an identifier of an external database entry. .br Examples: .nf .RS .ft B .nf Noun[ Number=singular ] "table" = "table" "chair" = "chair" Verb[ Transitive=yes|no Inflection=base ] "bow" = "bow1" Noun[ Number=singular ] "bow" = "bow2" .fi .RE .LP If the stem string and the reference strings are identical, only one needs to be specified. .br Example: .nf .RS .ft B .nf Noun[ Number=singular ] "table" "chair" .fi .RE .SH FORMAL\ SYNTAX The formal syntax description below is in Backus Naur Form (BNF). The following conventions apply: .nf .ta 1.0iL <\fIid>\fR is a non-terminal symbol (within angle brackets). \fIID\fP is a token (terminal symbol, all uppercase). <\fIid>?\fR means zero or one occurrence of <\fIid>\fR (i.e. <\fIid>\fR is optional). <\fIid>*\fR is zero or more occurrences of <\fIid>\fR. <\fIid>+\fR is one or more occurrences of <\fIid>\fR. ::= separates a non-terminal symbol and its expansion. | indicates an alternative expansion. ; starts a comment (not part of the definition). .fi The start symbol corresponding to a complete description is named \fB\fP. Symbols that parse but do nothing are marked with `;\ not\ operational'. .nf .ta 1.8iL 2.2iL ::= ? ? ? * ::= ALPHABETS ::= COLON + ::= COLON + ::= ; lexical only | ; both lexical and surface ::= ; surface only | ; both lexical and surface ::= ATTRIBUTES + ::= COLON + ::= TYPES + ::= COLON + ? ::= BAR + ::= LEXICON + ::= + ::= LEXICALSTRING ? ::= EQUAL LEXICALSTRING ::= ? ::= ? ::= LBRA * RBRA ::= LBRA * RBRA ::= ::= ::= EQUAL | NOTEQUAL ::= | EQUAL DOLLAR | EQUAL DOLLAR ::= * ::= BAR ::= GRAMMAR + ::= COLON ::= LARROW | \fR; goal rule\fP | LEXICALSTRING \fR; lexical affix\fP ::= \fR; unary rule\fP | \fR; binary rule\fP | LEXICALSTRING \fR; prefix rule\fP | LEXICALSTRING \fR; suffix rule\fP ::= CLASSES + ::= COLON + | COLON + | COLON + ::= | | ::= | | ::= | ::= PAIRS + ::= COLON + ::= COLON + ::= SLASH | | | SurfaceSequence ::= LANGLE * RANGLE | SURFACESTRING | | ANY LexicalSequence ::= LANGLE * RANGLE | LEXICALSTRING | | ANY ::= SPELLING + ::= COLON * ::= * ::= * ::= CONTEXTBOUNDARY + CONTEXTBOUNDARY ::= | MORPHEMEBOUNDARY | WORDBOUNDARY | CONCATBOUNDARY ::= ::= RARROW | BIARROW | COERCEARROW .ta 2.0iL 2.4iL ::= NAME ::= NAME ::= NAME | SYMBOLSTRING ::= NAME ::= NAME ::= NAME | SYMBOLSTRING ::= NAME ::= NAME ::= NAME ::= NAME ::= NAME ::= NAME | SYMBOLSTRING ::= NAME ::= NAME ::= NAME .fi .LP .SS Simple tokens Simple tokens of the BNF above are defined as follow: The token name on the left correspond to the literal character or characters on the right: .nf ANY \fB?\fP BAR \fB|\fP BIARROW \fB<=>\fP COERCEARROW \fB<=\fP COLON \fB:\fP CONCATBOUNDARY \fB*\fP CONTEXTBOUNDARY \fB\-\fP DOLLAR \fB$\fP EQUAL \fB=\fP LANGLE \fB<\fP LARROW \fB<\-\fP LBRA \fB]\fP MORPHEMEBOUNDARY \fB+\fP NOTEQUAL \fB!=\fP RARROW \fB=>\fP RANGLE \fB<\fP RBRA \fB[\fP SLASH \fB/\fP WORDBOUNDARY \fB~\fP ALPHABETS \fB@Alphabets\fP ATTRIBUTES \fB@Attributes\fP CLASSES \fB@Classes\fP GRAMMAR \fB@Grammar\fP LEXICON \fB@Lexicon\fP PAIRS \fB@Pairs\fP SPELLING \fB@Spelling\fP TYPES \fB@Types\fP .fi .LP In the section header tokens above, spaces may separate the `\fB\@\fP' from the reserved word. .LP .SS Complex tokens .TP NAME .br is any sequence of letter, digit, underline (`\fB_\fP'), period (`\fB.\fP') .br Examples: .nf .RS .ft B category 33 Rule_9 __2__ Proper.Noun .RE .ft R .fi .TP LEXICALSTRING .br is a string of lexical symbols .TP SURFACESTRING is a string of surface symbols .TP SYMBOLSTRING .br is a string of just just one character (used only in alphabet declaration). .LP A string consist of zero or more characters within double quotes (`\fB"\fP'). Characters preceded by a backslash (`\fB\\\fP') are escaped (the usual C escaping convention apply). Symbols that have a name longer than one character are represented using a SGML entity like notation: `\fB&\fIsymbolname\fB;\fR'. The maximum number of symbols in a string is 127. .br Examples: .nf .RS .ft B "table" "," "" "double quote is \\" and backslash is \\\\" "&strong_e;" "escape like in C : \\t is ASCII tab" "escape with octal code: \\011 is ASCII tab" .fi .RE .LP Tokens can be separated by one or many blanks or comments. .br A blank separator is space, tab or newline. .br A comment starts with a semicolon and finishes at the next newline (except when the semicolon occurs in a string. .LP Inclusion of files can be specified with the usual `\fB#include\fP' directive: .br Example: .RS .ft B #include "verb.entries" .RE .LP will splice in the content of the file \fBverb.entries\fP at the point where this directive occurs. The `\fB#\fP' should be the first character on the line. Tabs or spaces may separate `\fB#\fP' and `\fBinclude\fP'. The file name must be quoted. Only tabs or spaces may occur on the rest of the line. Inclusion can be nested up to 10 levels. .SH SEE\ ALSO .BR mmorph(1). .HP G. Russell and D. Petitpierre, \fIMMORPH \- The Multext Morphology Program\fP, Version 2.3, October 1995, MULTEXT deliverable report for task 2.3.1. .SH AUTHOR Dominique Petitpierre, ISSCO, .SH COMMENTS The parser for the morphology description formalims above was written using .B yacc (1) and .B flex (1). Flex was written by Vern Paxson, , and is distributed in the framework of the GNU project under the condition of the GNU General Public License mmorph-2.3.4.2.orig/mmorph_v2.tex0100644000175000001440000006030006045657145015613 0ustar mvelausers% % mmorph, MULTEXT morphology tool % Version 2.3, October 1995 % Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland % Dominique Petitpierre, % Graham Russell, % \documentstyle[11pt,a4wide]{article} % for exdented paragraphs in the bibliography - bibtex is too much % trouble and not everybody has tib: \def\xp{\hangafter=1\hangindent=1.5em\noindent} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{MMORPH - The Multext Morphology Program\\[0.7ex] Version 2.3: October 1995\\[2.5ex] Deliverable 2.3.1} \author{Dominique Petitpierre and Graham Russell\\ ISSCO, 54 route des Acacias, CH-1227 Carouge, Switzerland\\ \verb|{petitp,russell}@divsun.unige.ch|} \date{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \maketitle %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Background} As the Technical Annex points out, many Multext applications will require the ability to perform various kinds of analysis on word tokens. For example, in some cases it will be necessary to abstract away from inflectional variation, so that e.g.\ {\em walk}, {\em walks}, {\em walking}, and {\em walked\/} are all treated as the same word type at the level of textual annotations. Conversely, it will sometimes be desirable to make use of richer information than that available in the raw text, so that e.g.\ {\em walking\/} can be identified as the present participle of `walk'. In addition, it is easy to envisage a need for flexibility in the triangular relation between word-token, textual annotations and lexical information; a single fixed linguistic analysis cannot fulfil the requirements of diverse text processing tasks. {\sf Mmorph} provides the means by which lexicons can be constructed and modified, and texts annotated with lexical information. Very generally, the program operates by relating the form of a word as found in text to an entry in a lexical database containing arbitrary information expressed in terms of attributes and values (see section~\ref{msd-sec} below). Various modes of interaction with {\sf mmorph} exist, depending on whether the user is developing, compiling, or exploiting a description (section~\ref{use-sec}). The lexical database is created from a set of initial lexical entries (section~\ref{lex-ent-sec}) and a set of structural rules (sections~\ref{m-rules-sec}, \ref{sp-rules-sec}). For full details on the use of {\sf mmorph}, we refer the reader to the manual pages included in the distribution; `mmorph(1)' describes command-line options controlling the behavior of the program and `mmorph(5)' defines the format of files containing a linguistic description. % % Actually, we could put them in as appendices % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Morphosyntactic Descriptions} \label{msd-sec} A {\bf morphosyntactic description} (MSD) is an expression in a formal language representing arbitrary kinds of information. Lexical entries relate word forms to MSDs, and structural rules analyse complex words by reference to the MSDs of their subparts. Essentially, a MSD has two components; a `type' and a set of attributes and values. The type can be thought of as a gross classification of lexical properties: `noun', `article', etc. Finer distinctions may be made by adding one or more attribute-value pairs to the type; familiar examples would be attributes such as `gender' and `tense', and values such as `neuter' and `future'. Taken together, a neuter noun in the accusative case might be represented by the MSD: % \begin{quote}\begin{verbatim} noun[gender=neuter case=accusative] \end{verbatim}\end{quote} % If we do not know or do not care whether this word is in fact nominative or accusative, a disjunctive value may be given, as shown below: % \begin{quote}\begin{verbatim} noun[gender=neuter case=accusative|nominative] \end{verbatim}\end{quote} % The choice of type, attributes and values is open to the user. We shall describe other aspects of MSD syntax when we present the structural rules in section~\ref{m-rules-sec}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Lexicon} \subsection{Lexical Entry Syntax} \label{lex-ent-sec} The initial lexical entries are of two kinds. In the case of a regular or unanalysable word such as {\em want\/} or {\em between}, they consist of a simple pairing of a MSD and a string representing the basic form of the word in question: % \begin{quote}\begin{verbatim} verb[form=base] "want" prep[type=time|place] "between" \end{verbatim}\end{quote} % In the case of suppletive or irregular forms, it is possible to specify the basic form of the word explicitly: % \begin{quote}\begin{verbatim} noun[num=pl] "mice" = "mouse" verb[form=past_prt] "gone" = "go" \end{verbatim}\end{quote} % This basic form will then be the one displayed when a word is looked up in {\sf mmorph}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Morphological Grammar} \label{m-rules-sec} \subsection{Declarations} It is necessary to declare the attributes that are to be used in the grammar, together with their possible values: % \begin{quote}\begin{verbatim} @ Attributes number : singular plural person : first second third etc. \end{verbatim}\end{quote} % The association of attributes to types is also declared: % \begin{quote}\begin{verbatim} @ Types noun : gender case verb : tense mood etc. \end{verbatim}\end{quote} % These declarations permit consistency checking over descriptions. They also permit the internal representations created by {\sf mmorph} to be more efficient. \subsection{Rules} Morphological rules have the form exemplified below: % \begin{quote}\begin{verbatim} lhs_type[att1=val1 att2=val2] <- rhs_type1[att3=val3 att4=val4] rhs_type2[att5=val5] \end{verbatim}\end{quote} % The interpretation of such a rule is that a valid word-form of type \verb|lhs_type| consists of the concatenation of the forms associated with \verb|rhs_type1| and \verb|rhs_type2|, providing that the three MSDs involved have the specified values for their respective attributes. MSDs are interpreted by a restricted variety of graph unification (see e.g.\ Shieber 1986), in which all values are atomic. Briefly, this has the following consequences: % \begin{enumerate} \item The order in which attributes are written is not significant; \item Attributes which are not relevant to a particular rule may be omitted; \item Variables may be used to enforce sharing of values between different MSDs within a single rule. \end{enumerate} % For example, the following rule has the effect of creating a plural noun from a singular noun and a plural noun suffix, ensuring that the resulting plural has the same gender as the singular: % \begin{quote}\begin{verbatim} noun[number=plural gender=$gen] <- noun[number=singular gender=$gen] noun_suffix[number=plural] \end{verbatim}\end{quote} % \subsection{Affixes} Affixes are building blocks used by the binary rules described above. They have the form exemplified below: % \begin{quote}\begin{verbatim} "affix_string" type[att1=val1 att2=val2] \end{verbatim}\end{quote} % The interpretation of such a rule is that if the specified MSD unifies with one part of the right hand side of a binary rule and another building block (lexical entry or the result of applying another rule) MSD unifies with the other part then the affix string is concatenated to the other string to form the result string, associated to the result MSDs. % For example, the following affix rule provides the suffix {\tt "s"} which may concatenate with a noun to make a plural noun: % \begin{quote}\begin{verbatim} "s" noun_suffix[number=plural] \end{verbatim}\end{quote} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Spelling Rules} \label{sp-rules-sec} \subsection{Lexical and Surface Forms} \label{lex-surf-sec} The structural rules described in section~\ref{m-rules-sec} have the effect of concatenating word-segments. Often, however, a complex word-form differs from the result of concatenating its components. Well-known examples from English include the doubling of some final consonant characters before a suffix-initial vowel ({\em big+er = bigger}), insertion of an epenthetic `e' ({\em box+s = boxes}) in some places, and deletion of an `e' in others ({\em fine+est = finest}). {\sf Mmorph} incorporates a mechanism allowing adjustment rules to be written for these cases and many others. It is convenient to think of such adjustments as discrepancies between two strings of characters, one representing the `surface form' of a word, as found in texts, and the other representing the `lexical form' composed of substrings entered into the linguistic description. To make this a little clearer, we show the surface and possible lexical forms of the words mentioned above: % \begin{quote}\begin{verbatim} b i g g e r b o x e s f i n e s t b i g e r b o x s f i n e e s t \end{verbatim}\end{quote} % The spelling rules are implemented in a version of what has come to be known as a `two-level' formalism. As its name suggests, this permits correspondences to be established between the surface and lexical `levels'. Discussions of two-level rules may be found in Pulman and Hepple (1993), Ritchie et al.\ (1992), and Ruessink (1989). \subsection{Declarations} As before, {\sf mmorph} requires some declarations. The first of these concerns character classes, e.g.: % \begin{quote}\begin{verbatim} @ Classes Vowel: a e i o u SXZ: s x z \end{verbatim}\end{quote} % Names of classes declared in this way may be used within spelling rules in order to generalize over the members of the class. A second declaration concerns pairs of items from the lexical and surface strings. Again, sets of pairs declared in this way may be referred to by their name within spelling rules: % \begin{quote}\begin{verbatim} @ Pairs Inserted_E: e/<> Double_Cons: /b /d /g ... \end{verbatim}\end{quote} % This example illustrates the notation for character sequences; {\tt <>} matches against the empty string, while {\tt } matches against two successive {\tt b}\,s. \subsection{Two-Level Rules} By default, each character is permitted to match itself. Thus no rule need be written stating that a lexical{\tt a} corresponds to a surface {\tt a}, and so on. The rules themselves take the form % \begin{quote}\begin{verbatim} Rulename : operator LeftContext - Focus - RightContext \end{verbatim}\end{quote} % The `operator' is one of `{\tt =>}', `{\tt <=}' or `{\tt <=>}', depending on whether the rule is to license a lexical-surface correspondence, block all non-matching correspondences, or both. The `focus' is the active portion of the rule; it is here that the discrepancies mentioned earlier are described. The two contexts restrict the application. As an example, consider a simplified version of the rule responsible for `inserting' {\tt e} in {\em boxes\/}: % \begin{quote}\begin{verbatim} Simple_Add_E : <=> SXZ - Inserted_E - * s \end{verbatim}\end{quote} % The left context consists of the character class name {\tt SXZ}, defined above. It is interpreted as the set of pairs {\tt \{s/s}, {\tt x/x}, {\tt z/z\}}. The right context consists simply of {\tt s}, similarly interpreted as {\tt s/s}; preceding this is an asterisk identifying the boundary between two word-segments. \verb|Inserted_E| is the mnemonic name of the pair {\tt e/<>}. The rule as a whole states that whenever a lexical string contains the sequence matching % \begin{quote}\begin{verbatim} x 'boundary' s \end{verbatim}\end{quote} % the surface string must match % \begin{quote}\begin{verbatim} x e 'boundary' s \end{verbatim}\end{quote} % The rule can be restricted to apply only in the context of specific kinds of affixes. These constraints are specified by a list of MSDs associated to the spelling rule. % \begin{quote}\begin{verbatim} Simple_Add_E : <=> SXZ - Inserted_E - * s noun_suffix[number=plural] verb_suffix[] \end{verbatim}\end{quote} % The morpheme boundary indicated by the star determines an affix whose type and features should be subsumed by at least one of the MSDs associated to the spelling rule. In the example above it would apply only in the context of a plural noun suffix or a verb suffix. If there is no star in the spelling rule, then the affix is the one adjacent (and lowest in the structure tree) to the word-segment where the first letter of the focus occurs. If there is no affix, then the type and features of the lexical stem is used. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Using {\sf mmorph}} \label{use-sec} \subsection{Organization of a Description} A description consists of eight declaration sections (see the manual page mmorph(5) for details). They can appear in just one file, or be split across many files and referenced in the main file by \verb|#include "file"| directives. This is convenient for example to be able to try different lexical entries or test different affixes with a particular description: one has just to change the file reference in a directive. For extra convenience, an option ({\tt -a}) is provided to specify on the command line a file whose content will be used in place of the \verb|@ Lexicon| section of the main file. This used mainly to augment a database with new entries, or test a restricted set of lexical entries. \subsection{Testing} To test the rule applications on the lexical entries specified in a morphological description, without creating a database and without looking up words, use the command line options \verb|-n -m morphfile -l logfile|. The entries that would be entered in the database are written into the file \verb|logfile|. If this file is not specified the output goes to the screen (standard error). In order to do the same operations as above, but on a set of alternate lexical entries in in a file \verb|addfile|, use the extra option \verb|-a addfile|. The lexical entries in morphfile will be ignored. \subsection{Compiling} When a set of rules and associated lexical entries is completed, a full form database can be created with the option \verb|-c|. If the option \verb|-a addfile| is also specified, both the lexical entries of the main file and of \verb|addfile| are used to create the database. If neither the option \verb|-c| nor \verb|-n| is specified, the database is augmented with entries in \verb|addfile| (note that new entries are added to existing ones, rather than replacing them). After processing all the entries, the program reads its input (standard input or the input file if specified) to look up words (see below). \subsection{Accessing} Once a full form database has been created, entries can be looked up with % \begin{quote}\begin{verbatim} mmorph -m morphfile -r rejectfile inputfile outputfile \end{verbatim}\end{quote} % The inputfile should consist of words, one per line to be looked up. The full forms and associated MSDs are written in the output file, one per line, with a new line separating groups of full forms corresponding to the same input word. Words that are not found in the database are written in the file \verb|rejectfile|. If not specified these three files correspond respectively to the UNIX standard input, standard output and standard error, which allows the user to work interactively or with a piped stream. If the input file is in the MULTEXT record/field format, word forms can be annoted with % \begin{quote}\begin{verbatim} mmorph -m morphfile -U -C class1,class2,classN inputfile outputfile \end{verbatim}\end{quote} % where the option \verb|-C| specifies the list of token classes assigned by the segmenter that should be looked up. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Restrictions and Future Extensions} \label{restrict-sec} This implementation has a few restrictions: % \begin{itemize} \item Different attributes declared with the the same set of values cannot be identified by the same variable. This is not very useful with flat feature structures anyway. \item No SGML input and output format is provided yet (only simple lookup and record/field lookup). \end{itemize} % Future developments are foreseen which will allow {\sf mmorph} to: % \begin{itemize} \item Make it possible to feed {\sf mmorph} with SGML marked text and obtain the result of the lookup in an augmented SGML format. (Needs an SGML API). \item Specify rules of word compounding; compounds could be analysed (recognized) at lookup time, rather than being stored in a full form database. \item Make hypotheses about unknown words at lookup time (e.g.\ `{\em xyzable\/} is an adjective'). \item Segment a text into words and punctuations. It would use the same principle as the spelling rules applying at morpheme boundaries, but at word boundaries. \end{itemize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{References} \xp Pulman, S.G. and M.R. Hepple (1993) ``A Feature-Based Formalism for Two-Level Phonology: A Description and Implementation''. {\em Computer Speech and Language\/} 7, 333--358. \xp Ritchie, G.D., G.J. Russell, A.W. Black, and S.G. Pulman (1992) {\em Computational Morphology: Practical Mechanisms for the English Lexicon} Cambridge, MA: The MIT Press \xp Ruessink, H. (1989) ``Two-Level Formalisms''. Working Papers in Natural Language Processing no.\,5, Rijksuniversiteit Utrecht. \xp Shieber, S.M. (1986) {\em An Introduction to Unification-Based Approaches to Grammar}, Stanford: CSLI. \newpage \section*{Appendix A: Sample Description} \addtolength{\baselineskip}{-0.35ex} \begin{verbatim} ;; MULTEXT MORPHOLOGY TOOL ;; Sample treatment of English inflection ;;--------------------------------------------------------------- ;; Declare the surface and lexical alphabets. @ Alphabets lexical : 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 u_e qu surface : 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 ;;--------------------------------------------------------------- ;; The attributes we'll be using, together with their values. @ Attributes ;; NUMber: SinGular and PLural num : sg pl ;; PERson: 1st, 2nd, 3rd per : 1 2 3 ;; VFM (Verb ForM) values: ;; bse - "base" (read, eat, walk, etc.) ;; prp - "present participle" (reading, eating, walking, etc.) ;; psp - "past participle" (read, ate, walked, etc.) ;; pres - "present finite" (read, reads, eat, eats, etc.) ;; past - "past finite" (read, ate, walked, etc.) vfm : pres past bse psp prp ;; DEGree of adjectives: BaSE, COMParative, and SUPerlative deg : bse comp sup ;; INFLectable (i.e. complete word)? infl : yes no ;; Classification of (ir)regular verbs and nouns: ;; r regular: past tense in -(e)d - past participle in -(e)d ;; i1 regular past tense, irregular past participle ;; i2 irregular past tense and past participle ;; i3 dual form past tense and past participle ;; i irregular nouns (i.e. non-standard plurals) reg : r i1 i2 i3 i ;;--------------------------------------------------------------- ;; The types we'll be using, together with their attributes. @ Types noun: num | infl adj: deg | infl verb: vfm num per | infl reg nsuf: num adjsuf: deg vsuf: num per vfm | reg ;;--------------------------------------------------------------- ;; Word-structure rules. @ Grammar ;; Goal rules define what counts as a good complete word: ;; GoalN: noun[] GoalA: adj[] GoalV: verb[] ;; Plural nouns. The RHS noun feature structure will not ;; unify with lexical entries marked as 'infl-no', so nouns ;; with irregular or non-existent plurals are not accepted. ;; NPL: noun[num=pl] <- noun[num=sg infl=yes] nsuf[num=pl] ;; affixes for this rule: ;; N.plural: "s" nsuf[num=pl] ;; Comparative and superlative adjectives. The value of 'deg' ;; in the LHS and the suffix is unified - and restricted to ;; 'comp' or 'sup' ;; ADJ1: adj[deg=$deg=comp|sup] <- adj[deg=bse infl=yes] adjsuf[deg=$deg] ADJ.comparative: "er" adjsuf[deg=comp] ADJ.superlative: "est" adjsuf[deg=sup] ;; Various verb forms. Again we restrict application to verbs ;; not marked as 'infl=no'. ;; VB1: verb[vfm=pres num=sg per=3] <- verb[infl=yes vfm=bse] vsuf[vfm=pres] VB2: verb[vfm=$vfm] <- verb[infl=yes vfm=bse reg=$reg] vsuf[vfm=$vfm!=pres reg=$reg] ;; affixes VB.pres: "s" vsuf[vfm=pres] VB.prp: "ing" vsuf[vfm=prp] VB.past.reg: "ed" vsuf[vfm=psp|past reg=r] VB.past.i1: "ed" vsuf[vfm=past reg=i1] ;;=============================================================== ;; Define character classes and give them names. @ Classes C: b c d f g h j k l m n p q r s t v w x z SC: s c ;;--------------------------------------------------------------- ;; Define names for sets of pairs of characters. ;; "X/Y" matches X in surface string and Y in lexical string. ;; "/Z" matches surface string XY and lexical string Y. ;; "<>" matches the empty string. @ Pairs l1_s2_SZ: /s /z l1_s2: /b /d /g /k /l /m /n

/p /r /t /v SXZ: s/s x/x z/z ;; We can "inherit" from other pair sets, provided that they have ;; already been defined (i.e. before the compiler sees this): I_YSXZ: i/y SXZ EI: e/e i/i V_no_u_e: a/a e/e i/i o/o u/u ;; The general "V" pair set includes the lexical "u_e" symbol, ;; representing an "unstressed e". See rules lex_1_surf_2[ab]. V: e/u_e V_no_u_e ;; Consonant pairs augmented with a match for /qu. Lexical ;; "qu" behaves like a consonant and not a consonant-vowel ;; sequence for the purpose of rules lex_1_surf_2[ab]. CC: b/b c/c d/d f/f g/g h/h j/j k/k l/l m/m n/n p/p q/q r/r s/s t/t v/v w/w x/x z/z ?/qu ;;--------------------------------------------------------------- ;; The spelling rules. @ Spelling lex_1_surf_2a: ;; big+er->bigger, hop+ing->hopping, tap+ed->tapped, etc. ;; Preceding vowel pair must not be e/u_e - see lexical entries ;; for "offer" and "prefer" <=> CC V_no_u_e - l1_s2 - * V lex_1_surf_2b: ;; bus+s->busses, fez+s->fezzes, quiz+s->quizzes, etc. <=> CC V_no_u_e - l1_s2_SZ - * s/s lex_UE_surf_E: ;; The lexical "u_e" symbol matches surface "e" everywhere, ;; so the left and right contexts are empty. <=> - e/u_e - lex_QU_surf_Q_U: ;; The lexical "qu" symbol matches surface "q u" everywhere. <=> - /qu - surfonly_E_1: ;; boss+s->bosses, box+s->boxes <=> C SXZ * - e/<> - s/s surfonly_E_2: ;; dish+s->dishes, catch->catches <=> SC h/h * - e/<> - s/s surfonly_E_3: ;; potato+s->potatoes ;; This gets tango+s->tangos wrong - we need to distinguish ;; the "tango-o" from the "potato-o" somehow. There are ;; various ways of doing this, but this description is just ;; an illustration, so we won't bother. <=> C o/o * - e/<> - s lexonly_E: ;; large+est->largest, agree+ed->agreed <=> - <>/e - * EI lex_Y_surf_I: ;; easy+er->easier, carry+s->carries, <=> C - i/y - * e/e lex_Y_surf_IE: ;; fry+s->fries <=> C - /y - * s/s lex_I_surf_Y: ;; lie+ing->lying, etc. <=> - y/i <>/e - * i/i ;;--------------------------------------------------------------- ;; Now the lexicon. This is just for testing - in real life, ;; we would use "#include" to load a bigger list of entries. @ Lexicon ;; ;; nouns ;; noun[num=sg] "dog" "box" "boss" ;; &qu; is a special lexical symbol allowing "qu" to be treated ;; as a consonant: "&qu;iz" = "quiz" "fez" "dish" "church" "potato" "crisis" "crises" ;; ;; adjectives ;; adj[deg=bse] "big" "fine" "waxy" adj[deg=bse infl=no] "intelligent" ;; ;; verbs ;; verb[vfm=bse reg=r] "walk" "hop" "fry" "lie" "race" "prefer" ;; &u_e; is an "unstressed e" - compare "prefer": "off&u_e;r" = "offer" verb[vfm=bse reg=i1] "mow" verb[vfm=psp] "mown" verb[vfm=bse reg=i2] "sing" verb[vfm=past] "sang" verb[vfm=psp] "sung" ;;--------------------------------------------------------------- \end{verbatim} \end{document} mmorph-2.3.4.2.orig/mymalloc.c0100644000175000001440000000333406045657146015146 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* mymalloc.c convenient wrappers around memory allocation functions */ #ifndef MALLOC_FUNC_CHECK #include #include #include "mymalloc.h" extern int sys_nerr; extern char *sys_errlist[]; /* extern char *strdup();*/ extern void fatal_error(); #define MEM_ERROR(f_name) \ if (errno == ENOMEM) \ fatal_error("out of memory (%s)",f_name); \ else \ fatal_error("program bug: memory allocation error (%s)",f_name) void my_malloc(var, size) T_PTR *var; size_t size; { if ((*var = malloc(size)) == NULL) MEM_ERROR("malloc"); } void my_realloc(var, size) T_PTR *var; size_t size; { if ((*var = realloc(*var, size)) == NULL) MEM_ERROR("realloc"); } void my_calloc(var, nelem, size) T_PTR *var; size_t nelem; size_t size; { if ((*var = calloc(nelem, size)) == NULL) MEM_ERROR("calloc"); } void my_strdup(var, str) char **var; char *str; { if ((*var = strdup(str)) == NULL) MEM_ERROR("strdup"); } void my_free(ptr) T_PTR ptr; { if (ptr == NULL) fatal_error("program bug: trying to free a NULL pointer"); errno = 0; /* clear error */ #if defined(STDC_HEADERS) || defined(__GNUC__) || lint free(ptr); if (errno != 0) fatal_error("program bug: cannot free pointer (errno=%d=%s)", errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); #else if (free(ptr) != 1) fatal_error("program bug: cannot free pointer (errno=%d)", errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); #endif } #endif /* MALLOC_FUNC_CHECK */ mmorph-2.3.4.2.orig/mymalloc.h0100644000175000001440000000467206045657150015154 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef mymalloc_h #define mymalloc_h #include "config.h" #ifndef NULL #define NULL 0L #endif #ifdef __STDC__ #define T_PTR void * #else #define T_PTR char * #endif #ifdef MALLOC_FUNC_CHECK #include #define MEM_ERROR(f_name) \ if (errno == ENOMEM) \ fatal_error("out of memory (%s)",f_name); \ else \ fatal_error("program bug: memory allocation error (%s)",f_name) #define my_malloc(var, size) \ { \ if ((*(var) = malloc(size)) == NULL) \ MEM_ERROR("malloc"); \ } #define my_realloc(var, size) \ { \ if ((*(var) = realloc(*(var), (size))) == NULL) \ MEM_ERROR("realloc"); \ } #define my_calloc(var, nelem, size) \ { \ if ((*(var) = calloc((nelem), (size))) == NULL) \ MEM_ERROR("calloc"); \ } #define my_strdup(var, str) \ { \ if ((*(var) = STRDUP(str)) == NULL) \ MEM_ERROR("strdup"); \ } #if defined(STDC_HEADERS) || defined(__GNUC__) || lint #define my_free(ptr) \ { \ if ((ptr) == NULL) \ fatal_error("program bug: trying to free a NULL pointer"); \ errno = 0; /* clear error */ \ free(ptr); \ if (errno != 0) \ fatal_error("program bug: cannot free pointer (errno=%d=%s)", \ errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); \ } #else #define my_free(ptr) \ { \ if ((ptr) == NULL) \ fatal_error("program bug: trying to free a NULL pointer"); \ errno = 0; /* clear error */ \ if (free(ptr) != 1) \ fatal_error("program bug: cannot free pointer (errno=%d)", \ errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); \ } #endif /* defined(STDC_HEADERS) || defined(__GNUC__) || lint */ #else extern void my_malloc(); extern void my_free(); extern void my_realloc(); extern void my_calloc(); extern void my_strdup(); #endif /* MALLOC_FUNC_CHECK */ #define MY_MALLOC(var,type) \ my_malloc((T_PTR *) &(var), (size_t) sizeof (type)) #define MY_STRALLOC(var,size) \ my_malloc((T_PTR *) &(var), (size_t) size) #define MY_REALLOC(var, nelem, type) \ my_realloc((T_PTR *) &(var), (size_t) ((nelem) * sizeof (type))) #define MY_CALLOC(var,nelem,type) \ my_calloc((T_PTR *) &(var), (size_t) (nelem), (size_t) sizeof (type)) #define MY_STRDUP(var,str) \ my_strdup((char **) &(var), (char *) (str)) #define MY_FREE(ptr) \ my_free((T_PTR) (ptr)) #endif /* mymalloc_h */ mmorph-2.3.4.2.orig/output.c0100644000175000001440000000742706045657152014675 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* handle all printing */ #include #include #include "user.h" #include "output.h" #include "parse.h" FILE *outfile; FILE *logfile; FILE *rejectfile; char *prompt = PROMPT; /*VARARGS*/ void fatal_error(va_alist) va_dcl { va_list ap; char *format; va_start(ap); format = va_arg(ap, char *); (void) fflush(outfile); if (parsing) { if (fprintf(logfile, "\"%s\", line %d: syntax error before character %d\n", file_name_stack[stack_index], yylineno, linepos) == EOF) EXIT(3); if (defined_symbol != NULL) if (fprintf(logfile, "%s %s \"%s\"\n", "error in the definition of", symbol_kind_str[defined_kind], defined_symbol->name) == EOF) EXIT(3); } if (vfprintf(logfile, format, ap) == EOF) EXIT(3); if (fprintf(logfile, "\n") == EOF) EXIT(3); va_end(ap); EXIT(2); } /*VARARGS*/ void print_warning(va_alist) va_dcl { va_list ap; char *format; va_start(ap); format = va_arg(ap, char *); (void) fflush(outfile); if (fprintf(logfile, "Warning: ") == EOF) EXIT(3); if (vfprintf(logfile, format, ap) == EOF) EXIT(3); if (fprintf(logfile, "\n") == EOF) EXIT(3); va_end(ap); } /*VARARGS*/ void print_out(va_alist) va_dcl { va_list ap; char *format; va_start(ap); format = va_arg(ap, char *); if (vfprintf(outfile, format, ap) == EOF) EXIT(3); va_end(ap); } void flush_out() { (void) fflush(outfile); } /*VARARGS*/ void print_log(va_alist) va_dcl { va_list ap; char *format; va_start(ap); format = va_arg(ap, char *); if (vfprintf(logfile, format, ap) == EOF) EXIT(3); va_end(ap); } /*VARARGS*/ void print(va_alist) va_dcl { va_list ap; char *format; FILE *file; va_start(ap); file = va_arg(ap, FILE *); format = va_arg(ap, char *); if (vfprintf(file, format, ap) == EOF) EXIT(3); va_end(ap); } void print_letter(file, letter) FILE *file; t_letter letter; { int status; int c; if (letter == LETTER_ANY) { status = putc('?', file); } else { if ((c = (int) letter_to_char_map[letter]) > 0) { switch (c) { /* reverse of what is in tokenize.l */ case '\n': status = fputs("\\n", file); break; case '\t': status = fputs("\\t", file); break; default: if (isprint(c)) status = putc(c, file); else status = fprintf(file, "\\0%3o", c); break; } } else if (letter == *morpheme_boundary) status = putc('+', file); else if (letter == *word_boundary) status = putc('~', file); else { status = putc('&', file); if (status != EOF) status = fputs(symbol_set[Pair].ref[letter]->name, file); if (status != EOF) status = putc(';', file); } } if (status == EOF) if (file != logfile) fatal_error("error while writing in a file (errno=%d=%s)", errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); else /* cannot print error message to log */ EXIT(3); } void print_string_l(file, string, string_length) FILE *file; t_letter *string; int string_length; { t_letter *letter; letter = string; while (letter < string + string_length) { print_letter(file, *letter); letter++; } } /* Same as before print_string_l(), but for NUL terminated letter strings */ void print_string(file, string) FILE *file; t_letter *string; { t_letter *letter; letter = string; while (*letter) { print_letter(file, *letter); letter++; } } mmorph-2.3.4.2.orig/output.h0100644000175000001440000000176306045657154014701 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef output_h #define output_h #include "config.h" /* user prompt when input and output are ttys */ #define PROMPT "> " extern FILE *outfile; extern FILE *logfile; extern FILE *rejectfile; extern char *prompt; extern void fatal_error( /* va_alist */ ); extern void print_warning( /* va_alist */ ); extern void flush_out(); extern void print_out( /* va_alist */ ); extern void print_log( /* va_alist */ ); extern void print( /* va_alist */ ); extern void print_string(); extern void print_string_l(); extern void print_letter(); #ifdef UNDEF /* make "gcc -Wall" and lint happy */ #ifndef STDC_HEADERS extern int printf(); extern int fprintf(); extern int sscanf(); extern int vfprintf(); extern int fflush(); extern int fwrite(); extern int fputs(); extern void exit(); #endif #endif #endif /* output_h */ mmorph-2.3.4.2.orig/parse.h0100644000175000001440000000161506045657156014451 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef parse_h #define parse_h #ifndef t_str #define t_str char * #endif #define MAXSTRLNG 128 extern char *augment_file_name; extern char *db_file_name; extern char *gram_file_name; extern int parsing; extern char *yytext; extern int yydebug; extern int yylineno; extern int linepos; extern char *file_name_stack[]; extern short stack_index; extern int yychar; extern int augmenting; extern int allow_string_letters; extern s_symbol *defined_symbol; extern crc32file crc; extern unsigned char crc_hash[]; extern t_boolean parse_only; extern t_boolean normalize; extern t_boolean normalize_flag; extern int yyparse(); extern void yyerror(); extern int yylex(); extern void initfile(); #endif /* parse_h */ mmorph-2.3.4.2.orig/spell.c0100644000175000001440000007713706045657160014460 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* spell.c handle spelling rules parsing and interpretation Dominique Petitpierre, ISSCO Summer 1994 */ #include "user.h" t_letter *surface_letter_map; /* map of user characters to letter */ t_letter *lexical_letter_map; /* map of user characters to letter */ t_letter *current_letter_map = NULL; /* used while parsing */ /* map of letter to user characters (only for 1 char name letters) */ unsigned char *letter_to_char_map; t_card max_spell_length; /* size of the longest spelling rule */ t_card max_left_context_length; /* size of the longest left context */ t_card max_rest_length; /* size of the longest focus + right context */ t_letter letter_any[2] = {LETTER_ANY, NUL_LETTER}; t_letter empty_string[1] = {NUL_LETTER}; t_letter *morpheme_boundary; t_letter *word_boundary; s_pair *morpheme_boundary_pair; s_pair *word_boundary_pair; t_letter first_lexical_letter; e_symbol_kind current_letter_kind; int alphabet_size; /* number of symbols in merged alphabets */ int lexical_alphabet_size; /* number of symbols in lexical alphabet */ static int spell_set_size; /* number of rules */ static int spell_set_chunk; /* size of a spell rule bit map in WORDs */ static WORD_TYPE *match_pos; /* bit array of position * alphabet * rules */ static WORD_TYPE *applicability_map; /* bit array of word positions * rules */ static t_letter surface_tape[CONCAT_SIZE]; static s_pos_stack pos_stack[POS_STACK_SIZE]; /* remembers what was applied where */ static t_letter *current_base_lex; /* external arguments to handle_result */ static s_tfs *current_tfs; /* idem */ static t_card current_tfs_index; /* idem */ static int valid_surface; /* idem */ /* point to the beginning of word in concatenation */ static t_letter *surface_word; /* point to the beginning of word in surface_tape */ static t_letter *lexical_word; s_pair * new_pair(surface, lexical, pair_flags, next) t_letter *surface; t_letter *lexical; t_flag pair_flags; s_pair *next; { s_pair *pair; MY_MALLOC(pair, s_pair); pair->pair_flags = pair_flags; pair->surface = surface; pair->lexical = lexical; pair->next = next; return (pair); } void is_pair_concrete(pair) s_pair *pair; { s_pair *pair_member; pair_member = pair; do { if ((pair->pair_flags != BOTH_LETTERS) || (pair->lexical == letter_any) || (pair->surface == letter_any)) fatal_error("non concrete pair in focus"); pair_member = pair_member->next; } while (pair_member != NULL); } /* ignore the distinction between letter class or letter string */ void add_explicit_pair(pair, surface, lexical, pair_flags, lexical_set) s_pair *pair; t_letter *surface; t_letter *lexical; t_flag pair_flags; s_bitmap *lexical_set; { s_pair *insert_pair; int ok; if (pair->surface == NULL) { /* pair not yet defined */ pair->pair_flags = pair_flags; pair->surface = surface; pair->lexical = lexical; pair->next = NULL; /* list of one member */ if (pair_flags & LEXICAL_IS_CLASS) assign_or(lexical_set, (s_bitmap *) lexical); else if (lexical == letter_any) fill_bitmap(lexical_set); else if (*lexical != NUL_LETTER) set_bit(lexical_set, (long) *lexical); } else { insert_pair = new_pair(surface, lexical, pair_flags, pair->next); /* insert member: TODO: preserve order */ pair->next = insert_pair; ok = TRUE; if (pair_flags & LEXICAL_IS_CLASS) if (test_and(lexical_set, (s_bitmap *) lexical)) ok = FALSE; else assign_or(lexical_set, (s_bitmap *) lexical); else if (lexical == letter_any) ok = FALSE; else if (*lexical != NUL_LETTER) ok = set_if_not_set(lexical_set, (long) *lexical); else fatal_error("%s %s", "a pair with an empty lexical part has to be", "alone in a Pairs definition"); if (!ok) fatal_error("%s %s", "cannot specify a lexical symbol", "more than once in a pair set"); } } void add_pair(pair, new_pair, lexical_set) s_pair *pair; s_pair *new_pair; s_bitmap *lexical_set; { s_pair *pair_member; pair_member = new_pair; /* copy the new pair set definition */ do { add_explicit_pair(pair, pair_member->surface, pair_member->lexical, pair_member->pair_flags, lexical_set); pair_member = pair_member->next; } while (pair_member != NULL); } int lexical_width(pair) s_pair *pair; { if (pair->pair_flags & LEXICAL_IS_CLASS) return (1); else return (strlen((char *) pair->lexical)); } t_letter * find_letter(letter_name, letter_kind) t_str letter_name; e_symbol_kind letter_kind; { s_symbol *pair_symbol; pair_symbol = *find_symbol(letter_name, &symbol_set[Pair]); if (pair_symbol->kind != letter_kind && pair_symbol->kind != Pair_Letter) fatal_error("symbol \"%s\" is not a %s", pair_symbol->name, symbol_kind_str[letter_kind]); /* return the internalized letter */ if (letter_kind == Surface_Letter) return (pair_symbol->data->pair.surface); else return (pair_symbol->data->pair.lexical); } /* convert a string of single chars to internal representation imperfect, because it should comply with &entity; notation and \ escapes */ t_boolean map_letter(user_string, letter_string, letter_kind) t_str user_string; t_letter *letter_string; e_symbol_kind letter_kind; { register t_str current_char; register t_letter *current_letter; t_letter *letter_map; if (letter_kind == Surface_Letter) letter_map = surface_letter_map; else letter_map = lexical_letter_map; current_char = user_string; current_letter = letter_string; while (letter_map[(unsigned char) *current_char]) { *current_letter++ = letter_map[(unsigned char) *current_char++]; } if (*current_char != '\0') { #ifdef COMMENTED_OUT print_warning("symbol \"%c\" occurring in \"%s\" is not a %s", *current_char, user_string, symbol_kind_str[letter_kind]); #endif return (FALSE); } else { *current_letter++ = letter_map[(unsigned char) *current_char++]; return (TRUE); } } #ifdef DEBUG static WORD_TYPE * MATCH_POS(i, j) int i; int j; { return (match_pos + ((i * lexical_alphabet_size + j) * spell_set_chunk)); } static WORD_TYPE * APPLICABILITY_MAP(i) int i; { return (applicability_map + (i * spell_set_chunk)); } static void ASSIGN_SET(spell_set1, spell_set2) WORD_TYPE *spell_set1; WORD_TYPE *spell_set2; { (void) memcpy((T_PTR) spell_set1, (T_PTR) spell_set2, spell_set_chunk * WORD_SIZE); } static void AND_SET(spell_set1, spell_set2) WORD_TYPE *spell_set1; WORD_TYPE *spell_set2; { register int i; for (i = 0; i < spell_set_chunk; i++) spell_set1[i] &= spell_set2[i]; } #else #define MATCH_POS(i,j) \ (match_pos+(((i) * lexical_alphabet_size + (j)) * spell_set_chunk)) #define APPLICABILITY_MAP(i) \ (applicability_map + ((i) * spell_set_chunk)) #define ASSIGN_SET(spell_set1,spell_set2) \ (void) memcpy((T_PTR) (spell_set1), (T_PTR) (spell_set2), \ spell_set_chunk * WORD_SIZE) #define AND_SET(spell_set1,spell_set2) \ { register int i; \ for (i=0; i < spell_set_chunk; i++) \ *((spell_set1)+i) &= *((spell_set2)+i); \ } #endif /* DEBUG */ #define MARK_SPELL(spell_set,spell_index) \ SET_BIT(*((spell_set)+WORD_OFFSET(spell_index)), (spell_index)) #define UNMARK_SPELL(spell_set,spell_index) \ UNSET_BIT(*((spell_set)+WORD_OFFSET(spell_index)), (spell_index)) #define FOR_EACH_SPELL(spell_set, n) \ for ((n) = 0L; (n) < spell_set_size; (n)++) \ if (TEST_BIT(*((spell_set)+WORD_OFFSET(n)),(n))) #define SPELL_NAME(spell_index) \ (symbol_set[Spelling].ref[(spell_index)]->name) #define COERCE(spell) \ ((spell)->kind==Obligatory || (spell)->kind==Coerce) #define RESTRICT(spell) \ ((spell)->kind==Obligatory || (spell)->kind==Optional) static void match_any(pos_index, spell_index, start_letter) int pos_index; int spell_index; t_letter start_letter; { t_letter letter; for (letter = start_letter; (int) letter < lexical_alphabet_size; letter++) MARK_SPELL(MATCH_POS(pos_index, (int) letter), spell_index); } static void fill_pos(pattern_chain, pos, spell_index, direction) s_chain *pattern_chain; int pos; int spell_index; int direction; { s_chain *pattern; s_pair *pair; int letter; int pos_index; if (pattern_chain != NULL) { pos_index = pos; pattern = pattern_chain; do { pattern = pattern->next; pair = (s_pair *) pattern->item; if (lexical_width(pair) != 0) { /* for the moment lexical pair width is restricted to 0 or 1 */ do { if (pair->pair_flags & LEXICAL_IS_CLASS) FOR_EACH_BIT((s_bitmap *) pair->lexical, letter) MARK_SPELL(MATCH_POS(pos_index, letter), spell_index); else if (pair->lexical == letter_any) match_any(pos_index, spell_index, first_lexical_letter); else MARK_SPELL(MATCH_POS(pos_index, (int) *pair->lexical), spell_index); pair = pair->next; } while (pair != NULL); /* end of pair list */ pos_index += direction; } } while (pattern != pattern_chain); /* end of circular list */ } } void prepare_spell() { int spell_index; int pos_index; int pos_index2; s_spell_instance *spell; spell_set_size = symbol_set[Spelling].card; /* be blunt: bit array of positions by alphabet by rules */ spell_set_chunk = DIV_ROUND_UP(spell_set_size, BITS(WORD_TYPE)); MY_CALLOC(match_pos, max_spell_length * lexical_alphabet_size * spell_set_chunk, WORD_TYPE); /* fill this rather sparse matrix with bits corresponding to which rule have which letter in which position */ for (spell_index = 0; spell_index < spell_set_size; spell_index++) { spell = symbol_set[Spelling].ref[spell_index]->data->spelling.instance; pos_index = max_left_context_length - spell->left_context_length; /* the rule matches for all letter before the context even inexistant ones (0) */ for (pos_index2 = 0; pos_index2 < pos_index; pos_index2++) match_any(pos_index2, spell_index, NUL_LETTER); /* mark that the rule matches for each left context position/letter */ fill_pos(spell->left_context, max_left_context_length - 1, spell_index, -1); fill_pos(spell->focus, max_left_context_length, spell_index, 1); fill_pos(spell->right_context, max_left_context_length + spell->focus_length, spell_index, 1); pos_index2 = max_left_context_length + spell->focus_length + spell->right_context_length; /* the rule matches for all letter after the context even inexistant ones (0) */ for (; pos_index2 < max_spell_length; pos_index2++) match_any(pos_index2, spell_index, NUL_LETTER); } MY_CALLOC(applicability_map, CONCAT_SIZE * spell_set_chunk, WORD_TYPE); } /* each member of the applicability map is the set of rule whose focus start at word_index and that match the lexical tape */ void fill_applicability_map(word_tree, stem_length) s_rule_instance *word_tree; t_card stem_length; { t_letter *word; int word_length; t_letter *letter; int word_index; int pos_index; WORD_TYPE *spell_set; int spell_index; s_chain *start_chain; s_chain *current_chain_link; t_boolean licensed; s_tfs *lexical_tfs; s_spell_instance *spell; word = word_tree->lex; word_length = word_tree->lex_length + stem_length; if ((letter = word - max_left_context_length) < concatenation) fatal_error("%s: before word=%d < max left context = %d", "reached internal limits", word - concatenation, max_left_context_length); while (letter < word) *letter++ = NUL_LETTER; /* should not match any left context */ if ((letter = word + word_length + max_rest_length - 1) >= concatenation + CONCAT_SIZE) fatal_error("%s: after word=%d < max right context = %d", "reached internal limits", word + word_length - concatenation, max_rest_length - 1); while (letter >= word + word_length) *letter-- = NUL_LETTER; /* should not match any right context */ if (spell_trace_level >= TRACE_LEXICAL_MATCH) { print_log("lexical applicability map for word: \""); print_string_l(logfile, word, word_length); print_log("\"\n"); } for (word_index = 0; word_index < word_length; word_index++) { letter = word + word_index - max_left_context_length; spell_set = APPLICABILITY_MAP(word_index); ASSIGN_SET(spell_set, MATCH_POS(0, (int) *letter++)); /* TODO: stop when spell_set is empty */ for (pos_index = 1; pos_index < max_spell_length; pos_index++) AND_SET(spell_set, MATCH_POS(pos_index, (int) *letter++)); FOR_EACH_SPELL(spell_set, spell_index) { spell = symbol_set[Spelling].ref[spell_index] ->data->spelling.instance; if (spell->constraint != NULL) { lexical_tfs = get_tfs(word_tree, word + word_index + ((spell->concat_pos == NO_CONCAT) ? 0 : spell->concat_pos), spell->concat_pos != NO_CONCAT, stem_length); licensed = FALSE; start_chain = spell->constraint->next; current_chain_link = start_chain; do { /* at least one constraint's tfs has to be less specific than the tfs of the relevant leaf */ licensed = subsume_tfs((s_tfs *) current_chain_link->item, lexical_tfs); current_chain_link = current_chain_link->next; } while (current_chain_link != start_chain && !licensed); if (!licensed) UNMARK_SPELL(spell_set, spell_index); } } if (spell_trace_level >= TRACE_LEXICAL_MATCH) { print_log("%2d ", word_index); if (word[word_index] != NUL_LETTER) print_letter(logfile, word[word_index]); FOR_EACH_SPELL(APPLICABILITY_MAP(word_index), spell_index) { print_log("\t%s ", symbol_set[Spelling].ref[spell_index]->name); } print_log("\n"); } } } static t_boolean match_left_context(lexical_pos, surface_pos, spell_index) int lexical_pos; /* position of beginning of focus on lexical tape */ int surface_pos; /* position of beginning of focus on surface tape */ int spell_index; /* applied spelling rule index */ { s_chain *left_context; s_chain *pattern; t_boolean match; t_letter *surface_letter; t_letter *lexical_letter; t_letter *current_lexical; t_letter *letter; s_pair *pair; if (spell_index < 0) return (TRUE); /* default rule: no context */ left_context = symbol_set[Spelling].ref[spell_index]->data->spelling.instance ->left_context; if (left_context == NULL) return (TRUE); /* empty context */ pattern = left_context; /* start before focus */ surface_letter = surface_word + surface_pos - 1; lexical_letter = lexical_word + lexical_pos - 1; do { pattern = pattern->next; pair = (s_pair *) pattern->item; do { /* find which pair is matching the lexical tape */ current_lexical = lexical_letter; if (pair->pair_flags & LEXICAL_IS_CLASS) match = test_bit((s_bitmap *) pair->lexical, (long) *current_lexical--); else if (pair->lexical == letter_any) match = (*current_lexical-- != NUL_LETTER); else { letter = pair->lexical; match = TRUE; while (*letter != NUL_LETTER && match) match = (*letter++ == *current_lexical--); } if (match) break; else pair = pair->next; } while (pair != NULL); /* end of pair list */ lexical_letter = current_lexical; if (!match) fatal_error("program bug: lexical left context does not match"); /* check surface */ if (pair->pair_flags & SURFACE_IS_CLASS) match = test_bit((s_bitmap *) pair->surface, (long) *surface_letter--); else if (pair->surface == letter_any) match = (*surface_letter-- != NUL_LETTER); else { letter = pair->surface; while (*letter != NUL_LETTER && match) match = (*letter++ == *surface_letter--); } } while (match && pattern != left_context); return (match); } static t_boolean match_right_context(lexical_pos, surface_pos, spell_index) int lexical_pos; /* position of end of focus on lexical tape */ int surface_pos; /* position of end of focus on surface tape */ int spell_index; /* applied spelling rule index */ { s_chain *right_context; s_chain *pattern; t_boolean match; t_letter *surface_letter; t_letter *lexical_letter; t_letter *current_lexical; s_pair *pair; t_letter *letter; if (spell_index < 0) return (TRUE); /* default rule: no context */ right_context = symbol_set[Spelling].ref[spell_index]->data->spelling.instance ->right_context; if (right_context == NULL) return (TRUE); /* empty context */ pattern = right_context; surface_letter = surface_word + surface_pos; lexical_letter = lexical_word + lexical_pos; do { pattern = pattern->next; pair = (s_pair *) pattern->item; current_lexical = lexical_letter; do { /* find which pair is matching the lexical tape */ current_lexical = lexical_letter; if (pair->pair_flags & LEXICAL_IS_CLASS) match = test_bit((s_bitmap *) pair->lexical, (long) *current_lexical++); else if (pair->lexical == letter_any) match = (*current_lexical++ != NUL_LETTER); else { letter = pair->lexical; match = TRUE; while (*letter != NUL_LETTER && match) match = (*letter++ == *current_lexical++); } if (match) break; else pair = pair->next; } while (pair != NULL); /* end of pair list */ lexical_letter = current_lexical; if (!match) fatal_error("program bug: lexical right context does not match"); /* check surface */ if (pair->pair_flags & SURFACE_IS_CLASS) match = test_bit((s_bitmap *) pair->surface, (long) *surface_letter++); else if (pair->surface == letter_any) match = (*surface_letter++ != NUL_LETTER); else { letter = pair->surface; while (*letter != NUL_LETTER && match) match = (*letter++ == *surface_letter++); } } while (match && pattern != right_context); return (match); } static t_boolean match_focus(lexical_pos, surface_pos, spell_index, lexical_focus_end, surface_focus_end) int lexical_pos; /* position of beginning of focus on lexical tape */ int surface_pos; /* position of beginning of focus on surface tape */ int spell_index; /* applied spelling rule index */ int lexical_focus_end; /* position of end of focus on lexical tape */ int surface_focus_end; /* position of end of focus on surface tape */ { s_chain *focus; s_chain *pattern; t_boolean match; t_letter *surface_letter; t_letter *lexical_letter; t_letter *current_lexical; t_letter *letter; s_pair *pair; if (spell_index < 0) fatal_error("program_bug: trying to match a default rule's focus"); focus = symbol_set[Spelling].ref[spell_index]->data->spelling.instance ->focus; if (focus == NULL) { /* TODO: empty focus. Allowed? */ return ((lexical_pos == lexical_focus_end) && (surface_pos == surface_focus_end)); } pattern = focus; surface_letter = surface_word + surface_pos; lexical_letter = lexical_word + lexical_pos; do { pattern = pattern->next; pair = (s_pair *) pattern->item; do { /* find which pair is matching the lexical tape */ current_lexical = lexical_letter; if ((pair->pair_flags & LEXICAL_IS_CLASS) || (pair->lexical == letter_any)) fatal_error("program bug: non concrete focus"); letter = pair->lexical; match = TRUE; while (*letter != NUL_LETTER && match) match = (*letter++ == *current_lexical++); if (match) break; else pair = pair->next; } while (pair != NULL); /* end of pair list */ lexical_letter = current_lexical; if (!match) fatal_error("program bug: lexical focus does not match"); /* check surface */ if ((pair->pair_flags & SURFACE_IS_CLASS) || (pair->surface == letter_any)) fatal_error("program bug: non concrete focus"); letter = pair->surface; while (*letter != NUL_LETTER && match) match = (*letter++ == *surface_letter++); } while (match && pattern != focus); if (match && lexical_focus_end != lexical_letter - lexical_word) fatal_error("program bug: lexical focus length does not match"); return (match && (surface_focus_end == (surface_letter - surface_word))); } /* concretise surface part of the focus. may fail if spell_index corresponds to lexical symbol without a surface counterpart. */ static t_boolean copy_focus(lexical_pos, surface_pos, spell_index, new_lexical_pos, new_surface_pos) int lexical_pos; /* position of beginning of focus on lexical tape */ int surface_pos; /* position of beginning of focus on surface tape */ int *spell_index; /* applied spelling rule index */ int *new_lexical_pos; /* position of end of focus on lexical tape */ int *new_surface_pos; /* position of end of focus on surface tape */ { s_chain *focus; s_chain *pattern; t_boolean match; t_letter *surface_letter; t_letter *lexical_letter; t_letter *current_lexical; t_letter *letter; s_pair *pair; surface_letter = surface_word + surface_pos; lexical_letter = lexical_word + lexical_pos; if (*spell_index < 0) { /* default rule */ *spell_index = -*lexical_letter; /* just for remembering */ if ((*lexical_letter == *morpheme_boundary) || (*lexical_letter == *word_boundary)) lexical_letter++; /* corresponds to empty surface */ else if (symbol_set[Pair].ref[*lexical_letter]->kind != Pair_Letter) return (FALSE); else { if (surface_letter >= surface_tape + CONCAT_SIZE - 1) fatal_error("reached internal limit:%s %d symbols", "surface word is longer than ", CONCAT_SIZE - 2); /* - initial and final NUL */ *surface_letter++ = *lexical_letter++; } } else { focus = symbol_set[Spelling].ref[*spell_index]->data->spelling.instance ->focus; if (focus != NULL) { /* TODO: should an empty focus be allowed? */ pattern = focus; do { pattern = pattern->next; pair = (s_pair *) pattern->item; do { /* find which pair is matching the lexical tape */ current_lexical = lexical_letter; if ((pair->pair_flags & LEXICAL_IS_CLASS) || (pair->lexical == letter_any)) fatal_error("program bug: non concrete focus"); letter = pair->lexical; match = TRUE; while (*letter != NUL_LETTER && match) match = (*letter++ == *current_lexical++); if (match) break; else pair = pair->next; } while (pair != NULL); /* end of pair list */ lexical_letter = current_lexical; if (!match) fatal_error("program bug: lexical focus does not match"); /* copy to surface */ if ((pair->pair_flags & SURFACE_IS_CLASS) || (pair->surface == letter_any)) fatal_error("program bug: non concrete focus"); letter = pair->surface; while (*letter != NUL_LETTER) { if (surface_letter >= surface_tape + CONCAT_SIZE - 1) fatal_error("reached internal limit:%s %d symbols", "surface word is longer than ", CONCAT_SIZE - 2); /* - start and end NUL */ *surface_letter++ = *letter++; } } while (pattern != focus); } } *new_lexical_pos = lexical_letter - lexical_word; *new_surface_pos = surface_letter - surface_word; return (TRUE); } static void handle_result(surface_end) int surface_end; { valid_surface++; if (spell_trace_level >= TRACE_VALID_SURFACE) { print_log("\""); print_string(logfile, surface_word); print_log("\" = \""); print_string(logfile, current_base_lex); print_log("\" "); print_tfs(current_tfs); } if ((db_operation & Lookup) && (db_operation & (Create | Update))) { if (current_tfs_index < 0) /* if we don't know if it is already stored */ current_tfs_index = (t_card) add_tfs(current_tfs); db_store_form(surface_word, (int) surface_end, current_base_lex, (int) current_tfs_index); } } static void print_partition(lexical_pos, surface_pos, lexical_focus_end, surface_focus_end) int lexical_pos; int surface_pos; int lexical_focus_end; int surface_focus_end; { print_log("%2d ", lexical_pos); print_string_l(logfile, surface_word, surface_pos); print_log("|"); print_string_l(logfile, surface_word + surface_pos, surface_focus_end - surface_pos); print_log("|"); print_string(logfile, surface_word + surface_focus_end); print_log(" / "); print_string_l(logfile, lexical_word, lexical_pos); print_log("|"); print_string_l(logfile, lexical_word + lexical_pos, lexical_focus_end - lexical_pos); print_log("|"); print_string(logfile, lexical_word + lexical_focus_end); } /* this the core of the spelling mechanism */ static void spell(pos_stack_top) int pos_stack_top; { int spell_index; /* applied spelling rule index */ int block_index; /* obligatory (blocking) rule index */ t_boolean match; /* true if surface tape is valid */ int lexical_pos; /* position of beginning of focus on lexical tape */ int surface_pos; /* position of beginning of focus on surface tape */ int pos_stack_index; /* cursor on the positions stack */ int lexical_focus_end; int surface_focus_end; int i; /* see guys! I can write short identifiers !! :-) */ WORD_TYPE *spell_set; s_spell_instance *blocker; t_boolean match_right; t_boolean match_left; if (lexical_word[pos_stack[pos_stack_top].lexical_pos] == NUL_LETTER) { surface_word[pos_stack[pos_stack_top].surface_pos] = NUL_LETTER; if (spell_trace_level > TRACE_LEFT_MATCH) { print_log("checking validity of surface \""); print_string(logfile, surface_word); print_log("\"\n"); } /* end of lexical_tape */ match = TRUE; pos_stack_index = 0; /* foreach position on the stack */ for (; match && pos_stack_index < pos_stack_top; pos_stack_index++) { /* check if their right context matches */ lexical_pos = pos_stack[pos_stack_index].lexical_pos; surface_pos = pos_stack[pos_stack_index].surface_pos; spell_index = pos_stack[pos_stack_index].spell_index; lexical_focus_end = pos_stack[pos_stack_index + 1].lexical_pos; surface_focus_end = pos_stack[pos_stack_index + 1].surface_pos; match = match_right_context(lexical_focus_end, surface_focus_end, spell_index); if (match) { if (spell_trace_level >= TRACE_NON_BLOCKING && spell_index >= 0) { print_partition(lexical_pos, surface_pos, lexical_focus_end, surface_focus_end); print_log("\t%s ", SPELL_NAME(spell_index)); print_log("surface right context matches\n"); } spell_set = APPLICABILITY_MAP(lexical_pos); /* for each obligatory rule check if they don't block */ FOR_EACH_SPELL(spell_set, block_index) { blocker = symbol_set[Spelling].ref[block_index] ->data->spelling.instance; if (block_index != spell_index && COERCE(blocker)) { lexical_focus_end = lexical_pos + blocker->focus_length; /* find the corresponding surface partitions */ /* include zero interval */ for (i = pos_stack_index; i <= pos_stack_top && (lexical_focus_end >= pos_stack[i].lexical_pos) && match; i++) if (lexical_focus_end == pos_stack[i].lexical_pos) { surface_focus_end = pos_stack[i].surface_pos; match_right = FALSE; match_left = FALSE; match = !(!match_focus(lexical_pos, surface_pos, block_index, lexical_focus_end, surface_focus_end) && (match_left = match_left_context(lexical_pos, surface_pos, block_index)) && (match_right = match_right_context( lexical_focus_end, surface_focus_end, block_index))); if ((!match && (spell_trace_level >= TRACE_BLOCKING)) || (spell_trace_level >= TRACE_NON_BLOCKING)) { print_partition(lexical_pos, surface_pos, lexical_focus_end, surface_focus_end); print_log("\t%s ", SPELL_NAME(block_index)); if (match && match_left && match_right) print_log("licenses\n"); else if (match) print_log("doesn't block\n"); else print_log("blocks\n"); } } if (!match) { break; /* FOR_EACH_SPELL */ } } } } else if (spell_trace_level >= TRACE_BLOCKING) { print_partition(lexical_pos, surface_pos, lexical_focus_end, surface_focus_end); print_log("\t%s ", SPELL_NAME(spell_index)); print_log("surface right context mismatch\n"); } } if (match) handle_result(pos_stack[pos_stack_top].surface_pos); } else { /* try all applicable rules */ lexical_pos = pos_stack[pos_stack_top].lexical_pos; surface_pos = pos_stack[pos_stack_top].surface_pos; spell_set = APPLICABILITY_MAP(lexical_pos); FOR_EACH_SPELL(spell_set, spell_index) { /* check left context */ if (RESTRICT(symbol_set[Spelling].ref[spell_index] ->data->spelling.instance) && match_left_context(lexical_pos, surface_pos, spell_index)) { /* put rule and new positions on stack */ if (pos_stack_top >= (int) POS_STACK_SIZE - 1) fatal_error("reached internal limit:%s%d", "max spell stack=", POS_STACK_SIZE); (void) copy_focus(lexical_pos, surface_pos, &spell_index, &pos_stack[pos_stack_top + 1].lexical_pos, &pos_stack[pos_stack_top + 1].surface_pos); pos_stack[pos_stack_top].spell_index = spell_index; /* recurse to write the rest of the surface tape */ if (spell_trace_level >= TRACE_LEFT_MATCH) { surface_word[pos_stack[pos_stack_top + 1].surface_pos] = NUL_LETTER; print_partition(lexical_pos, surface_pos, pos_stack[pos_stack_top + 1].lexical_pos, pos_stack[pos_stack_top + 1].surface_pos); print_log("\t%s ", SPELL_NAME(spell_index)); print_log("surface left context matches\n"); } spell(pos_stack_top + 1); } } /* apply default rule */ spell_index = -1; /* indicate a default rule */ if (copy_focus(lexical_pos, surface_pos, &spell_index, &pos_stack[pos_stack_top + 1].lexical_pos, &pos_stack[pos_stack_top + 1].surface_pos)) { /* recurse to write the rest of the surface tape */ pos_stack[pos_stack_top].spell_index = spell_index; if (spell_trace_level >= TRACE_LEFT_MATCH) { surface_word[pos_stack[pos_stack_top + 1].surface_pos] = NUL_LETTER; print_partition(lexical_pos, surface_pos, pos_stack[pos_stack_top + 1].lexical_pos, pos_stack[pos_stack_top + 1].surface_pos); print_log("\tdefault\n"); } spell(pos_stack_top + 1); } } } void do_spell(lex, base_lex, tfs, tfs_index) t_letter *lex; t_letter *base_lex; s_tfs *tfs; t_card *tfs_index; /* in & out */ { /* pass base_lex and tfs as external arguments to handle_result */ current_base_lex = base_lex; current_tfs = tfs; current_tfs_index = *tfs_index; surface_tape[0] = NUL_LETTER; /* prevent any context to match */ lexical_word = lex; surface_word = surface_tape + 1; pos_stack[0].lexical_pos = 0; pos_stack[0].surface_pos = 0; if (spell_trace_level >= TRACE_LEFT_MATCH) { print_log("constructing surface string:\n"); } valid_surface = 0; spell(0); *tfs_index = current_tfs_index; if (valid_surface < 1 && spell_trace_level >= TRACE_VALID_SURFACE) { print_log("warning: no valid surface form for \""); print_string(logfile, lexical_word); print_log("\"\n"); } } mmorph-2.3.4.2.orig/spell.h0100644000175000001440000000322606045657162014453 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef spell_h #define spell_h #define LETTER_MAX ((t_letter) ((1L << BITS(t_letter)) -1)) #define LETTER_ANY LETTER_MAX #define LETTER_MAP_SIZE (1L << BITS(char)) #define NUL_LETTER ((t_letter) 0) #define SURFACE_FLAG (1L) #define LEXICAL_FLAG (1L << 1) /* if all lexical focus width are 1, then the stack size is equal to the lexical word length; so a good rule of the thumb is: */ #define POS_STACK_SIZE CONCAT_SIZE typedef struct { int lexical_pos; int surface_pos; int spell_index; } s_pos_stack; extern t_letter *surface_letter_map; extern t_letter *lexical_letter_map; extern unsigned char *letter_to_char_map; extern t_letter letter_any[]; extern t_letter empty_string[]; extern t_letter *morpheme_boundary; extern t_letter *word_boundary; extern s_pair *morpheme_boundary_pair; extern s_pair *word_boundary_pair; extern t_letter first_lexical_letter; extern t_letter *current_letter_map; extern e_symbol_kind current_letter_kind; extern int alphabet_size; extern int lexical_alphabet_size; extern t_card max_spell_length; extern t_card max_left_context_length; extern t_card max_rest_length; extern void add_pair(); extern void add_explicit_pair(); extern t_boolean map_letter(); extern t_letter *find_letter(); extern s_pair *new_pair(); extern int lexical_width(); extern void fill_applicability_map(); extern void prepare_spell(); extern void do_spell(); extern void is_pair_concrete(); #endif /* spell_h */ mmorph-2.3.4.2.orig/symbols.c0100644000175000001440000005151406267674636015035 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* procedures to handle symbol tables there are Types with associated Attributes there are Attributes with associated Values there are rules with associated rule description */ #include #include "user.h" /* declarations to shutup "gcc -traditional -Wall", and lint on SunOS 4.1.3 */ #ifdef UNDEF #ifndef STDC_HEADERS extern char *tsearch(); extern char *tfind(); extern void twalk(); #endif #endif s_symbol_set symbol_set[SYM_TABLES_NUMBER]; /* independant symbols */ /* symbol kind names (should follow the order of e_symbol_kind enumeration) */ t_str symbol_kind_str[_last_symbol_kind + 1] = { "attribute", "pair", "rule", "spelling", "type", "value", "variable", "surface symbol", "lexical symbol", "lexical or surface symbol", "surface symbol class", "lexical symbol class", "lexical or surface symbol class", "lexical entry", "alphabet", "" }; /* rule kind names (should follow the order of e_rule_kind enumeration) */ static t_str rule_kind_str[_last_rule_kind + 1] = { "goal", "lexical", "unary", "binary", "prefix", "suffix", /* "compound", "composite_prefix", "composite_suffix", */ "" }; void init_symbol_set(symbol_set, symbol_kind) s_symbol_set *symbol_set; e_symbol_kind symbol_kind; { symbol_set->kind = symbol_kind; symbol_set->card = 0; symbol_set->table = NULL; symbol_set->ref = NULL; } void init_symbol() { e_symbol_kind kind; for (kind = FIRST_SYM_KIND; kind < SYM_TABLES_NUMBER; kind++) { init_symbol_set(&symbol_set[kind], kind); } } static int #if defined(__STDC__) sym_compare(const T_PTR sym1, const T_PTR sym2) #else sym_compare(sym1, sym2) T_PTR sym1; T_PTR sym2; #endif { return (strcmp(((s_symbol *) sym1)->name, ((s_symbol *) sym2)->name)); } #ifdef COMMENTED_OUT /* TODO recurse through all pointers */ void free_symbol(sym) s_symbol *sym; { if (sym != NULL) { if (sym->data != NULL) MY_FREE(sym->data); if (sym->name != NULL) MY_FREE(sym->name); MY_FREE(sym); } } #endif /* COMMENTED_OUT */ int reference_position(reference, item) t_ptr *reference; t_ptr item; { t_ptr *ref; /* example: search for this attribute in the list associated to type */ /* TODO: sort attributes first */ ref = reference; while ((*ref != NULL) && (*ref != item)) ref++; if (*ref == NULL) return (-1); /* not found */ else return (ref - reference); /* return position */ } t_ptr *current_ref = NULL; /* argument passed to action() */ /* one kind of action */ void ref_is_item(item) t_ptr item; { *current_ref = item; current_ref++; } t_ptr * new_ref(card, fill_reference, source, action) int card; void (*fill_reference) (); t_ptr source; void (*action) (); { t_ptr *ref; MY_CALLOC(ref, card + 1, t_ptr); ref[card] = (t_ptr) NULL; /* sentinel */ if (card > 0) { current_ref = ref; fill_reference(source, action); } return (ref); } /* extra argument passed to assign_reference */ static s_symbol_set *current_set; /* Assign the reference pointer */ /*ARGSUSED2*/ static void #if defined(__STDC__) assign_reference(const T_PTR sym, VISIT order, int level) #else assign_reference(sym, order, level) T_PTR sym; VISIT order; int level; #endif { if (order == postorder || order == leaf) if (sym != NULL) if (*((s_symbol **) sym) != NULL) { current_set->ref[(*((s_symbol **) sym))->ordinal] = *((s_symbol **) sym); } } void make_symbol_reference(set) s_symbol_set *set; { MY_CALLOC(set->ref, set->card + 1, s_symbol *); set->ref[set->card] = NULL; current_set = set; twalk((T_PTR) set->table, assign_reference); } void link_attribute(value_set, attribute_symbol) s_symbol_set *value_set; s_symbol *attribute_symbol; { t_index n; for (n = 0; n < value_set->card; n++) { value_set->ref[n]->data->value.attribute_link = attribute_symbol; } } s_tfs * new_tfs(type) t_index type; { s_tfs *tfs; t_index type_card; MY_MALLOC(tfs, s_tfs); tfs->type = type; type_card = symbol_set[Type].ref[type]->data->type.card; MY_CALLOC(tfs->att_list, type_card + 1, t_value); tfs->att_list[type_card] = NO_BITS; /* sentinel */ tfs->var_map = NULL; return (tfs); } static void free_var_map(var_map) s_var_map **var_map; { s_var_map **v; if (var_map != NULL) { for (v = var_map; *v != NULL; v++) MY_FREE(*v); MY_FREE(var_map); } } void free_tfs(tfs) s_tfs *tfs; { if (tfs != NULL) { MY_FREE(tfs->att_list); MY_FREE(tfs); /* use real_free if tfs->var_map needs to be freed */ } } #ifdef COMMENTED_OUT void real_free_tfs(tfs) s_tfs *tfs; { if (tfs != NULL) { MY_FREE(tfs->att_list); MY_FREE(tfs); MY_FREE(tfs->var_map); } } #endif /* COMMENTED_OUT */ void fill_tfs_with_variables(tfs) s_tfs *tfs; { s_type *type; s_symbol **attribute_ref; t_value *att_list; t_value *last_att; type = &(symbol_set[Type].ref[tfs->type]->data->type); attribute_ref = type->attribute_ref; att_list = tfs->att_list; last_att = att_list + type->card; /* fill the type feature structure with full value sets */ while (att_list < last_att) *att_list++ = FULL_SET((*attribute_ref++)->data->attribute.value_set.card); } static void fill_var_index(variable_ref, tfs, member) s_symbol **variable_ref; s_tfs *tfs; int member; { s_var_map **var_map; if (tfs != NULL) if (tfs->var_map != NULL) for (var_map = tfs->var_map; *var_map != NULL; var_map++) variable_ref[(*var_map)->foreign_index]->data->variable.tfs_index[member] = (*var_map)->local_index; } static void direct_var_map(variable_ref, tfs, member) s_symbol **variable_ref; s_tfs *tfs; int member; { s_var_map **var_map; if (tfs->var_map != NULL) for (var_map = tfs->var_map; *var_map != NULL; var_map++) (*var_map)->foreign_index = variable_ref[(*var_map)->foreign_index] ->data->variable.tfs_index[member]; } static void check_var_map(variable_ref, rule) s_symbol **variable_ref; s_rule_instance *rule; { s_symbol **ref; t_index *tfs_index; t_value *att_list[3]; t_boolean lonely_var; t_boolean fully_specified; int i; int j; int loop_bound; t_value value; att_list[0] = rule->lhs->att_list; att_list[1] = rule->first->att_list; if (rule->rule_kind == Binary) { att_list[2] = rule->second->att_list; loop_bound = 3; } else /* Prefix and Suffix rules don't have variables in second */ loop_bound = 2; /* 1 would not check lonely var in first */ for (ref = variable_ref; *ref != NULL; ref++) { tfs_index = (*ref)->data->variable.tfs_index; lonely_var = TRUE; fully_specified = FALSE; /* unify circularly the values associated to variables */ for (i = 0, j = 1; i < loop_bound; i++, j = (j + 1) % loop_bound) { if (tfs_index[i] != NO_INDEX && tfs_index[j] != NO_INDEX) { lonely_var = FALSE; value = (att_list[i][tfs_index[i]] &= att_list[j][tfs_index[j]]); if (value == NO_BITS) fatal_error("variable $%s in rule \"%s\" %s", (*ref)->name, rule->rule_link->name, "is inconsistent with itself"); att_list[j][tfs_index[j]] = value; /* identify */ /* TODO: if the variable is assigned remove it from the var_map. Currently dealt with by a user warning. */ if (has_unique_bit(value)) fully_specified = TRUE; } } if (lonely_var) fatal_error("variable $%s in rule \"%s\" %s", (*ref)->name, rule->rule_link->name, "has no correspondant"); if (fully_specified) print_warning("variable $%s in rule \"%s\" %s", (*ref)->name, rule->rule_link->name, "is already fully specified"); } } void adjust_var_map(variable_ref, rule) s_symbol **variable_ref; s_rule_instance *rule; { fill_var_index(variable_ref, rule->lhs, 0); /* TODO check necessity */ fill_var_index(variable_ref, rule->first, 1); /* Prefix and Suffix rules are handled like Unary rules */ if (rule->rule_kind == Binary) fill_var_index(variable_ref, rule->second, 2); check_var_map(variable_ref, rule); if (rule->rule_kind != Binary) { /* only one var map is needed. (First->var_map...foreign by convention should point to second->att_list) */ direct_var_map(variable_ref, rule->lhs, 1); free_var_map(rule->first->var_map); rule->first->var_map = NULL; } /* binary rules will be taken care of in combine_rule() */ } void ident_var_map(tfs) s_tfs *tfs; { s_var_map *v; int n; t_index type_card; type_card = symbol_set[Type].ref[tfs->type]->data->type.card; MY_CALLOC(v, type_card, s_var_map); MY_CALLOC(tfs->var_map, type_card + 1, s_var_map *); for (n = 0; n < type_card; n++) { v[n].local_index = n; v[n].foreign_index = n; tfs->var_map[n] = &v[n]; } tfs->var_map[type_card] = NULL; /* sentinel */ } /* TODO: merge tfind and tsearch steps to avoid searching twice */ s_symbol ** new_symbol(name, set) t_str name; s_symbol_set *set; { s_symbol sym; s_symbol *new_sym; s_symbol **found_sym; t_letter *letter_string; if (set->table == NULL) found_sym = NULL; else { sym.name = name; found_sym = (s_symbol **) tfind((T_PTR) & sym, (T_PTR *) & (set->table), sym_compare); } if (found_sym != NULL) { switch (set->kind) { case Surface_Letter: /* surface and lexical alphabet share the set with pairs */ if ((*found_sym)->kind == Lexical_Letter) { (*found_sym)->kind = Pair_Letter; (*found_sym)->data->pair.surface = (*found_sym)->data->pair.lexical; break; } /* else Surface_Letter or Pair_Letter: error */ /* FALLTHROUGH */ case Lexical_Letter: /* first one */ /* FALLTHROUGH */ case Pair_Class: /* FALLTHROUGH */ case Attribute: /* FALLTHROUGH */ case Type: /* FALLTHROUGH */ case Rule: /* FALLTHROUGH */ case Pair: /* FALLTHROUGH */ case Spelling: /* FALLTHROUGH */ case Value: /* declared twice */ fatal_error("%s identifier \"%s\" is already defined", symbol_kind_str[set->kind], name); break; case Variable: /* TODO: update map */ break; default: break; } /* 17/01/96 Jordi It's not possible to free now and use it after. No pueden liberar y despues utilizar. MY_FREE(name); */ } else { /* TODO: put most of this into a new_symbol() */ MY_MALLOC(new_sym, s_symbol); new_sym->kind = set->kind; new_sym->name = name; new_sym->ordinal = set->card++; found_sym = (s_symbol **) tsearch((T_PTR) new_sym, (T_PTR *) & (set->table), sym_compare); switch (set->kind) { case Surface_Letter: /* FALLTHROUGH */ case Lexical_Letter: if (new_sym->ordinal >= (t_card) LETTER_MAX) fatal_error("symbol %s: %s (maximum=%d)", new_sym->name, "too many different alphabet symbols", LETTER_MAX - 3); /* NUL, ANY, 2 BOUNDARIES */ MY_MALLOC(new_sym->data, s_pair); MY_STRALLOC(letter_string, 2); letter_string[0] = (t_letter) new_sym->ordinal; letter_string[1] = NUL_LETTER; new_sym->data->pair.pair_flags = BOTH_LETTERS; if (set->kind == Surface_Letter) { new_sym->data->pair.surface = letter_string; new_sym->data->pair.lexical = NULL; new_sym->data->pair.next = NULL; /* list empty */ } else { new_sym->data->pair.surface = NULL; new_sym->data->pair.lexical = letter_string; new_sym->data->pair.next = NULL; /* list empty */ } break; case Pair_Class: MY_MALLOC(new_sym->data, s_class); new_sym->data->class.pair_flags = BOTH_CLASSES; new_sym->data->class.surface = new_bitmap((long) alphabet_size); new_sym->data->class.lexical = NULL; new_sym->data->class.next = NULL; /* list empty */ break; case Pair: MY_MALLOC(new_sym->data, s_pair); new_sym->data->pair.surface = NULL; new_sym->data->pair.lexical = NULL; new_sym->data->pair.next = NULL; /* list empty */ break; case Attribute: MY_MALLOC(new_sym->data, s_attribute); init_symbol_set(&(new_sym->data->attribute.value_set), Value); break; case Rule: MY_MALLOC(new_sym->data, s_rule); init_symbol_set(&(new_sym->data->rule.variable_set), Variable); MY_MALLOC(new_sym->data->rule.instance, s_rule_instance); new_sym->data->rule.instance->lhs = NULL; new_sym->data->rule.instance->first = NULL; new_sym->data->rule.instance->second = NULL; new_sym->data->rule.instance->lex = NULL; new_sym->data->rule.instance->rule_link = new_sym; break; case Spelling: MY_MALLOC(new_sym->data, s_spelling); MY_MALLOC(new_sym->data->spelling.instance, s_spell_instance); /* init_symbol_set(&(new_sym->data->rule.variable_set), Variable); */ break; case Type: MY_MALLOC(new_sym->data, s_type); new_sym->data->type.card = 0; new_sym->data->type.project_card = 0; new_sym->data->type.attribute_ref = NULL; break; case Value: if (new_sym->ordinal >= MAXVAL) { fatal_error("%s (max=%d, at value \"%s\")", "too many values declared for this attribute", MAXVAL, new_sym->name); } MY_MALLOC(new_sym->data, s_value); break; case Variable: MY_MALLOC(new_sym->data, s_variable); new_sym->data->variable.attribute_link = (s_symbol *) NULL; new_sym->data->variable.tfs_index[0] = NO_INDEX; new_sym->data->variable.tfs_index[1] = NO_INDEX; new_sym->data->variable.tfs_index[2] = NO_INDEX; break; default: break; } } return (found_sym); } s_symbol ** find_symbol(name, set) t_str name; s_symbol_set *set; { s_symbol sym; s_symbol **found_sym; sym.name = name; found_sym = (s_symbol **) tfind((T_PTR) & sym, (T_PTR *) & (set->table), sym_compare); if (found_sym == NULL) fatal_error("%s identifier \"%s\" is not defined", symbol_kind_str[set->kind], name); MY_FREE(name); return (found_sym); } static t_boolean print_value(file, attribute, value, record_field_mode) FILE *file; s_symbol *attribute; t_value value; t_boolean record_field_mode; { s_symbol_set *value_set; char *format; int n; t_boolean first; value_set = &attribute->data->attribute.value_set; if (value_set->card > 1 && FULL_SET(value_set->card) == value) return (FALSE); /* don't print variables */ else { print(file, "%s=", attribute->name); first = TRUE; if (record_field_mode) format = "!%s"; else format = "|%s"; for (n = 0; n < value_set->card; n++) if (TEST_BIT(value, n)) { if (first) { print(file, "%s", value_set->ref[n]->name); first = FALSE; } else print(file, format, value_set->ref[n]->name); } return (TRUE); } } void print_tfs1(file, tfs, print_var_map, print_projection, record_field_mode) FILE *file; s_tfs *tfs; t_boolean print_var_map; t_boolean print_projection; t_boolean record_field_mode; { int i; s_symbol *symbol; s_symbol **attribute_ref; t_index type_card; if (tfs != NULL) { symbol = symbol_set[Type].ref[tfs->type]; attribute_ref = symbol->data->type.attribute_ref; if (print_projection) type_card = symbol->data->type.project_card; else type_card = symbol->data->type.card; print(file, "%s[ ", symbol->name); for (i = 0; i < type_card; i++) { if (print_value(file, attribute_ref[i], tfs->att_list[i], record_field_mode)) print(file, " "); } if (record_field_mode) print(file, "]"); else print(file, "]\n"); if (tfs->var_map != NULL && print_var_map) { for (i = 0; tfs->var_map[i] != NULL; i++) print(file, "map att %s = %d\n", attribute_ref[tfs->var_map[i]->local_index]->name, tfs->var_map[i]->foreign_index); } } } void print_tfs(tfs) s_tfs *tfs; { print_tfs1(logfile, tfs, FALSE, FALSE, FALSE); } void print_tfs_proj(tfs) s_tfs *tfs; { print_tfs1(outfile, tfs, FALSE, TRUE, FALSE); } void print_tfs_proj_tbl(tfs) s_tfs *tfs; { print_tfs1(outfile, tfs, FALSE, TRUE, TRUE); } static void print_labeled_tfs(tfs, label) s_tfs *tfs; t_str label; { if (tfs != NULL) { print_log("%s", label); print_tfs1(logfile, tfs, TRUE, FALSE, FALSE); } } static void print_class(class) s_bitmap *class; { long letter_index; print_log("{"); FOR_EACH_BIT(class, letter_index) print_log(" %s", symbol_set[Pair].ref[letter_index]->name); print_log(" }"); } static void print_symbol_string(letter_string) t_letter *letter_string; { if (letter_string == letter_any) print_log("?"); else if (strlen((char *) letter_string) == 1) print_log("%s", symbol_set[Pair].ref[*letter_string]->name); else { /* TODO print angle brackets */ print_log("\""); print_string(logfile, letter_string); print_log("\""); } } static void print_pair(pair) s_pair *pair; { do { print_log(" "); if (pair->pair_flags & SURFACE_IS_CLASS) print_class((s_bitmap *) pair->surface); else print_symbol_string(pair->surface); print_log("/"); if (pair->pair_flags & LEXICAL_IS_CLASS) print_class((s_bitmap *) pair->lexical); else print_symbol_string(pair->lexical); pair = pair->next; } while (pair != NULL); print_log("\n"); } static void print_spell(spell) s_spell_instance *spell; { if (spell->kind == Optional) print_log("=>\n"); else if (spell->kind == Coerce) print_log("<=\n"); else print_log("<=>\n"); /* TO DO print reverse left context */ map_chain(spell->left_context, print_pair); print_log("-"); map_chain(spell->focus, print_pair); print_log("-"); map_chain(spell->right_context, print_pair); map_chain(spell->constraint, print_tfs); print_log("concatenation point: %d\n", spell->concat_pos); } void print_symbols_by_ref(set) s_symbol_set *set; { t_index n; s_symbol *sym; if (set == NULL) return; for (n = 0; n < set->card; n++) { sym = set->ref[n]; print_log("\n%s %d\t%s\n", symbol_kind_str[sym->kind], sym->ordinal, sym->name); switch (sym->kind) { case Attribute: print_symbols_by_ref(&sym->data->attribute.value_set); break; case Rule: print_log("rule kind %s\n", rule_kind_str[sym->data->rule.instance->rule_kind]); if (sym->data->rule.instance->lex != NULL) { print_log("lex string "); print_string(logfile, sym->data->rule.instance->lex); print_log("\n"); } print_symbols_by_ref(&sym->data->rule.variable_set); print_labeled_tfs(sym->data->rule.instance->lhs, "lhs: "); print_labeled_tfs(sym->data->rule.instance->first, "first: "); print_labeled_tfs(sym->data->rule.instance->second, "second: "); break; case Spelling: print_spell((s_spell_instance *) sym->data->spelling.instance); /* print_symbols_by_ref(&sym->data->spelling.variable_set); */ break; case Type: { s_symbol **psym; for (psym = sym->data->type.attribute_ref; *psym != NULL; psym++) print_log("with attribute\t%s\n", (*psym)->name); } break; case Value: print_log("of attribute\t%s\n", sym->data->value.attribute_link->name); break; case Pair: /* FALLTHROUGH */ case Surface_Letter: /* FALLTHROUGH */ case Lexical_Letter: /* FALLTHROUGH */ case Pair_Letter: /* FALLTHROUGH */ case Surface_Class: /* FALLTHROUGH */ case Lexical_Class: /* FALLTHROUGH */ case Pair_Class: /* FALLTHROUGH */ default: break; } } } /* Print out symbols in alphabetical order */ /*ARGSUSED2*/ static void #if defined(__STDC__) print_sym(const T_PTR symptr, VISIT order, int level) #else print_sym(symptr, order, level) T_PTR symptr; VISIT order; int level; #endif { s_symbol *sym; if (!(order == postorder || order == leaf) || symptr == NULL) return; sym = *((s_symbol **) symptr); if (sym == NULL) return; switch (sym->kind) { case Surface_Class: /* FALLTHROUGH */ case Lexical_Class: /* FALLTHROUGH */ case Pair_Class: if (defined_kind == Pair_Class) { print_log("\n%s %d\t%s\n", symbol_kind_str[sym->kind], sym->ordinal, sym->name); if (sym->kind == Surface_Class) print_class(sym->data->class.surface); else print_class(sym->data->class.lexical); print_log("\n"); } break; case Pair: if (defined_kind == Pair) { print_log("\n%s %d\t%s\n", symbol_kind_str[sym->kind], sym->ordinal, sym->name); print_pair((s_pair *) sym->data); } break; default: break; } } /* used to print tables that don't have an associated reference array */ void print_symbol_table(symbol_set) s_symbol_set *symbol_set; { twalk((T_PTR) symbol_set->table, print_sym); } mmorph-2.3.4.2.orig/symbols.h0100644000175000001440000000776406045657166015043 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef symbols_h #define symbols_h #include #define MAXVAL BITS(t_value) #ifndef lint typedef enum { Attribute = 0, #define FIRST_SYM_KIND Attribute Pair, Rule, Spelling, Type, Value, #define SYM_TABLES_NUMBER Value Variable, Surface_Letter, Lexical_Letter, Pair_Letter, Surface_Class, Lexical_Class, Pair_Class, Lexicon, Alphabet, _last_symbol_kind } e_symbol_kind; #else /* use defines to shutup lint */ #define Attribute 0 #define FIRST_SYM_KIND Attribute #define Pair 1 #define Rule 2 #define Spelling 3 #define Type 4 #define Value 5 #define SYM_TABLES_NUMBER Value #define Variable 6 #define Surface_Letter 7 #define Lexical_Letter 8 #define Pair_Letter 9 #define Surface_Class 10 #define Lexical_Class 11 #define Pair_Class 12 #define Lexicon 13 #define Alphabet 14 #define _last_symbol_kind 15 typedef int e_symbol_kind; #endif /* !lint */ #define SURFACE_IS_CLASS (1L) #define LEXICAL_IS_CLASS (1L << 1) #define BOTH_LETTERS (0L) #define BOTH_CLASSES (SURFACE_IS_CLASS|LEXICAL_IS_CLASS) typedef struct symbol_s { e_symbol_kind kind; /* kind of the symbol; not strictly necessary */ t_str name; t_card ordinal; union data_u *data; } s_symbol; typedef struct { e_symbol_kind kind; /* kind of the symbol; not strictly necessary */ t_card card; /* cardinality of the symbol set */ s_symbol *table; /* associated symbol table */ s_symbol **ref; /* associated array of all symbols */ } s_symbol_set; typedef struct { s_symbol_set value_set; } s_attribute; typedef struct pair_s { t_flag pair_flags; t_letter *surface; t_letter *lexical; struct pair_s *next; } s_pair; /* s_class should be of exactly the same structure as s_pair */ typedef struct class_s { t_flag pair_flags; s_bitmap *surface; s_bitmap *lexical; struct pair_s *next; } s_class; typedef struct { s_symbol_set variable_set; s_rule_instance *instance; } s_rule; typedef struct { s_spell_instance *instance; s_rule *constraint; } s_spelling; typedef struct { t_card card; s_symbol **attribute_ref; /* list of references to attributes */ t_card project_card; /* last attribute to keep in the end */ } s_type; typedef struct { s_symbol *attribute_link; /* backward pointer to the attribute */ } s_value; typedef struct { s_symbol *attribute_link; /* attribute the variable is for */ t_index tfs_index[3]; /* att index in the tfs: lhs, first second */ } s_variable; typedef union data_u { s_attribute attribute; s_pair pair; s_rule rule; s_spelling spelling; s_type type; s_value value; s_variable variable; s_class class; } u_data; extern s_symbol_set symbol_set[SYM_TABLES_NUMBER]; /* independant symbols */ extern t_str symbol_kind_str[]; extern e_symbol_kind defined_kind; extern s_symbol **new_symbol( /* t_str name, s_symbol **table */ ); extern s_symbol **find_symbol( /* t_str name, s_symbol **table */ ); extern void init_symbol(); extern void init_symbol_set(); extern void print_symbols_by_ref(); extern void print_symbol_table(); extern void make_symbol_reference(); extern void ref_is_item(); extern t_ptr *new_ref(); extern void link_attribute(); extern void add_pair(); extern s_tfs *new_tfs(); extern void fill_tfs_with_variables(); extern void ident_var_map(); extern void free_tfs(); extern void print_tfs1(); extern void print_tfs(); extern void print_tfs_proj(); extern void print_tfs_proj_tbl(); extern int reference_position(); extern void adjust_var_map(); #endif /* symbols_h */ mmorph-2.3.4.2.orig/tbl.c0100644000175000001440000001554206045657167014121 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* tbl.c procedure to lookup words in the database input and output are in Multext record/field format should be changed to use an API */ #include #include "user.h" /* max number of relevant fields in a line */ #define MAX_FIELD 4 #define MAXSTRLNG 128 #define LINE_CHUNK 128 static char *line = NULL; static int max_line_size; #define CLASS_CHUNK 10 static char **class_table = NULL; static int max_class_table_size; static int class_table_size; /* save a slot for end of last field */ static char *field[MAX_FIELD + 1]; static int field_card; static t_boolean begin_sentence; static void print_tbl(field_no) int field_no; { int i; int last_field; /* copy the line as is, no lookup, no annotations */ print_out("%s", field[0]); last_field = MAX(field_no, field_card - 1); for (i = 1; i <= last_field; i++) print_out("%c%s", FIELD_SEP, field[i]); print_out("%c", RECORD_SEP); } /** Fonction de comparaison utilisée par qsort et bsearch */ static int #if defined(__STDC__) class_cmp(const T_PTR class1, const T_PTR class2) #else class_cmp(class1, class2) T_PTR class1; T_PTR class2; #endif { return strcmp(*((T_PTR *) class1), *((T_PTR *) class2)); } /* Read a line up to a newline and divide it in MAXFIELD fields separated by TABs. return in segment the form in field form_field with its size in segment_size. */ static t_boolean get_tbl_segment(infile, segment, segment_size) FILE *infile; char **segment; /* output */ int *segment_size; /* output */ { char *s; char *last_s; int c; int field_no; t_boolean irrelevant; /* read a line and extract the word to lookup. fgets is not used because it takes the newline in. */ begin_sentence = FALSE; /* reset sentence boundary flag */ do { s = line; field[0] = line; field_no = 1; last_s = line + max_line_size; while ((c = getc(infile)) != EOF && (c != (int) RECORD_SEP)) { if (c == (int) FIELD_SEP && field_no < MAX_FIELD) { *s++ = NUL_CHAR; field[field_no++] = s; } else *s++ = (char) c; if (s >= last_s) { max_line_size += LINE_CHUNK; MY_REALLOC(line, max_line_size, char); /* line address might have changed */ s = line + max_line_size - LINE_CHUNK; last_s = line + max_line_size; } } *s = NUL_CHAR; /* fill the table, just in case */ field_card = field_no; for (; field_no <= MAX_FIELD; field_no++) field[field_no] = s; /* no lookup occurs if - the form field is empty, - the morph field is not empty and we are not extending nor overwriting, - the class field is not in the class set */ irrelevant = (*field[morph_field] && !(extend_morph_field || overwrite_morph_field)) || !*field[form_field] || (bsearch((T_PTR) (field + class_field), (T_PTR) class_table, (size_t) class_table_size, sizeof(char *), class_cmp) == NULL); if (irrelevant && !(c == EOF && s == line)) { begin_sentence = !strcmp(field[class_field], begin_sentence_class); print_tbl(0); } } while (irrelevant && c != EOF); if (c == EOF && s != line) print_warning("input file does not terminate with a newline"); if (irrelevant) return (FALSE); /* EOF */ else { *segment = field[form_field]; *segment_size = field[form_field + 1] - field[form_field]; return (TRUE); } } /* copy a string, converting uppercase to lowercase. Use the correspondance specified by LC_CTYPE environment variable */ t_boolean fold_case(source, target) unsigned char *source; unsigned char *target; { register unsigned char *s; register unsigned char *t; t_boolean folded; folded = FALSE; for (s = source, t = target; *s;) { if (isupper((int) *s)) { folded = TRUE; *t++ = (unsigned char) tolower((int) *s++); } else *t++ = *s++; } *t = (unsigned char) NUL_CHAR; return (folded); } void lookup_tbl(infile, lookup_classes) FILE *infile; char *lookup_classes; { char *segment; t_letter surface_lex[MAXSTRLNG]; char *p; int segment_size; int i; t_boolean found; t_boolean folded; t_boolean extend; /* separator are comma, backslash, tab and space (and newline). Comma and space should not be there strictly, but are unlikely to appear in a class name */ #define SEPARATORS " |,\\\t\n" if (class_table == NULL) { max_class_table_size = CLASS_CHUNK; MY_CALLOC(class_table, max_class_table_size, char *); } if (line == NULL) { max_line_size = LINE_CHUNK; MY_CALLOC(line, max_line_size, char); } /* parse and store the lookup classes in a table, sorted */ p = strtok(lookup_classes, SEPARATORS); class_table_size = 0; while (p != NULL) { if (class_table_size >= max_class_table_size) { max_class_table_size += CLASS_CHUNK; MY_REALLOC(class_table, max_class_table_size, char *); } class_table[class_table_size++] = p; p = strtok((char *) NULL, SEPARATORS); } if (class_table_size == 0) fatal_error("lookup classes are not correctly specified: \"%s\"", lookup_classes); qsort((T_PTR) class_table, (size_t) class_table_size, sizeof(char *), class_cmp); /* check each line for lookup */ while (get_tbl_segment(infile, &segment, &segment_size)) { if (segment_size >= MAXSTRLNG) { fatal_error("word too long (max %d):\n %s", MAXSTRLNG - 1, segment); } for (i = 0; i < morph_field; i++) print_out("%s%c", field[i], FIELD_SEP); extend = (*field[morph_field] && ! overwrite_morph_field); if (extend) print_out("%s", field[morph_field]); if (fold_case_always) { folded = fold_case((unsigned char *) segment, (unsigned char *) surface_lex); found = map_letter((t_str) surface_lex, surface_lex, Surface_Letter) && db_forms_lookup_tbl(surface_lex, extend, folded); } else { folded = FALSE; found = map_letter(segment, surface_lex, Surface_Letter) && db_forms_lookup_tbl(surface_lex, extend, folded); } if (!fold_case_always && ((begin_sentence && isupper((int) ((unsigned char) *segment))) || (fold_case_fallback && !found))) { folded = fold_case((unsigned char *) segment, (unsigned char *) surface_lex); if (folded) found |= (map_letter((char *) surface_lex, surface_lex, Surface_Letter) && db_forms_lookup_tbl(surface_lex, (extend || found), TRUE)); } if (!found && !extend && mark_unknown) print_out("%s", UNKNOWN_MORPH); for (i++; i < field_card; i++) print_out("%c%s", FIELD_SEP, field[i]); print_out("%c", RECORD_SEP); if (want_flush) flush_out(); } } mmorph-2.3.4.2.orig/tbl.h0100644000175000001440000000116506045657171014115 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef tbl_h #define tbl_h #define NUL_CHAR '\0' #define FIELD_SEP '\t' #define SUBFIELD_SEP '|' #define SUBSUBFIELD_SEP '\\' #define RECORD_SEP '\n' /* UNKNOWN_MORPH should contain the SUBSUBFIELD_SEP */ #define UNKNOWN_MORPH "??\\??" /* ordinal number of specific fields, numbering from 0 */ #define form_field 2 #define class_field 1 #define morph_field 3 extern void lookup_tbl(); extern t_boolean fold_case(); #endif /* tbl_h */ mmorph-2.3.4.2.orig/tfs.c0100644000175000001440000002215506045657172014126 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* tfs.c handle the storage of typed feature structures (tfs) Dominique Petitpierre, ISSCO, Spring 1995 */ #include "user.h" #include #include #include #define TFS_TABLE_CHUNK 100 s_tfs *tfs_table; static s_tfs *tfs_btree; static t_card tfs_table_size; static t_card old_tfs_table_size; static t_card max_tfs_table_size; static FILE *tfs_file; /* General method: During creation or addition, an in memory btree (tsearch) is used for identification of tfs (insertion if not yet encountered). During lookup, only a simple array index is used. */ static s_tfs *tfs_compare_arg; static int #if defined(__STDC__) tfs_compare(const T_PTR tfs_index1, const T_PTR tfs_index2) #else tfs_compare(tfs_index1, tfs_index2) T_PTR tfs_index1; T_PTR tfs_index2; #endif { int comparison; t_card project_card; s_tfs *tfs1; s_tfs *tfs2; if (tfs_index1 == (T_PTR) NULL) { tfs1 = tfs_compare_arg; #if defined(DEBUG) && DEBUG > 2 print_log("2=%ld\n", (long) tfs_index2 - 1); #endif tfs2 = &tfs_table[(long) tfs_index2 - 1]; } else if (tfs_index2 == (T_PTR) NULL) { #if defined(DEBUG) && DEBUG > 2 print_log("1=%ld\n", (long) tfs_index1 - 1); #endif tfs1 = &tfs_table[(long) tfs_index1 - 1]; tfs2 = tfs_compare_arg; } else { #if defined(DEBUG) && DEBUG > 2 print_log("1=%ld, 2=%ld\n", (long) tfs_index1 - 1, (long) tfs_index2 - 1); #endif tfs1 = &tfs_table[(long) tfs_index1 - 1]; tfs2 = &tfs_table[(long) tfs_index2 - 1]; } comparison = tfs1->type - tfs2->type; if (comparison) return (comparison); else { project_card = symbol_set[Type].ref[tfs1->type]->data->type.project_card; comparison = memcmp((T_PTR) tfs1->att_list, (T_PTR) tfs2->att_list, project_card * sizeof(t_value)); return (comparison); } } /* insertion of a tfs if not existing */ /* uses the trick to store an index in tfs_table in the btree rather than the usual pointer. */ int add_tfs(new_tfs) s_tfs *new_tfs; { long *tfs_index_p; s_tfs *tfs; int project_card; tfs_compare_arg = new_tfs; /* using NULL rather than -1 to avoid sign extension problems */ tfs_index_p = (long *) tsearch((T_PTR) NULL, (T_PTR *) & tfs_btree, tfs_compare); if (*tfs_index_p == (long) NULL) { /* if it did not exist yet */ if (tfs_table_size >= max_tfs_table_size) { max_tfs_table_size += TFS_TABLE_CHUNK; MY_REALLOC(tfs_table, max_tfs_table_size, s_tfs); } /* TODO: avoid the copying */ tfs = tfs_table + tfs_table_size; tfs->type = new_tfs->type; project_card = (int) symbol_set[Type].ref[tfs->type]->data->type.project_card; /* do not add a sentinel because no need to unify */ MY_CALLOC(tfs->att_list, project_card, t_value); (void) memcpy((T_PTR) tfs->att_list, (T_PTR) new_tfs->att_list, project_card * sizeof(t_value)); tfs->var_map = NULL; /* for completeness */ *tfs_index_p = (long) ++tfs_table_size; /* after baiting: switch */ } #if defined(DEBUG) && DEBUG > 2 print_log("r=%ld\n", (int) *tfs_index_p - 1); #endif return ((int) *tfs_index_p - 1); } static bool_t xdr_t_index(xdrs, index) XDR *xdrs; t_index *index; { return (xdr_short(xdrs, (short *) index)); } static bool_t xdr_t_value(xdrs, value) XDR *xdrs; t_value *value; { return (xdr_u_long(xdrs, (unsigned long *) value)); } static bool_t xdr_s_tfs(xdrs, tfs) XDR *xdrs; s_tfs *tfs; { u_int project_card; if (!xdr_t_index(xdrs, &(tfs->type))) return (FALSE); project_card = (u_int) symbol_set[Type].ref[tfs->type]->data->type.project_card; if (xdrs->x_op == XDR_DECODE) { tfs->var_map = NULL; /* always NULL */ MY_CALLOC(tfs->att_list, project_card, t_value); } return (xdr_vector(xdrs, (char *) tfs->att_list, project_card, (u_int) sizeof(t_value), xdr_t_value)); } /* saved_tfs_table creates or reads a "binary" file containing a collating sequence (order) description from or to a tfs_table array. The file should be already opened at calling time, and is not closed. It returns 0 if there was no problem, -1 if some xdr routine failed, 1 if the crc_hash read is not the same. */ static int saved_tfs_table(create, crc_hash) bool_t create; unsigned char *crc_hash; { XDR xdrs; u_int table_size; unsigned char hash[CRC32FILE_HASHLEN]; char creator[sizeof(CREATOR_NAME)]; char version[sizeof(VERSION_STR)]; char *hash_p; char *creator_p; char *version_p; if (create) { /* file should be created, so do encoding */ xdrstdio_create(&xdrs, tfs_file, XDR_ENCODE); table_size = (u_int) tfs_table_size; hash_p = (char *) crc_hash; creator_p = CREATOR_NAME; version_p = VERSION_STR; } else { /* do decoding */ xdrstdio_create(&xdrs, tfs_file, XDR_DECODE); tfs_table = NULL; /* to force automatic memory allocation */ hash_p = (char *) hash; creator_p = (char *) creator; version_p = (char *) version; } /* use xdr opaque instead of xdr_string so that the string length is not the first thing read from the file improving the chances to correctly report a bad signature (rather than corruption). */ if (!(xdr_opaque(&xdrs, creator_p, sizeof(CREATOR_NAME)) && xdr_opaque(&xdrs, version_p, sizeof(VERSION_STR)) && xdr_opaque(&xdrs, hash_p, (u_int) CRC32FILE_HASHLEN))) return (-1); if (!create) { if (strcmp(creator, CREATOR_NAME) || strcmp(version, VERSION_STR)) return (2); /* bad signature */ if (memcmp((T_PTR) crc_hash, (T_PTR) hash, CRC32FILE_HASHLEN)) return (1); /* bad crc */ } if (!xdr_array(&xdrs, (char **) &tfs_table, &table_size, (u_int) T_CARD_MAX, (u_int) sizeof(s_tfs), xdr_s_tfs)) return (-1); if (!create) tfs_table_size = (t_card) table_size; xdr_destroy(&xdrs); /* tfs_file should be closed outside */ return (0); } void open_tfs_file(tfs_file_name, db_operation) char *tfs_file_name; t_db_operation db_operation; { char *open_mode; /* assumed: db_operation & Lookup is true */ if (db_operation & Create) open_mode = "w"; else if (db_operation & Update) open_mode = "r+"; else open_mode = "r"; if ((tfs_file = fopen(tfs_file_name, open_mode)) == NULL) fatal_error("cannot open tfs file \"%s\" (errno=%d=%s)", tfs_file_name, errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); } /* initialisation of tfs table and btree */ void tfs_table_init(db_operation, gram_file_name, tfs_file_name, crc_hash) t_db_operation db_operation; char *gram_file_name; char *tfs_file_name; unsigned char *crc_hash; { long i; int status; long *tfs_index_p; /* assumed: db_operation & Lookup is true */ if (db_operation & Create) { /* table and btree are empty */ tfs_table_size = 0; old_tfs_table_size = 0; max_tfs_table_size = TFS_TABLE_CHUNK; MY_CALLOC(tfs_table, max_tfs_table_size, s_tfs); tfs_btree = NULL; } else { if ((status = saved_tfs_table(FALSE, crc_hash))) if (status < 0) fatal_error("tfs file \"%s\" is corrupted", tfs_file_name); else if (status == 1) /* bad CRC */ fatal_error("database file \"%s\" %s%s\"%s\": %s", tfs_file_name, "does not correspond\n", "to the morphology description in ", gram_file_name, "please recreate it"); else /* bad signature */ fatal_error("%s \"%s\" %s %s %s %s", "database file", tfs_file_name, "was not created by", CREATOR_NAME, "version", VERSION_STR); old_tfs_table_size = tfs_table_size; max_tfs_table_size = tfs_table_size; /* fill tfs btree */ if (db_operation & Update) { tfs_btree = NULL; for (i = 0; i < (long) tfs_table_size; i++) { tfs_compare_arg = tfs_table + i; tfs_index_p = (long *) tsearch((T_PTR) NULL, (T_PTR *) & (tfs_btree), tfs_compare); *tfs_index_p = (long) i + 1; /* after baiting: switch */ } } } } void tfs_table_write(db_operation, tfs_file_name, crc_hash) t_db_operation db_operation; char *tfs_file_name; unsigned char crc_hash[]; { /* TODO: append new part of table, from old_tfs_table_size */ if (db_operation & Update) /* overwrite with the new table */ if (fseek(tfs_file, 0L, 0) == -1) fatal_error("cannot rewind file \"%s\" (errno=%d=%s)", tfs_file_name, errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); if (saved_tfs_table(TRUE, crc_hash) != 0) fatal_error("could not save tfs table in file \"%s\"", tfs_file_name); /* flush and close */ if (fclose(tfs_file) == EOF) fatal_error("cannot close tfs file \"%s\" (errno=%d=%s)", tfs_file_name, errno, (errno < sys_nerr ? sys_errlist[errno] : "?")); } void dump_tfs_table() { int i; for (i = 0; i < tfs_table_size; i++) print_tfs_proj(&tfs_table[i]); if (debug & DEBUG_STAT) print_log("%d tfs\n", tfs_table_size); } mmorph-2.3.4.2.orig/tfs.h0100644000175000001440000000062606045657174014134 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef tfs_h #define tfs_h extern int add_tfs(); extern void open_tfs_file(); extern void tfs_table_init(); extern void tfs_table_write(); extern void dump_tfs_table(); extern s_tfs *tfs_table; #endif /* tfs_h */ mmorph-2.3.4.2.orig/tokenize.l0100644000175000001440000002402006045657176015170 0ustar mvelausers%{ /* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* tokenizer for user syntax Dominique Petitpierre, ISSCO, July 1994 TODO: better handling of strings: a la lex, without necessity of quoting when possible. */ #include "user.h" #include "parse.h" #include "y.tab.h" #define NUL '\0' int yylineno = 1; int linepos = 0; static char buf_str[MAXSTRLNG]; static char *pbuf_str; int augmenting = FALSE; int allow_string_letters = TRUE; /* true until alphabets are declared */ #ifdef yywrap #undef yywrap #endif #define MAX_INCLUDE_DEPTH 10 static FILE *file_stack[MAX_INCLUDE_DEPTH]; static int line_no_stack[MAX_INCLUDE_DEPTH]; char *file_name_stack[MAX_INCLUDE_DEPTH]; short stack_index = -1; static YY_BUFFER_STATE buffer_state_stack[MAX_INCLUDE_DEPTH]; static int lexstr(); void initfile(); #ifdef TEST #define fatal_error \ (void) printf("file=%s,line=%d\n",file_name_stack[stack_index],yylineno);\ (void) printf #endif %} isoalphanum ([a-zA-Z0-9_\241-\377.]) blank ([ \t\240]) sep ([ \t\n\240]) notsep ([^ \t\n\240]) comment (\;.*\n) %x QSTRING INCLUDE ASTRING %% \? { linepos += yyleng; return(ANY);} \| { linepos += yyleng; return(BAR);} "<=>" { linepos += yyleng; return(BIARROW);} \* { linepos += yyleng; return(CONCATBOUNDARY);} \+ { linepos += yyleng; return(MORPHEMEBOUNDARY);} \- { linepos += yyleng; return(CONTEXTBOUNDARY);} \~ { linepos += yyleng; return(WORDBOUNDARY);} \$ { linepos += yyleng; return(DOLLAR);} \= { linepos += yyleng; return(EQUAL);} \< { linepos += yyleng; return(LANGLE);} "<-" { linepos += yyleng; return(LARROW);} "<=" { linepos += yyleng; return(COERCEARROW);} \[ { linepos += yyleng; return(LBRA);} "!=" { linepos += yyleng; return(NOTEQUAL);} \> { linepos += yyleng; return(RANGLE);} "=>" { linepos += yyleng; return(RARROW);} \] { linepos += yyleng; return(RBRA);} \: { linepos += yyleng; return(COLON);} \/ { linepos += yyleng; return(SLASH);} \@{blank}*Alphabets { linepos += yyleng; return(ALPHABETS);} \@{blank}*Attributes { linepos += yyleng; return(ATTRIBUTES);} \@{blank}*Classes { linepos += yyleng; return(CLASSES);} \@{blank}*Grammar { linepos += yyleng; return(GRAMMAR);} \@{blank}*Lexicon { linepos += yyleng; return(LEXICON);} \@{blank}*Pairs { linepos += yyleng; return(PAIRS);} \@{blank}*Spelling { linepos += yyleng; return(SPELLING);} \@{blank}*Types { linepos += yyleng; return(TYPES);} {isoalphanum}+/({sep}*{comment})*{sep}*: { /* declaration identifier name */ linepos += yyleng; return(lexstr(DNAME,yytext)); } \'{notsep}+/{sep}({sep}*{comment})*{sep}*: { /* declaration identifier name */ linepos += yyleng; return(lexstr(DNAME,yytext+1)); } {isoalphanum}+/({sep}*{comment})*{sep}*\[ { /* declaration identifier name */ linepos += yyleng; return(lexstr(TNAME,yytext)); } \'{notsep}+/{sep}({sep}*{comment})*{sep}*\[ { /* declaration identifier name */ linepos += yyleng; return(lexstr(TNAME,yytext+1)); } {isoalphanum}+ { /* identifier name */ linepos += yyleng; return(lexstr(NAME,yytext)); } \'{notsep}+ { /* quoted identifier name */ linepos += yyleng; return(lexstr(NAME,yytext+1)); } \" { /* start string */ linepos += yyleng; pbuf_str=buf_str; if (allow_string_letters || current_letter_map == NULL) /* alphabets not yet declared */ BEGIN(ASTRING); else BEGIN(QSTRING); } \\\n { /* ignore escaped newline */ yylineno++; linepos=0; } \\(0[0-7][0-7]*|.) { /* escape notation */ unsigned int escaped_char; linepos += yyleng; if ((pbuf_str - buf_str) >= (MAXSTRLNG - 1)) { *pbuf_str=NUL; fatal_error("string too long: \"%s\"",buf_str); } switch (yytext[1]) { case 'n': *pbuf_str++='\n'; break; case 't': *pbuf_str++='\t'; break; case '0': if (sscanf(yytext+1, "%o", &escaped_char) != 1 || escaped_char > MAXUCHAR || escaped_char == 0) fatal_error("%s value \"%s\" is not allowed", "error while reading octal code:", yytext); *pbuf_str++ = (unsigned char) escaped_char; break; default: *pbuf_str++=yytext[1]; break; } } \\(0[0-7][0-7]*|.) { /* escape notation */ /* temp storage, because yytext does not like to be changed with \n */ unsigned int escaped_char; linepos += yyleng; if ((pbuf_str - buf_str) >= (MAXSTRLNG - 1)) { fatal_error("string too long"); /* TODO: print the string */ } switch (yytext[1]) { case 'n': escaped_char='\n'; break; case 't': escaped_char='\t'; break; case '0': if (sscanf(yytext+1, "%o", &escaped_char) != 1 || escaped_char > MAXUCHAR || escaped_char == 0) fatal_error("%s value \"%s\" is not allowed", "error while reading octal code:", yytext); break; default: escaped_char=yytext[1]; break; } if ((*pbuf_str++ = current_letter_map[escaped_char]) == 0 ) fatal_error("symbol \"%c\" is not a %s", escaped_char, symbol_kind_str[current_letter_kind]); } \&{isoalphanum}+\; { /* long letter name a la SGML */ linepos += yyleng; fatal_error("Sorry, %s \"%s\"", "cannot declare an alphabet symbol with such a name:", yytext); } \&{isoalphanum}+\; { /* long letter name a la SGML */ t_str letter_name; linepos += yyleng; if ((pbuf_str - buf_str) >= (MAXSTRLNG - 1)) { *pbuf_str=NUL; fatal_error("string too long"); /* TODO: print string */ } MY_STRDUP(letter_name, yytext + 1); /* find_letter will free it */ letter_name[yyleng - 2] = '\0'; *pbuf_str++ = *find_letter(letter_name,current_letter_kind); } \n { fatal_error("newline not allowed in string; use \\n if you mean one"); } \" { linepos += yyleng; *pbuf_str=NUL; BEGIN(INITIAL); return(lexstr(STRING,buf_str)); } \" { linepos += yyleng; *pbuf_str=NUL; BEGIN(INITIAL); return(lexstr(LSTRING,buf_str)); } \"{blank}*/\n { linepos += yyleng; *pbuf_str=NUL; BEGIN(INITIAL); initfile(buf_str); } . { linepos += yyleng; if ((pbuf_str - buf_str) >= (MAXSTRLNG - 1)) { *pbuf_str=NUL; fatal_error("string too long: \"%s\"",buf_str); } *pbuf_str++ = *yytext; } . { linepos += yyleng; if ((pbuf_str - buf_str) >= (MAXSTRLNG - 1)) { fatal_error("string too long"); /* TODO print string */ } if ((*pbuf_str++ = current_letter_map[(unsigned char) *yytext]) == 0 ) fatal_error("symbol \"%c\" is not a %s", *yytext, symbol_kind_str[current_letter_kind]); } {blank} { /* separator blank */ linepos += yyleng; } \n { /* separator newline */ yylineno++; linepos=0; } {comment} { /* comment */ yylineno++; linepos=0; } \#{blank}*include{blank}+\" { linepos += yyleng; pbuf_str=buf_str; BEGIN(INCLUDE); } . { /* error */ linepos += yyleng; fatal_error("unexpected character: '%s'",yytext); } <> { /* if ( ! end_parse) { fatal_error("unexpected end of file"); */ yyterminate(); } %% void initfile(file_name) char *file_name; { char **including; if (stack_index >= MAX_INCLUDE_DEPTH - 1) { fatal_error( "cannot include file \"%s\": too many nested include (maximum %u)", file_name,MAX_INCLUDE_DEPTH); } stack_index++; if (file_name == NULL) { file_stack[stack_index] = stdin; file_name = "standard input"; file_name_stack[stack_index] = file_name; } else if ((file_stack[stack_index] = fopen(file_name,"r")) == NULL) { fatal_error("Cannot open file %s",file_name); } else { MY_STRDUP(file_name_stack[stack_index],file_name); } for (including = file_name_stack; strcmp(file_name,*including) != 0; including++); if (including != &file_name_stack[stack_index]) fatal_error("#include recursion with file \"%s\"",file_name); yyin= file_stack[stack_index]; if (stack_index) { line_no_stack[stack_index-1] = yylineno; buffer_state_stack[stack_index-1] = YY_CURRENT_BUFFER; yy_switch_to_buffer(yy_create_buffer(file_stack[stack_index], YY_BUF_SIZE)); } yylineno = 1; linepos = 0; } /* yywrap is called when an end of file is reached */ int yywrap() { if (augmenting && strcmp(file_name_stack[stack_index], augment_file_name) == 0) { /* end of augment file */ while(stack_index > 0 ) { /* close all including files */ (void) fclose(file_stack[stack_index]); if (file_stack[stack_index] != stdin ) MY_FREE(file_name_stack[stack_index]); yy_delete_buffer(YY_CURRENT_BUFFER); stack_index--; yy_switch_to_buffer( buffer_state_stack[stack_index] ); } } (void) fclose(file_stack[stack_index]); if (file_stack[stack_index] != stdin ) MY_FREE(file_name_stack[stack_index]); stack_index--; if (stack_index < 0) return(1); /* no more files to read from, triggers <> */ else { yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer( buffer_state_stack[stack_index] ); yylineno = line_no_stack[stack_index]; linepos=0; return(0); /* continue in enclosing file */ } } #ifdef TEST main( argc, argv ) int argc; char **argv; { int r; ++argv, --argc; /* skip over program name */ if ( argc > 0 ) initfile(argv[0]); else initfile(NULL); while (r=yylex()) (void) printf("%d\n",r); } #endif static int lexstr(token,string) int token; char *string; { #ifdef TEST (void) printf("%s\n",string); #else if (token == STRING) { MY_STRDUP(yylval.string,string); } else { MY_STRDUP(yylval.letter_string,string); } #endif return(token); } /* other procedures are in file "main.c" */ mmorph-2.3.4.2.orig/tokenstr.sed0100755000175000001440000000036505775622537015544 0ustar mvelausers#!/bin/sed -f 1i\ #define FIRSTTOKEN 257\ static char *token[] = { s/[ ][ ]*/ /g /^# *define /b token b end : token s/^# *define \([^ ][^ ]*\) \([0-9][0-9]*\) *$/\1/ h s/.*/ "&",/p : end $i\ \ ""\ \ }; $g $s/.*/#define LASTTOKEN &/p mmorph-2.3.4.2.orig/unify.c0100644000175000001440000003713106045657200014454 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ /* unify.c handle unification of typed feature structures and rule applications Dominique Petitpierre, ISSCO Summer 1994 */ #include "user.h" static s_bitmap *rule_map; int goal_card; t_index largest_type; t_letter concatenation[CONCAT_SIZE]; t_boolean match_tfs(rule_tfs, lex_tfs) s_tfs *rule_tfs; s_tfs *lex_tfs; { if (rule_tfs->type != lex_tfs->type) return (FALSE); else { register t_value *r; register t_value *l; r = rule_tfs->att_list; l = lex_tfs->att_list; while (*r & *l) { r++; l++; } return (*r == NO_BITS); /* sentinel */ } } t_boolean subsume_tfs(subsuming_tfs, subsumed_tfs) s_tfs *subsuming_tfs; s_tfs *subsumed_tfs; { if (subsuming_tfs->type != subsumed_tfs->type) return (FALSE); else { register t_value *a; register t_value *b; a = subsuming_tfs->att_list; b = subsumed_tfs->att_list; while (*a && ((*a & *b) == *b)) { /* a includes b */ a++; b++; } return (*a == NO_BITS); /* sentinel */ } } static s_tfs * make_tfs(lhs, rule_tfs, lex_tfs) s_tfs *lhs; s_tfs *rule_tfs; s_tfs *lex_tfs; { s_tfs *tfs; tfs = new_tfs(lhs->type); { register t_value *val; register t_value *val_lhs; val = tfs->att_list; val_lhs = lhs->att_list; do { *val++ = *val_lhs++; } while (*val_lhs != NO_BITS); } tfs->var_map = lhs->var_map; /* copy map for percolation time */ if (lhs->var_map != NULL) { register s_var_map **v; for (v = lhs->var_map; *v != NULL; v++) tfs->att_list[(*v)->local_index] = rule_tfs->att_list[(*v)->foreign_index] & lex_tfs->att_list[(*v)->foreign_index]; } return (tfs); } static t_boolean apply_rule(result, rule, lex_rule) s_rule_instance *result; s_rule_instance *rule; s_rule_instance *lex_rule; { if (match_tfs(rule->first, lex_rule->lhs)) { result->lhs = make_tfs(rule->lhs, rule->first, lex_rule->lhs); /* fill in historical information */ result->first = rule->first; result->second = rule->second; result->rule_kind = rule->rule_kind; result->branch = lex_rule; /* result->rule_link=rule->rule_link; */ result->base_lex = lex_rule->base_lex; /* just percolate upwards */ switch (rule->rule_kind) { case Goal: if ((lex_rule->lex - 1) < concatenation) /* TODO: print actual string */ fatal_error("prefix size limit (%d characters) %s", PREFIX_CONCAT_SIZE, "reached when prepending word boundary"); result->lex = lex_rule->lex - 1; *result->lex = *word_boundary; result->lex_length = lex_rule->lex_length + 2; if (result->lex_length + (lex_rule->lex - concatenation) >= (t_card) CONCAT_SIZE) /* TODO: print string */ fatal_error("suffix size limit (%d characters) %s", SUFFIX_CONCAT_SIZE, "reached when appending word boundary"); result->lex[result->lex_length - 1] = *word_boundary; result->lex[result->lex_length] = NUL_LETTER; break; case Unary: result->lex = lex_rule->lex; result->lex_length = lex_rule->lex_length; break; case Prefix: if ((result->lex = lex_rule->lex - rule->lex_length - 1) < concatenation) /* TODO: print actual string */ fatal_error("prefix size limit (%d characters) %s", PREFIX_CONCAT_SIZE, "reached when prepending prefix string"); else { (void) strncpy((char *) result->lex, (char *) rule->lex, rule->lex_length); result->lex[rule->lex_length] = *morpheme_boundary; result->lex_length = lex_rule->lex_length + rule->lex_length + 1; } break; case Suffix: result->lex_length = lex_rule->lex_length + rule->lex_length + 1; if (result->lex_length + (lex_rule->lex - concatenation) >= (t_card) CONCAT_SIZE) /* TODO: print string */ fatal_error("suffix size limit (%d characters) %s", SUFFIX_CONCAT_SIZE, "reached when appending suffix string"); else { (void) strncpy((char *) lex_rule->lex + lex_rule->lex_length + 1, (char *) rule->lex, rule->lex_length); lex_rule->lex[lex_rule->lex_length] = *morpheme_boundary; result->lex = lex_rule->lex; result->lex[result->lex_length] = NUL_LETTER; } break; default: break; } return (TRUE); } else return (FALSE); } static void print_lexical(lex_rule) s_rule_instance *lex_rule; { print_log("\""); print_string_l(logfile, lex_rule->lex, (int) lex_rule->lex_length); print_log("\" = \""); print_string(logfile, lex_rule->base_lex); print_log("\" "); print_tfs(lex_rule->lhs); } static void indent(indent_level) int indent_level; { int i; for (i = 0; i < indent_level; i++) print_log(" "); } static s_tfs * duplicate_tfs(master_tfs) s_tfs *master_tfs; /* master for the result */ { s_tfs *result_tfs; /* result to build */ t_value *val_result; t_value *val; /* copy master template */ result_tfs = new_tfs(master_tfs->type); val_result = result_tfs->att_list; val = master_tfs->att_list; while ((*val_result++ = *val++) != NO_BITS) { } result_tfs->var_map = master_tfs->var_map; return (result_tfs); } static void percolate_foreign(result_tfs, source_tfs) s_tfs *result_tfs; /* result to build, allready allocated */ s_tfs *source_tfs; /* where to take the new values from */ { t_value *val_result; t_value *val; s_var_map **v; /* percolate down according to variable map of source */ if ((v = source_tfs->var_map) != NULL) { val_result = result_tfs->att_list; val = source_tfs->att_list; for (; *v != NULL; v++) val_result[(*v)->foreign_index] = val[(*v)->local_index]; } } static void percolate_local(result_tfs, source_tfs) s_tfs *result_tfs; /* result to build, allready allocated */ s_tfs *source_tfs; /* where to take the new values from */ { t_value *val_result; t_value *val; s_var_map **v; /* percolate down according to variable map of result */ if ((v = result_tfs->var_map) != NULL) { val_result = result_tfs->att_list; val = source_tfs->att_list; for (; *v != NULL; v++) val_result[(*v)->local_index] = val[(*v)->foreign_index]; } } /* according to the position of concatenation, find the tfs of the affix */ s_tfs * get_tfs(lex_rule, concat_point, has_concat_point, stem_length) s_rule_instance *lex_rule; t_letter *concat_point; t_boolean has_concat_point; t_card stem_length; { #define LEFT_SIDE -1 #define NO_SIDE 0 #define RIGHT_SIDE 1 s_rule_instance *node; /* current tree node when traversing down */ s_rule_instance *daughter; /* daughter of node */ t_boolean has_adjacent_right; t_boolean has_adjacent_left; int closest_side; /* which side was last seen: *_SIDE */ s_tfs *adjacent_right; /* last prefix seen */ s_tfs *adjacent_left; /* last suffix seen */ node = lex_rule; daughter = node->branch; if (has_concat_point) { /* find which affix caused the concatenation point */ while (daughter != NULL) { if ((node->rule_kind == Suffix && concat_point == (daughter->lex + daughter->lex_length + stem_length)) || (node->rule_kind == Prefix && concat_point == (daughter->lex - 1))) { return (node->second); /* tfs of affix */ } node = daughter; daughter = node->branch; } /* now reached the bottom of the tree: lexical leaf */ fatal_error("program bug: no matching concatenation point found"); } else { /* find within which affix the focus starts */ closest_side = NO_SIDE; has_adjacent_right = FALSE; has_adjacent_left = FALSE; while (daughter != NULL) { if (node->rule_kind == Suffix) { if (concat_point >= (daughter->lex + daughter->lex_length + stem_length)) if (has_adjacent_right) /* tfs after the suffix */ return (adjacent_right); else return (node->second); else { adjacent_right = node->second; closest_side = RIGHT_SIDE; has_adjacent_right = TRUE; } } else if (node->rule_kind == Prefix) { if (concat_point < daughter->lex) if (has_adjacent_left) return (adjacent_left); /* tfs before the prefix */ else return (node->second); else { adjacent_left = node->second; closest_side = LEFT_SIDE; has_adjacent_left = TRUE; } } /* move down the tree */ node = daughter; daughter = node->branch; } /* now reached the bottom of the tree: lexical leaf */ if (closest_side == RIGHT_SIDE) return (adjacent_right); else if (closest_side == LEFT_SIDE) return (adjacent_left); else { /* closest_side== NO_SIDE : no affix was concateneted */ return (node->lhs); /* lexical's tfs */ } } fatal_error("program bug: no affix found in get_tfs"); /* NOTREACHED */ return (NULL); /* shut up gcc -Wall */ } /* duplicate a whole affix tree, while percolating down the variable values (which cannot be done in apply_rule). */ static s_rule_instance * copy_affix_tree(master_tree, parent_first) s_rule_instance *master_tree; s_tfs *parent_first; { s_rule_instance *result_tree; s_tfs *first; MY_MALLOC(result_tree, s_rule_instance); result_tree->rule_kind = master_tree->rule_kind; result_tree->rule_link = master_tree->rule_link; result_tree->lex_length = master_tree->lex_length; result_tree->lex = master_tree->lex; /* identify the lhs to the first of the parent */ result_tree->lhs = duplicate_tfs(parent_first); /* restore the correct var_map incorrectly set in duplicate_tfs */ result_tree->lhs->var_map = master_tree->lhs->var_map; if (master_tree->branch == NULL) { /* reached lexical leaf */ result_tree->branch = NULL; result_tree->first = NULL; result_tree->second = NULL; } else { first = duplicate_tfs(master_tree->first); result_tree->first = first; percolate_foreign(first, result_tree->lhs); if (master_tree->second == NULL) /* goal, unary or lexical rule */ result_tree->second = NULL; else { /* (combined) prefix or suffix rule */ result_tree->second = duplicate_tfs(master_tree->second); percolate_foreign(result_tree->second, first); percolate_local(result_tree->second, result_tree->lhs); } result_tree->branch = copy_affix_tree(master_tree->branch, first); } return (result_tree); } static s_affix_tree * new_affix_tree(master_tree) s_rule_instance *master_tree; { s_affix_tree *affix_tree; MY_MALLOC(affix_tree, s_affix_tree); /* TODO no need to copy the top node: top->lhs == top->first */ affix_tree->tree = copy_affix_tree(master_tree, master_tree->lhs); affix_tree->prefix_length = concatenation + PREFIX_CONCAT_SIZE - master_tree->lex; affix_tree->suffix_length = master_tree->lex_length - affix_tree->prefix_length; MY_STRDUP(affix_tree->lex, master_tree->lex); affix_tree->tfs_index = -1; return (affix_tree); } /* global parameter to generate, set in build_affix_trees */ static s_chain *affix_tree_chain; /* create all possible structures according to the tfs in lex_rule and collect them in a chain of word trees */ static void generate(lex_rule, rule_map, level) s_rule_instance *lex_rule; s_bitmap *rule_map; int level; { s_rule_instance **rule_ref; long rule_index; s_rule_instance *rule; s_affix_tree *affix_tree; s_rule_instance result; t_boolean applied; /* try to apply all rules of rule_map to the lexical */ rule_ref = rule_instance_ref; FOR_EACH_BIT(rule_map, rule_index) { rule = rule_ref[rule_index]; applied = apply_rule(&result, rule, lex_rule); if (trace_level >= TRACE_FAIL || (trace_level >= TRACE_RULE && applied)) { indent(level); print_log("%s\n", rule_ref[rule_index]->rule_link->name); } if (applied) { if (rule->rule_kind == Goal) { if (trace_level >= TRACE_GOAL) print_lexical(&result); affix_tree = new_affix_tree(&result); affix_tree_chain = insert_chain_link(affix_tree_chain, (t_ptr) affix_tree); } else { unset_bit(rule_map, rule_index); /* dont apply again */ generate(&result, rule_map, level + 1); set_bit(rule_map, rule_index); /* restore before returning */ } free_tfs(result.lhs); } } } static s_bitmap * init_rule_map() { s_bitmap *rule_map; s_rule_instance **first_ref; s_rule_instance **rule_ref; rule_map = new_bitmap((long) rule_instance_card); first_ref = rule_instance_ref; for (rule_ref = first_ref; *rule_ref != NULL; rule_ref++) switch ((*rule_ref)->rule_kind) { case Goal: /* FALLTHROUGH */ case Prefix: /* FALLTHROUGH */ case Suffix: /* FALLTHROUGH */ case Unary: set_bit(rule_map, (long) (rule_ref - first_ref)); break; default: break; } return (rule_map); } void prepare_rules() { e_rule_kind rule_kind; if (goal_card == 0) print_warning("no goal rules. No rule application will succeed"); for (rule_kind = 0; rule_kind < _last_rule_kind; rule_kind++) rule_maps[rule_kind] = new_bitmap((long) symbol_set[Rule].card); fill_rule_maps(symbol_set[Rule].ref); /* prepare unary rules */ combine_all(rule_maps[Binary], rule_maps[Lexical], symbol_set[Rule].ref); for (rule_kind = 0; rule_kind < _last_rule_kind; rule_kind++) MY_FREE(rule_maps[rule_kind]); rule_map = init_rule_map(); } static void free_affix_tree1(tree) s_rule_instance *tree; { if (tree->branch != NULL) free_affix_tree1(tree->branch); free_tfs(tree->lhs); free_tfs(tree->first); free_tfs(tree->second); MY_FREE(tree); } void free_affix_tree(affix_tree) s_affix_tree *affix_tree; { free_affix_tree1(affix_tree->tree); MY_FREE(affix_tree->lex); MY_FREE(affix_tree); } s_chain * build_affix_trees(tfs) s_tfs *tfs; { static t_boolean initialize = TRUE; static s_rule_instance lexical_rule; if (initialize) { lexical_rule.rule_kind = Lexical; lexical_rule.rule_link = NULL; /* TODO: check non existant */ lexical_rule.branch = NULL; lexical_rule.lex_length = 0; lexical_rule.lex = concatenation + PREFIX_CONCAT_SIZE; lexical_rule.lex[0] = NUL_LETTER; lexical_rule.base_lex = empty_string; lexical_rule.first = NULL; lexical_rule.second = NULL; initialize = FALSE; } lexical_rule.lhs = tfs; if (trace_level > TRACE_GOAL) { print_log("\ngenerating from\n"); print_lexical(&lexical_rule); } affix_tree_chain = NULL; /* global parameter to generate */ generate(&lexical_rule, rule_map, 0); return (affix_tree_chain); } /* global parameter to generate_surface1 */ static t_card stem_length; static t_letter *base_form; static void generate_surface1(affix_tree) s_affix_tree *affix_tree; { (void) strncpy((char *) affix_tree->tree->lex, (char *) affix_tree->lex, affix_tree->prefix_length); (void) strcpy((char *) concatenation + PREFIX_CONCAT_SIZE + stem_length, (char *) affix_tree->lex + affix_tree->prefix_length); if (trace_level > TRACE_GOAL) { print_log("\ngenerating surface from \""); print_string(logfile, affix_tree->tree->lex); print_log("\"\n"); } fill_applicability_map(affix_tree->tree, stem_length); do_spell(affix_tree->tree->lex, base_form, affix_tree->tree->lhs, &affix_tree->tfs_index); } void generate_surface(lex, base_lex, affix_tree_chain) t_letter *lex; t_letter *base_lex; s_chain *affix_tree_chain; { stem_length = strlen((char *) lex); (void) strcpy((char *) (concatenation + PREFIX_CONCAT_SIZE), (char *) lex); base_form = base_lex; /* global parameter to generate_surface1 */ map_chain(affix_tree_chain, generate_surface1); } mmorph-2.3.4.2.orig/unify.h0100644000175000001440000000526206045657202014463 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef unify_h #define unify_h /* size of the array in which the surface string is constructed */ #define MAXUCHAR ((unsigned char) ((1L << BITS(char)) -1)) #define CONCAT_SIZE MAXUCHAR /* first part of that array */ #define PREFIX_CONCAT_SIZE (CONCAT_SIZE/2) /* rest of that array */ #define SUFFIX_CONCAT_SIZE (CONCAT_SIZE - PREFIX_CONCAT_SIZE) /* impossible value for concat_pos */ #define NO_CONCAT 0 #ifndef lint typedef enum { Goal = 0, Lexical, Unary, Binary, Prefix, Suffix, /* Compound, Composite_prefix, Composite_suffix, */ _last_rule_kind } e_rule_kind; #else /* use defines to shutup lint */ #define Goal 0 #define Lexical 1 #define Unary 2 #define Binary 3 #define Prefix 4 #define Suffix 5 #define _last_rule_kind 6 typedef int e_rule_kind; #endif /* ! lint */ #ifndef lint typedef enum { Optional = 0, Coerce, Obligatory, _last_spell_kind } e_spell_kind; #else #define Optional 0 #define Coerce 1 #define Obligatory 2 #define _last_spell_kind 3 typedef int e_spell_kind; #endif /* ! lint */ typedef unsigned long t_value; typedef struct { t_index local_index; t_index foreign_index; } s_var_map; typedef struct { t_index type; t_value *att_list; s_var_map **var_map; } s_tfs; typedef struct rule_instance_s { e_rule_kind rule_kind; struct symbol_s *rule_link; struct rule_instance_s *branch; s_tfs *lhs; s_tfs *first; s_tfs *second; t_letter *lex; t_card lex_length; t_letter *base_lex; } s_rule_instance; typedef struct { struct symbol_s *spell_link; e_spell_kind kind; s_chain *constraint; t_card constraint_card; s_chain *left_context; t_card left_context_length; s_chain *focus; t_card focus_length; s_chain *right_context; t_card right_context_length; t_card concat_pos; } s_spell_instance; typedef struct { s_rule_instance *tree; t_letter *lex; t_card prefix_length; t_card suffix_length; t_card tfs_index; } s_affix_tree; extern s_chain *build_affix_trees(); extern void generate_surface(); extern void free_affix_tree(); extern void prepare_rules(); extern t_boolean match_tfs(); extern t_boolean subsume_tfs(); extern s_tfs *get_tfs(); extern int goal_card; extern t_letter concatenation[]; extern t_index largest_type; #endif /* unify_h */ mmorph-2.3.4.2.orig/user.h0100644000175000001440000000561006045657204014306 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #ifndef user_h #define user_h #include "config.h" #if defined(STDC_HEADERS) && ! MALLOC_FUNC_CHECK #include /* ANSI & POSIX types */ #endif #include #include /* because they may not be declared in errno.h: */ extern int sys_nerr; extern char *sys_errlist[]; #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (1) #endif #define DEBUG 1 /* debugging options */ #define DEBUG_INIT (1L << 0) #define DEBUG_YACC (1L << 1) #define DEBUG_COMBINE (1L << 2) #define DEBUG_SPELL (1L << 3) #define DEBUG_STAT (1L << 4) #define DEBUG_ALL (~ 0L) /* grammar tracing levels */ #define TRACE_GOAL 1 #define TRACE_RULE 2 #define TRACE_FAIL 10 /* spelling tracing levels */ #define TRACE_VALID_SURFACE 1 #define TRACE_LEXICAL_MATCH 2 #define TRACE_LEFT_MATCH 3 #define TRACE_BLOCKING 4 #define TRACE_NON_BLOCKING 5 #ifdef MALLOC_FUNC_CHECK #define EXIT(val) { malloc_shutdown(); exit(val); } #else #define EXIT(val) exit(val) #endif #ifndef MAX #define MAX(a,b) (((a) > (b))?(a):(b)) #endif #ifndef MIN #define MIN(a,b) (((a) < (b))?(a):(b)) #endif #define t_str char * #define t_ptr char * typedef int t_boolean; typedef short t_card; #define T_CARD_MAX MAXSHORT #define T_CARD_TO_STRING(x, str) \ *(unsigned char *)(str) = (unsigned char) ((int)(x) & UCHAR_MAX), \ *((unsigned char *)(str) + 1) = (unsigned char) (((int)(x) >> CHAR_BIT) & UCHAR_MAX) #define STRING_TO_T_CARD(str, x) \ (x) = (t_card) *((unsigned char *) (str)), \ (x) |= (t_card) ((int) *((unsigned char *)(str) + 1) << CHAR_BIT) typedef short t_index; typedef unsigned char t_letter; typedef unsigned long t_flag; typedef unsigned long t_segment_id; #define NO_INDEX ((short) -1) #include "version.h" #include "bitmap.h" #include "chain.h" #include "unify.h" #include "symbols.h" #include "spell.h" #include "mymalloc.h" #include "output.h" #include "combine.h" #include "database.h" #include "tfs.h" #include "tbl.h" #include "crc32file.h" extern unsigned long debug; extern int trace_level; extern int spell_trace_level; extern t_boolean want_flush; extern t_boolean want_segment_id; extern t_boolean mark_unknown; extern t_boolean extend_morph_field; extern t_boolean overwrite_morph_field; extern t_boolean fold_case_always; extern t_boolean fold_case_fallback; extern char *begin_sentence_class; /* declarations to shutup "gcc -Wall", and lint */ #ifdef UNDEF #ifndef STDC_HEADERS extern int getopt(); extern int fclose(); extern int fread(); extern int fwrite(); extern int isatty(); #endif #endif #define DIV_ROUND_UP(a,b) (((int)(a)+(int)(b)-1)/(int)(b)) #endif /* user_h */ mmorph-2.3.4.2.orig/user.y0100644000175000001440000007432106045657205014335 0ustar mvelausers%{ /* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #include "user.h" #include "parse.h" s_symbol *defined_symbol; static s_symbol *largest_type_sym; static t_card largest_type_card; e_symbol_kind defined_kind; static s_symbol_set *value_set; static s_symbol_set *variable_set; static t_boolean variable_allowed; static s_symbol *current_attribute; static s_type *current_type; static s_rule *current_rule; static s_tfs *current_tfs; static s_tfs *common_tfs; static s_chain *current_chain; static s_chain *affix_tree_chain; static int var_map_card; static t_letter *current_string; static t_letter *current_base_form; e_symbol_kind current_letter_kind; static s_pair *current_pair; static t_flag class_flags; static t_flag current_pair_flags; static int current_pair_width; static s_bitmap *current_class; static s_symbol fake_symbol; /* used for pointing defined_symbol to */ static s_spell_instance *current_spell; static s_bitmap *current_lexical_set; static int current_pattern_length; static s_chain *current_pattern; static t_boolean within_focus; static t_boolean has_concat_pos; #define LETTER_STRING_SIZE_MAX 128 static t_letter letter_string[LETTER_STRING_SIZE_MAX]; /* temp storage */ static int letter_string_size; /* size of data in letter_string */ %} %union { t_str string; s_symbol *symbol; s_chain *chain; t_value value; s_tfs *tfs; s_var_map *var_map; t_letter *letter_string; s_pair *pair; } %token ANY BAR BIARROW WORDBOUNDARY CONTEXTBOUNDARY CONCATBOUNDARY MORPHEMEBOUNDARY DOLLAR EQUAL LANGLE LARROW LBRA NOTEQUAL RANGLE RARROW RBRA COERCEARROW COLON SLASH ALPHABETS ATTRIBUTES CLASSES GRAMMAR LEXICON PAIRS SPELLING TYPES %token DNAME NAME STRING SNAME TNAME %token LSTRING %type AttNew AttName TypeNew PairName %type ValName ValSet ValDisjRestSTAR ValDisjRest ValDisj %type TypeName Tfs VarTfs Affix %type AttValSTAR AttSpec ConstraintSTAR %type AttVal ValSpec VarName %type Sequence SurfSequence LexSequence AffixString %type PairPattern %start Start %% Start : AlphabetDecl AttDecl TypeDecl GramDecl ClassDeclOPT PairDeclOPT SpellDeclOPT LexDeclSTAR { } ; AttDecl : AttHead AttDefPLUS { defined_symbol=NULL; /* end of definitions */ make_symbol_reference(&symbol_set[Attribute]); if (debug & DEBUG_INIT) print_symbols_by_ref(&symbol_set[Attribute]); } ; AttHead : ATTRIBUTES { defined_kind=Attribute; crc32file_addn(&crc, (unsigned char *) "@Attributes ", sizeof("@Attributes ")); } ; AttDef : AttNew COLON ValNewPLUS { make_symbol_reference(value_set); link_attribute(value_set,$1); defined_symbol=NULL; /* for error message */ } ; AttNew : DNAME { $$=*new_symbol($1,&symbol_set[Attribute]); value_set=&$$->data->attribute.value_set; defined_symbol=$$; crc32file_addn(&crc, (unsigned char *) $1, (int) strlen($1)); crc32file_add(&crc, (unsigned char) ':'); } ; ValNew : NAME { (void) new_symbol($1,value_set); crc32file_addn(&crc, (unsigned char *) $1, (int) strlen($1)); crc32file_add(&crc, (unsigned char) ' '); } ; TypeDecl : TypeHead TypeDefPLUS { defined_symbol=NULL; /* end of definitions */ make_symbol_reference(&symbol_set[Type]); largest_type=largest_type_sym->ordinal; if (debug & DEBUG_INIT) print_symbols_by_ref(&symbol_set[Type]); /* TODO: move this to end of spelling rules when looking up unknown words works. */ if (db_operation & Lookup) { crc32file_hash(&crc, crc_hash); parsing=FALSE; /* change format of fatal errors */ tfs_table_init(db_operation, gram_file_name, db_file_name, crc_hash); parsing=TRUE; } if (db_operation == Lookup) YYACCEPT; /* skip the rest of the file */ } ; TypeHead : TYPES { defined_kind=Type; largest_type_card = 0; crc32file_addn(&crc, (unsigned char *) "@Types ", sizeof("@Types ")); } ; TypeDef : TypeNew COLON AttNamePLUS NoProjectAttOPTL { if (current_type->project_card==0) current_type->project_card=current_type->card; if (current_type->card > largest_type_card) { largest_type_sym = defined_symbol; largest_type_card = current_type->card; } current_type->attribute_ref= (s_symbol **) new_ref((int) current_type->card, map_chain, (t_ptr) current_chain, ref_is_item); free_chain(current_chain); defined_symbol=NULL; /* for error message */ } ; NoProjectAttOPTL : ProjSep AttNamePLUS { } | /* empty */ { } ; ProjSep : BAR { current_type->project_card= current_type->card; crc32file_add(&crc, (unsigned char) '|'); } TypeNew : DNAME { defined_symbol = *new_symbol($1,&symbol_set[Type]); current_type = (s_type *) defined_symbol->data; current_chain = NULL; crc32file_addn(&crc, (unsigned char *) $1, (int) strlen($1)); crc32file_add(&crc, (unsigned char) ':'); } ; AttName : NAME { $$=*find_symbol($1,&symbol_set[Attribute]); current_attribute=$$; value_set= &(($$)->data->attribute.value_set); } ; GramDecl : GramHead RulePLUS { defined_symbol=NULL; /* end of definitions */ make_symbol_reference(&symbol_set[Rule]); if (debug & DEBUG_INIT) print_symbols_by_ref(&symbol_set[Rule]); if (! parse_only) prepare_rules(); } ; GramHead : GRAMMAR { defined_kind=Rule; goal_card = 0; /* tell tokenizer to interpret strings as lexical strings */ current_letter_kind=Lexical_Letter; current_letter_map=lexical_letter_map; } ; Rule : RuleNew COLON RuleBody { defined_symbol=NULL; /* for error message */ } ; RuleBody : VarTfs Rewrite Rhs { make_symbol_reference(variable_set); current_rule->instance->lhs=$1; adjust_var_map(variable_set->ref,current_rule->instance); } | Affix { variable_set = NULL; /* no variable to handle */ current_rule->instance->rule_kind = Lexical; current_rule->instance->lhs=$1; } | Tfs { current_rule->instance->rule_kind = Goal; goal_card++; if ($1->var_map != NULL) /* TODO catch this earlier */ fatal_error("variables not allowed in goal rule"); current_rule->instance->first=$1; current_rule->instance->lex= (t_letter *) "";/* empty string */ current_rule->instance->lhs=new_tfs($1->type); fill_tfs_with_variables(current_rule->instance->lhs); ident_var_map(current_rule->instance->lhs); } ; Rewrite : LARROW { } ; VarTfs : Tfs { $$=$1; } ; AffixString : LSTRING { variable_allowed=FALSE; $$=$1; } ; RuleNew : DNAME { defined_symbol = *new_symbol($1,&symbol_set[Rule]); current_rule = (s_rule *)defined_symbol->data; variable_set = &(current_rule->variable_set); variable_allowed=TRUE; } ; Tfs : TypeName AttSpec { $$ = $1; /* that's the tfs */ if ($2 == NULL) $$->var_map = NULL; else { $$->var_map = (s_var_map **) new_ref(var_map_card, map_chain, (t_ptr) $2, ref_is_item); free_chain($2); } } ; TypeName : TNAME { s_symbol *symbol; symbol = *find_symbol($1,&symbol_set[Type]); current_type = (s_type *) symbol->data; $$=new_tfs(symbol->ordinal); current_tfs=$$; /* fill the type feature structure with full sets */ fill_tfs_with_variables($$); } ; AttSpec : LBRA AttValSTAR RBRA { $$=$2; } ; AttVal : AttName ValSpec { $$=$2; } ; ValSpec : ValSetSpec { $$=NULL; } | EQUAL DOLLAR VarName { $$=$3; } | EQUAL DOLLAR VarName ValSetSpec { $$=$3; } ; VarName : NAME { int pos; s_symbol *variable; pos = reference_position((t_ptr *) current_type->attribute_ref, (t_ptr) current_attribute); if ( pos < 0 ) fatal_error( "attribute \"%s\" not declared for type \"%s\"", current_attribute->name, symbol_set[Type].ref[current_tfs->type]->name); if (! variable_allowed) fatal_error( "a variable is not allowed in this context"); variable = *new_symbol($1,variable_set); if (variable->data->variable.attribute_link == NULL) variable->data->variable.attribute_link=current_attribute; else if (variable->data->variable.attribute_link != current_attribute) fatal_error("variable $%s %s \"%s\" and \"%s\"", $1, "is used for incompatible attributes:", variable->data->variable.attribute_link->name, current_attribute->name); MY_MALLOC($$,s_var_map); $$->foreign_index = (t_index) variable->ordinal; $$->local_index = (t_index) pos; } ; ValSetSpec : ValSet { int pos; pos = reference_position((t_ptr *) current_type->attribute_ref, (t_ptr) current_attribute); if ( pos < 0 ) fatal_error( "attribute \"%s\" not declared for type \"%s\"", current_attribute->name, symbol_set[Type].ref[current_tfs->type]->name); current_tfs->att_list[pos] &= $1; if (current_tfs->att_list[pos] == NO_BITS) fatal_error("value set complement for \"%s\" is empty", current_attribute->name); } ValSet : NOTEQUAL ValDisj { $$ = ~ ($2); if ($$ == NO_BITS) /* occurs only when there is MAXVAL values for attribute */ fatal_error("value set complement is empty"); } | EQUAL ValDisj { $$ = $2; } ; ValDisj : ValName ValDisjRestSTAR { $$ = ($1 | $2); } ; ValName : NAME { $$ = BIT_N((*find_symbol($1,value_set))->ordinal); } ; ValDisjRest : BAR ValName { $$ = $2; } ; Rhs : VarTfs { current_rule->instance->rule_kind=Unary; current_rule->instance->first=$1; current_rule->instance->second=NULL; } | VarTfs VarTfs { current_rule->instance->rule_kind=Binary; current_rule->instance->first=$1; current_rule->instance->second=$2; } | Affix VarTfs { current_rule->instance->rule_kind=Prefix; current_rule->instance->first=$2; current_rule->instance->second=$1; } | VarTfs Affix { current_rule->instance->rule_kind=Suffix; current_rule->instance->first=$1; current_rule->instance->second=$2; } ; Affix : AffixString Tfs { /* affix tfs cannot have variables; see adjust_var_map() */ current_rule->instance->lex=$1; current_rule->instance->lex_length=strlen((char *) $1); $$=$2; variable_allowed = TRUE; /* useful only for prefix */ } AttDefPLUS : AttDefPLUS AttDef { } | AttDef { } ; ValNewPLUS : ValNewPLUS ValNew { } | ValNew { } ; TypeDefPLUS : TypeDefPLUS TypeDef { } | TypeDef { } ; RulePLUS : RulePLUS Rule { } | Rule { } ; AttValSTAR : AttValSTAR AttVal { var_map_card++; if ($2 != NULL) $$ = insert_chain_link($1, (t_ptr) $2); } | /* empty */ { var_map_card=0; $$=NULL; } ; ValDisjRestSTAR : ValDisjRestSTAR ValDisjRest { $$ = ( $1 | $2 ); } | /* empty */ { $$ = 0L; } ; AttNamePLUS : AttNamePLUS AttName { current_type->card++; current_chain=insert_chain_link(current_chain, (t_ptr) $2); crc32file_addn(&crc, (unsigned char *) $2->name, (int) strlen($2->name)); crc32file_add(&crc, (unsigned char) ' '); } | AttName { current_type->card++; current_chain=insert_chain_link(current_chain, (t_ptr) $1); crc32file_addn(&crc, (unsigned char *) $1->name, (int) strlen($1->name)); crc32file_add(&crc, (unsigned char) ' '); } ; SpellDeclOPT : SpellHead SpellDefPLUS { defined_symbol=NULL; /* end of definitions */ make_symbol_reference(&symbol_set[Spelling]); if (debug & DEBUG_INIT) print_symbols_by_ref(&symbol_set[Spelling]); max_spell_length=max_left_context_length + max_rest_length; if (!parse_only) prepare_spell(); } | /* empty */ { } ; SpellHead : SPELLING { defined_kind=Spelling; max_left_context_length=0; max_rest_length=0; } ; SpellDef : SpellNew COLON Arrow LeftContext Focus RightContext ConstraintSTAR { current_spell->left_context = reverse_chain(current_spell->left_context); if (! has_concat_pos) current_spell->concat_pos = NO_CONCAT; /* impossible value */ defined_symbol=NULL; /* for error message */ max_left_context_length = MAX(current_spell->left_context_length, max_left_context_length); max_rest_length = MAX(current_spell->focus_length + current_spell->right_context_length, max_rest_length); current_spell->constraint = $7; } ; SpellNew : DNAME { defined_symbol = *new_symbol($1,&symbol_set[Spelling]); current_spell = defined_symbol->data->spelling.instance; current_spell->spell_link=defined_symbol; /* next letter will be found in surface alphabet */ current_letter_kind=Surface_Letter; current_letter_map=surface_letter_map; current_pair_flags=BOTH_LETTERS; /* for next explicit Pair */ has_concat_pos=FALSE; current_spell->concat_pos=0; current_pattern=NULL; /* prepare for left context */ current_pattern_length=0; within_focus=FALSE; } ; SpellDefPLUS : SpellDefPLUS SpellDef { } | SpellDef { } ; LeftContext : PatternSTAR { current_spell->left_context=current_pattern; current_spell->left_context_length=current_pattern_length; if (has_concat_pos) current_spell->concat_pos -= current_pattern_length; current_pattern=NULL; /* prepare for focus */ current_pattern_length=0; within_focus=TRUE; } ; RightContext : PatternSTAR { current_spell->right_context=current_pattern; current_spell->right_context_length=current_pattern_length; } ; Focus : CONTEXTBOUNDARY PatternPLUS CONTEXTBOUNDARY { current_spell->focus = current_pattern; current_spell->focus_length=current_pattern_length; if (! has_concat_pos) current_spell->concat_pos += current_pattern_length; current_pattern = NULL; /* prepare for right context */ current_pattern_length=0; within_focus=FALSE; } ; Arrow : RARROW { current_spell->kind= Optional; } | BIARROW { current_spell->kind= Obligatory; } | COERCEARROW { current_spell->kind = Coerce; } ; ConstraintSTAR : ConstraintSTAR Tfs { $$ = insert_chain_link($1, (t_ptr) $2); current_spell->constraint_card++; } | /* empty */ { current_spell->constraint_card = 0; $$ = NULL; } ; PatternPLUS : PatternPLUS Pattern { } | Pattern { } ; PatternSTAR : PatternPLUS { } | /* empty */ { } ; Pattern : CONCATBOUNDARY { if (has_concat_pos) fatal_error("concatenation position already specified"); has_concat_pos=TRUE; current_spell->concat_pos += current_pattern_length; current_pattern = insert_chain_link(current_pattern, (t_ptr) morpheme_boundary_pair); current_pattern_length++; } | MORPHEMEBOUNDARY { current_pattern = insert_chain_link(current_pattern, (t_ptr) morpheme_boundary_pair); current_pattern_length++; } | WORDBOUNDARY { current_pattern = insert_chain_link(current_pattern, (t_ptr) word_boundary_pair); current_pattern_length++; } | PairPattern { current_pattern = insert_chain_link(current_pattern, (t_ptr) $1); current_pattern_length += lexical_width($1); } ; LexDeclSTAR : LexDeclPLUS { } | /* empty */ { } ; LexDeclPLUS : LexDeclPLUS LexHead LexDefSTAR { } | FirstLexHead LexDefSTAR { } ; LexHead : LEXICON { } ; FirstLexHead : LEXICON { defined_kind = Lexicon; variable_set=NULL; /* prevent variables in lexical Tfs */ variable_allowed=FALSE; if ((db_operation & Update)) { /* options mentionned -a */ augmenting=TRUE; initfile(augment_file_name); /* splice in file now */ } /* otherwise splice it at the end of this file, cf tokenize.l */ /* tell tokenizer to interpret strings as lexical strings */ current_letter_kind=Lexical_Letter; current_letter_map=lexical_letter_map; normalize = normalize_flag; } ; LexDef : CommonTfs LexicalPLUS { free_tfs(common_tfs); if (! parse_only) { map_chain(affix_tree_chain, free_affix_tree); free_chain(affix_tree_chain); } } ; CommonTfs : Tfs { common_tfs = $1; if (! parse_only) affix_tree_chain = build_affix_trees(common_tfs); else if (normalize) { print_out("\t"); print_tfs1(outfile, common_tfs, FALSE, FALSE, FALSE); } } ; LexicalPLUS : LexicalPLUS Lexical { } | Lexical { } ; Lexical : LexNew BaseFormOPTL { parsing=FALSE; if (! parse_only) generate_surface(current_string, current_base_form, affix_tree_chain); else if (normalize) { print_out("\""); print_string(outfile, current_string); if (current_string != current_base_form && strcmp((char *) current_string, (char *) current_base_form)) { print_out("\" = \""); print_string(outfile, current_base_form); } print_out("\"\n"); } parsing=TRUE; if (current_string != current_base_form) MY_FREE(current_base_form); MY_FREE(current_string); } ; BaseFormOPTL : EQUAL LSTRING { /* TODO should not be in the lexical alphabet but user */ current_base_form = $2; } | { current_base_form = current_string; } ; LexNew : LSTRING { /* save string */ current_string = $1; } LexDefSTAR : LexDefSTAR LexDef { } | /* empty */ { } ; AlphabetDecl : AlphabetHead AlphabetDef { defined_symbol=NULL; /* end of definitions */ allow_string_letters=FALSE; } ; AlphabetHead : ALPHABETS { t_str filler_symbol_name; defined_kind=Alphabet; init_symbol_set(&symbol_set[Pair], Lexical_Letter); /* fill the slot with ordinal number 0 with a dummy symbol so that letter strings can also terminate with 0; Use strdup, just in case the symbol is freed one day. */ MY_STRDUP(filler_symbol_name,""); /* impossible symbol name */ (void) new_symbol(filler_symbol_name,&symbol_set[Pair]); /* declare word boundary and morpheme boundary */ MY_STRDUP(filler_symbol_name," + "); /* unlikely symbol name */ morpheme_boundary_pair = (s_pair *) (*new_symbol(filler_symbol_name, &symbol_set[Pair]))->data; morpheme_boundary = morpheme_boundary_pair->lexical; /* tinker with the symbol table */ morpheme_boundary_pair->surface= empty_string; first_lexical_letter=*morpheme_boundary; MY_STRDUP(filler_symbol_name," ~ "); /* unlikely symbol name */ word_boundary_pair = (s_pair *) (*new_symbol(filler_symbol_name, &symbol_set[Pair]))->data; word_boundary=word_boundary_pair->lexical; /* tinker with the symbol table */ word_boundary_pair->surface= empty_string; allow_string_letters=TRUE; /* allow ASTRING strings */ MY_CALLOC(surface_letter_map,LETTER_MAP_SIZE,t_letter); MY_CALLOC(lexical_letter_map,LETTER_MAP_SIZE,t_letter); MY_CALLOC(letter_to_char_map,LETTER_MAP_SIZE,unsigned char); crc32file_addn(&crc, (unsigned char *) "@Alphabets ", sizeof("@Alphabets ")); } ; AlphabetDef : LexicalNew COLON LetterNewPLUS SurfaceNew COLON LetterNewPLUS { MY_FREE(fake_symbol.name); alphabet_size=symbol_set[Pair].card; make_symbol_reference(&symbol_set[Pair]); if (debug & DEBUG_INIT) { print_symbols_by_ref(&symbol_set[Pair]); } } ; LexicalNew : DNAME { /* don't care about name, first is lexical, second surface */ fake_symbol.name=$1; fake_symbol.ordinal=0; defined_symbol=&fake_symbol; symbol_set[Pair].kind = Lexical_Letter; current_letter_map=lexical_letter_map; crc32file_addn(&crc, (unsigned char *) "Lexical:", sizeof("Lexical:")); } ; SurfaceNew : DNAME { /* don't care about name, first is lexical, second surface */ defined_kind=Alphabet; MY_FREE(fake_symbol.name); fake_symbol.name=$1; fake_symbol.ordinal=0; symbol_set[Pair].kind = Surface_Letter; current_letter_map=surface_letter_map; lexical_alphabet_size=symbol_set[Pair].card; crc32file_addn(&crc, (unsigned char *) "Surface:", sizeof("Surface:")); } ; LetterNewPLUS : LetterNewPLUS LetterNew { } | LetterNew { } ; LetterNew : NAME { s_symbol *symbol; int length; symbol= *new_symbol($1,&symbol_set[Pair]); if ((length = strlen(symbol->name)) == 1) { current_letter_map[(unsigned char) *symbol->name] = (t_letter) symbol->ordinal; letter_to_char_map[symbol->ordinal] = (unsigned char) *symbol->name; } crc32file_addn(&crc, (unsigned char *) $1 , (int) length); crc32file_add(&crc, (unsigned char) ' '); } | STRING { /* allow special characters to be declared as letter */ /* TODO: cleanup the cases where this name could be printed */ s_symbol *symbol; symbol= *new_symbol($1,&symbol_set[Pair]); if (strlen(symbol->name) != 1) fatal_error("%s %s %s", "Sorry: cannot accept string definition of", symbol_kind_str[current_letter_kind], "longer than one character"); else { current_letter_map[(unsigned char) *symbol->name] = (t_letter) symbol->ordinal; letter_to_char_map[symbol->ordinal] = (unsigned char) *symbol->name; } crc32file_add(&crc, (unsigned char) '"'); crc32file_add(&crc, (unsigned char) *$1); crc32file_add(&crc, (unsigned char) '"'); } ; PairDeclOPT : PairHead PairDefPLUS { defined_symbol=NULL; /* end of definitions */ if (debug & DEBUG_INIT) { /* TODO change this */ print_symbol_table(&symbol_set[Pair]); } MY_FREE(current_lexical_set); } | /* empty */ { } ; PairHead : PAIRS { defined_kind=Pair; symbol_set[Pair].kind = Pair; current_lexical_set=new_bitmap((long) alphabet_size); } ; PairDefPLUS : PairDefPLUS PairDef { } | PairDef { } ; PairDef : PairNew COLON PairPLUS { defined_symbol=NULL; /* for error message */ } ; PairNew : DNAME { defined_symbol = *new_symbol($1,&symbol_set[Pair]); current_pair = (s_pair *) defined_symbol->data; /* next letter will be found in surface alphabet */ current_letter_kind=Surface_Letter; current_letter_map=surface_letter_map; current_pair_flags=BOTH_LETTERS; /* for next explicit Pair */ empty_bitmap(current_lexical_set); current_pair_width=-1; } ; PairPLUS : PairPLUS Pair { } | Pair { } ; Pair : SurfSequence SLASH LexSequence { int lexical_width; if (current_pair_flags & LEXICAL_IS_CLASS) lexical_width=1; else lexical_width=strlen((char *) $3); if (lexical_width > 1) { /* TODO: print pair */ fatal_error("%s\nthe lexical part %s", "Sorry, not yet implemented.", "of the pair cannot be longer than one symbol"); } if (current_pair_width == -1) current_pair_width = lexical_width; else if (current_pair_width != lexical_width) fatal_error("%s %s", "you cannot mix pairs with different", "lexical lengths"); if (lexical_width==0 && !(current_pair_flags & SURFACE_IS_CLASS) && *($1) == NUL_LETTER) fatal_error("empty pair <>/<> is not allowed"); add_explicit_pair(current_pair,$1,$3,current_pair_flags, current_lexical_set); current_pair_flags=BOTH_LETTERS; /* restore for next */ } | PairName { int pair_width; /* TODO factorize this code and similar above */ if ($1 == defined_symbol) fatal_error("pair name is used in its own definition"); pair_width=lexical_width((s_pair *) $1->data); if (current_pair_width == -1) current_pair_width = pair_width; else if (current_pair_width != pair_width) fatal_error("%s %s", "you cannot mix pairs with different", "lexical lengths"); add_pair(current_pair, (s_pair *) $1->data, current_lexical_set); } ; PairPattern : SurfSequence SLASH LexSequence { /* similar to Pair above */ int lexical_width; if (! (current_pair_flags & LEXICAL_IS_CLASS)) { lexical_width=strlen((char *) $3); if (lexical_width > 1) /* TODO: print pair */ fatal_error("%s\nthe lexical part of th pair %s", "Sorry, not yet implemented.", "cannot be longer than one symbol"); else if (lexical_width == 0 && ! (current_pair_flags & LEXICAL_IS_CLASS) && *($1) == NUL_LETTER) fatal_error("empty pair <>/<> is not allowed"); } $$=new_pair($1,$3,current_pair_flags,(s_pair *) NULL); if (within_focus) is_pair_concrete($$); current_pair_flags=BOTH_LETTERS; /* restore for next */ } | PairName { $$= (s_pair *) $1->data; if (within_focus) is_pair_concrete($$); } ; PairName : NAME { $$= *find_symbol($1,&symbol_set[Pair]); if (! ($$->kind == Pair || $$->kind == Pair_Letter || $$->kind == Pair_Class)) fatal_error("%s \"%s\"", "There is no pair associated to symbol", $$->name); } ; SurfSequence : Sequence { current_letter_kind=Lexical_Letter; /* alternate */ current_letter_map=lexical_letter_map; $$=$1; } ; LexSequence : Sequence { current_letter_kind=Surface_Letter; /* alternate */ current_letter_map=surface_letter_map; $$=$1; } ; Sequence : LANGLE LetterSTAR RANGLE { letter_string[letter_string_size]= NUL_LETTER; MY_STRDUP($$,letter_string); } | LSTRING { $$= (t_letter *) $1; } | NAME { s_symbol *pair_symbol; pair_symbol = *find_symbol($1, &symbol_set[Pair]); if (pair_symbol->kind== Pair || (current_letter_kind == Surface_Letter && (pair_symbol->kind == Lexical_Letter || pair_symbol->kind == Lexical_Class)) || (current_letter_kind == Lexical_Letter && (pair_symbol->kind == Surface_Letter || pair_symbol->kind == Surface_Class))) fatal_error("symbol \"%s\" is not a %s", pair_symbol->name, symbol_kind_str[current_letter_kind]); if (pair_symbol->data->pair.pair_flags == BOTH_CLASSES) if (current_letter_kind == Surface_Letter) current_pair_flags |= SURFACE_IS_CLASS; else current_pair_flags |= LEXICAL_IS_CLASS; if (current_letter_kind == Surface_Letter) $$ = pair_symbol->data->pair.surface; else $$ = pair_symbol->data->pair.lexical; } | ANY { $$ = letter_any; } ; LetterSTAR : LetterSTAR NAME { if (letter_string_size >= LETTER_STRING_SIZE_MAX - 1) fatal_error("symbol sequence too long, maximum=%d", LETTER_STRING_SIZE_MAX - 1); letter_string[letter_string_size++] = *find_letter($2, current_letter_kind); } | /* empty */ { letter_string_size=0; } ; ClassDeclOPT : ClassHead ClassDefPLUS { defined_symbol=NULL; /* end of definitions */ allow_string_letters=FALSE; if (debug & DEBUG_INIT) { /* TODO change this */ print_symbol_table(&symbol_set[Pair]); } } | /* empty */ { } ; ClassHead : CLASSES { defined_kind=Pair_Class; symbol_set[Pair].kind = Pair_Class; allow_string_letters=TRUE; } ; ClassDefPLUS: ClassDefPLUS ClassDef { } | ClassDef { } ; ClassDef : ClassNew COLON ClassPLUS { if (class_flags & SURFACE_FLAG) if (class_flags & LEXICAL_FLAG) { defined_symbol->kind=Pair_Class; defined_symbol->data->class.lexical = current_class; } else defined_symbol->kind=Surface_Class; else { defined_symbol->kind = Lexical_Class; defined_symbol->data->class.lexical = current_class; defined_symbol->data->class.surface = NULL; } defined_symbol=NULL; /* for error message */ } ; ClassNew : DNAME { defined_symbol = *new_symbol($1,&symbol_set[Pair]); current_class = defined_symbol->data->class.surface; class_flags = SURFACE_FLAG | LEXICAL_FLAG; } ; ClassPLUS : ClassPLUS Class { } | Class { } ; Class : NAME { s_symbol *class_symbol; class_symbol = *find_symbol($1,&symbol_set[Pair]); switch (class_symbol->kind) { case Surface_Letter: class_flags &= SURFACE_FLAG; set_bit(current_class, (long) *(class_symbol->data->pair.surface)); break; case Lexical_Letter: class_flags &= LEXICAL_FLAG; /*FALLTHROUGH*/ case Pair_Letter: set_bit(current_class, (long) *(class_symbol->data->pair.lexical)); break; case Surface_Class: class_flags &= SURFACE_FLAG; assign_or(current_class, class_symbol->data->class.surface); break; case Lexical_Class: class_flags &= LEXICAL_FLAG; /*FALLTHROUGH*/ case Pair_Class: if (class_symbol == defined_symbol) fatal_error( "symbol class is used in its own definition"); assign_or(current_class, class_symbol->data->class.lexical); break; default: fatal_error("program bug: no such class kind"); break; } if (class_flags == 0) fatal_error("you cannot mix %s (class=\"%s\", symbol=\"%s\")", "pure lexical and surface symbols in same class", defined_symbol->name, class_symbol->name); } | STRING { /* allow special characters to be used as a class definition */ /* TODO: cleanup the cases where this name could be printed ?? */ s_symbol *class_symbol; class_symbol= *find_symbol($1,&symbol_set[Pair]); switch (class_symbol->kind) { case Surface_Letter: class_flags &= SURFACE_FLAG; set_bit(current_class, (long) *(class_symbol->data->pair.surface)); break; case Lexical_Letter: class_flags &= LEXICAL_FLAG; /*FALLTHROUGH*/ case Pair_Letter: set_bit(current_class, (long) *(class_symbol->data->pair.lexical)); break; default: fatal_error("program bug: no such class kind"); break; } if (class_flags == 0) fatal_error("%s %s (class=\"%s\", symbol=\"%s\")", "you cannot mix pure lexical and surface", "symbols in the same class", defined_symbol->name, class_symbol->name); } ; mmorph-2.3.4.2.orig/version.h0100644000175000001440000000067006267673440015024 0ustar mvelausers/* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, Modificado por la RAE. */ #ifndef version_h #define version_h #define CREATOR_NAME "mmorph" #define MAJOR_VERSION 2 #define MINOR_VERSION 3 #define PATCH_LEVEL 4 #define VERSION_STR "2.3" #define PATCH_VERSION_STR "2.3.4_2" #endif /* version_h */ mmorph-2.3.4.2.orig/yacc.sed0100644000175000001440000000010005637336670014567 0ustar mvelausers#!/bin/sed -f s/^\(.*\), \(line [0-9][0-9]*\)$/"user.y", \2:\1/ mmorph-2.3.4.2.orig/user.output0100644000175000001440000012330106313321341015401 0ustar mvelausers Terminals which are not used: SNAME Grammar rule 1 Start -> AlphabetDecl AttDecl TypeDecl GramDecl ClassDeclOPT PairDeclOPT SpellDeclOPT LexDeclSTAR rule 2 AttDecl -> AttHead AttDefPLUS rule 3 AttHead -> ATTRIBUTES rule 4 AttDef -> AttNew COLON ValNewPLUS rule 5 AttNew -> DNAME rule 6 ValNew -> NAME rule 7 TypeDecl -> TypeHead TypeDefPLUS rule 8 TypeHead -> TYPES rule 9 TypeDef -> TypeNew COLON AttNamePLUS NoProjectAttOPTL rule 10 NoProjectAttOPTL -> ProjSep AttNamePLUS rule 11 NoProjectAttOPTL -> /* empty */ rule 12 ProjSep -> BAR rule 13 TypeNew -> DNAME rule 14 AttName -> NAME rule 15 GramDecl -> GramHead RulePLUS rule 16 GramHead -> GRAMMAR rule 17 Rule -> RuleNew COLON RuleBody rule 18 RuleBody -> VarTfs Rewrite Rhs rule 19 RuleBody -> Affix rule 20 RuleBody -> Tfs rule 21 Rewrite -> LARROW rule 22 VarTfs -> Tfs rule 23 AffixString -> LSTRING rule 24 RuleNew -> DNAME rule 25 Tfs -> TypeName AttSpec rule 26 TypeName -> TNAME rule 27 AttSpec -> LBRA AttValSTAR RBRA rule 28 AttVal -> AttName ValSpec rule 29 ValSpec -> ValSetSpec rule 30 ValSpec -> EQUAL DOLLAR VarName rule 31 ValSpec -> EQUAL DOLLAR VarName ValSetSpec rule 32 VarName -> NAME rule 33 ValSetSpec -> ValSet rule 34 ValSet -> NOTEQUAL ValDisj rule 35 ValSet -> EQUAL ValDisj rule 36 ValDisj -> ValName ValDisjRestSTAR rule 37 ValName -> NAME rule 38 ValDisjRest -> BAR ValName rule 39 Rhs -> VarTfs rule 40 Rhs -> VarTfs VarTfs rule 41 Rhs -> Affix VarTfs rule 42 Rhs -> VarTfs Affix rule 43 Affix -> AffixString Tfs rule 44 AttDefPLUS -> AttDefPLUS AttDef rule 45 AttDefPLUS -> AttDef rule 46 ValNewPLUS -> ValNewPLUS ValNew rule 47 ValNewPLUS -> ValNew rule 48 TypeDefPLUS -> TypeDefPLUS TypeDef rule 49 TypeDefPLUS -> TypeDef rule 50 RulePLUS -> RulePLUS Rule rule 51 RulePLUS -> Rule rule 52 AttValSTAR -> AttValSTAR AttVal rule 53 AttValSTAR -> /* empty */ rule 54 ValDisjRestSTAR -> ValDisjRestSTAR ValDisjRest rule 55 ValDisjRestSTAR -> /* empty */ rule 56 AttNamePLUS -> AttNamePLUS AttName rule 57 AttNamePLUS -> AttName rule 58 SpellDeclOPT -> SpellHead SpellDefPLUS rule 59 SpellDeclOPT -> /* empty */ rule 60 SpellHead -> SPELLING rule 61 SpellDef -> SpellNew COLON Arrow LeftContext Focus RightContext ConstraintSTAR rule 62 SpellNew -> DNAME rule 63 SpellDefPLUS -> SpellDefPLUS SpellDef rule 64 SpellDefPLUS -> SpellDef rule 65 LeftContext -> PatternSTAR rule 66 RightContext -> PatternSTAR rule 67 Focus -> CONTEXTBOUNDARY PatternPLUS CONTEXTBOUNDARY rule 68 Arrow -> RARROW rule 69 Arrow -> BIARROW rule 70 Arrow -> COERCEARROW rule 71 ConstraintSTAR -> ConstraintSTAR Tfs rule 72 ConstraintSTAR -> /* empty */ rule 73 PatternPLUS -> PatternPLUS Pattern rule 74 PatternPLUS -> Pattern rule 75 PatternSTAR -> PatternPLUS rule 76 PatternSTAR -> /* empty */ rule 77 Pattern -> CONCATBOUNDARY rule 78 Pattern -> MORPHEMEBOUNDARY rule 79 Pattern -> WORDBOUNDARY rule 80 Pattern -> PairPattern rule 81 LexDeclSTAR -> LexDeclPLUS rule 82 LexDeclSTAR -> /* empty */ rule 83 LexDeclPLUS -> LexDeclPLUS LexHead LexDefSTAR rule 84 LexDeclPLUS -> FirstLexHead LexDefSTAR rule 85 LexHead -> LEXICON rule 86 FirstLexHead -> LEXICON rule 87 LexDef -> CommonTfs LexicalPLUS rule 88 CommonTfs -> Tfs rule 89 LexicalPLUS -> LexicalPLUS Lexical rule 90 LexicalPLUS -> Lexical rule 91 Lexical -> LexNew BaseFormOPTL rule 92 BaseFormOPTL -> EQUAL LSTRING rule 93 BaseFormOPTL -> /* empty */ rule 94 LexNew -> LSTRING rule 95 LexDefSTAR -> LexDefSTAR LexDef rule 96 LexDefSTAR -> /* empty */ rule 97 AlphabetDecl -> AlphabetHead AlphabetDef rule 98 AlphabetHead -> ALPHABETS rule 99 AlphabetDef -> LexicalNew COLON LetterNewPLUS SurfaceNew COLON LetterNewPLUS rule 100 LexicalNew -> DNAME rule 101 SurfaceNew -> DNAME rule 102 LetterNewPLUS -> LetterNewPLUS LetterNew rule 103 LetterNewPLUS -> LetterNew rule 104 LetterNew -> NAME rule 105 LetterNew -> STRING rule 106 PairDeclOPT -> PairHead PairDefPLUS rule 107 PairDeclOPT -> /* empty */ rule 108 PairHead -> PAIRS rule 109 PairDefPLUS -> PairDefPLUS PairDef rule 110 PairDefPLUS -> PairDef rule 111 PairDef -> PairNew COLON PairPLUS rule 112 PairNew -> DNAME rule 113 PairPLUS -> PairPLUS Pair rule 114 PairPLUS -> Pair rule 115 Pair -> SurfSequence SLASH LexSequence rule 116 Pair -> PairName rule 117 PairPattern -> SurfSequence SLASH LexSequence rule 118 PairPattern -> PairName rule 119 PairName -> NAME rule 120 SurfSequence -> Sequence rule 121 LexSequence -> Sequence rule 122 Sequence -> LANGLE LetterSTAR RANGLE rule 123 Sequence -> LSTRING rule 124 Sequence -> NAME rule 125 Sequence -> ANY rule 126 LetterSTAR -> LetterSTAR NAME rule 127 LetterSTAR -> /* empty */ rule 128 ClassDeclOPT -> ClassHead ClassDefPLUS rule 129 ClassDeclOPT -> /* empty */ rule 130 ClassHead -> CLASSES rule 131 ClassDefPLUS -> ClassDefPLUS ClassDef rule 132 ClassDefPLUS -> ClassDef rule 133 ClassDef -> ClassNew COLON ClassPLUS rule 134 ClassNew -> DNAME rule 135 ClassPLUS -> ClassPLUS Class rule 136 ClassPLUS -> Class rule 137 Class -> NAME rule 138 Class -> STRING Terminals, with rules where they appear $ (-1) error (256) ANY (258) 125 BAR (259) 12 38 BIARROW (260) 69 WORDBOUNDARY (261) 79 CONTEXTBOUNDARY (262) 67 CONCATBOUNDARY (263) 77 MORPHEMEBOUNDARY (264) 78 DOLLAR (265) 30 31 EQUAL (266) 30 31 35 92 LANGLE (267) 122 LARROW (268) 21 LBRA (269) 27 NOTEQUAL (270) 34 RANGLE (271) 122 RARROW (272) 68 RBRA (273) 27 COERCEARROW (274) 70 COLON (275) 4 9 17 61 99 111 133 SLASH (276) 115 117 ALPHABETS (277) 98 ATTRIBUTES (278) 3 CLASSES (279) 130 GRAMMAR (280) 16 LEXICON (281) 85 86 PAIRS (282) 108 SPELLING (283) 60 TYPES (284) 8 DNAME (285) 5 13 24 62 100 101 112 134 NAME (286) 6 14 32 37 104 119 124 126 137 STRING (287) 105 138 SNAME (288) TNAME (289) 26 LSTRING (290) 23 92 94 123 Nonterminals, with rules where they appear Start (36) on left: 1 AttDecl (37) on left: 2, on right: 1 AttHead (38) on left: 3, on right: 2 AttDef (39) on left: 4, on right: 44 45 AttNew (40) on left: 5, on right: 4 ValNew (41) on left: 6, on right: 46 47 TypeDecl (42) on left: 7, on right: 1 TypeHead (43) on left: 8, on right: 7 TypeDef (44) on left: 9, on right: 48 49 NoProjectAttOPTL (45) on left: 10 11, on right: 9 ProjSep (46) on left: 12, on right: 10 TypeNew (47) on left: 13, on right: 9 AttName (48) on left: 14, on right: 28 56 57 GramDecl (49) on left: 15, on right: 1 GramHead (50) on left: 16, on right: 15 Rule (51) on left: 17, on right: 50 51 RuleBody (52) on left: 18 19 20, on right: 17 Rewrite (53) on left: 21, on right: 18 VarTfs (54) on left: 22, on right: 18 39 40 41 42 AffixString (55) on left: 23, on right: 43 RuleNew (56) on left: 24, on right: 17 Tfs (57) on left: 25, on right: 20 22 43 71 88 TypeName (58) on left: 26, on right: 25 AttSpec (59) on left: 27, on right: 25 AttVal (60) on left: 28, on right: 52 ValSpec (61) on left: 29 30 31, on right: 28 VarName (62) on left: 32, on right: 30 31 ValSetSpec (63) on left: 33, on right: 29 31 ValSet (64) on left: 34 35, on right: 33 ValDisj (65) on left: 36, on right: 34 35 ValName (66) on left: 37, on right: 36 38 ValDisjRest (67) on left: 38, on right: 54 Rhs (68) on left: 39 40 41 42, on right: 18 Affix (69) on left: 43, on right: 19 41 42 AttDefPLUS (70) on left: 44 45, on right: 2 44 ValNewPLUS (71) on left: 46 47, on right: 4 46 TypeDefPLUS (72) on left: 48 49, on right: 7 48 RulePLUS (73) on left: 50 51, on right: 15 50 AttValSTAR (74) on left: 52 53, on right: 27 52 ValDisjRestSTAR (75) on left: 54 55, on right: 36 54 AttNamePLUS (76) on left: 56 57, on right: 9 10 56 SpellDeclOPT (77) on left: 58 59, on right: 1 SpellHead (78) on left: 60, on right: 58 SpellDef (79) on left: 61, on right: 63 64 SpellNew (80) on left: 62, on right: 61 SpellDefPLUS (81) on left: 63 64, on right: 58 63 LeftContext (82) on left: 65, on right: 61 RightContext (83) on left: 66, on right: 61 Focus (84) on left: 67, on right: 61 Arrow (85) on left: 68 69 70, on right: 61 ConstraintSTAR (86) on left: 71 72, on right: 61 71 PatternPLUS (87) on left: 73 74, on right: 67 73 75 PatternSTAR (88) on left: 75 76, on right: 65 66 Pattern (89) on left: 77 78 79 80, on right: 73 74 LexDeclSTAR (90) on left: 81 82, on right: 1 LexDeclPLUS (91) on left: 83 84, on right: 81 83 LexHead (92) on left: 85, on right: 83 FirstLexHead (93) on left: 86, on right: 84 LexDef (94) on left: 87, on right: 95 CommonTfs (95) on left: 88, on right: 87 LexicalPLUS (96) on left: 89 90, on right: 87 89 Lexical (97) on left: 91, on right: 89 90 BaseFormOPTL (98) on left: 92 93, on right: 91 LexNew (99) on left: 94, on right: 91 LexDefSTAR (100) on left: 95 96, on right: 83 84 95 AlphabetDecl (101) on left: 97, on right: 1 AlphabetHead (102) on left: 98, on right: 97 AlphabetDef (103) on left: 99, on right: 97 LexicalNew (104) on left: 100, on right: 99 SurfaceNew (105) on left: 101, on right: 99 LetterNewPLUS (106) on left: 102 103, on right: 99 102 LetterNew (107) on left: 104 105, on right: 102 103 PairDeclOPT (108) on left: 106 107, on right: 1 PairHead (109) on left: 108, on right: 106 PairDefPLUS (110) on left: 109 110, on right: 106 109 PairDef (111) on left: 111, on right: 109 110 PairNew (112) on left: 112, on right: 111 PairPLUS (113) on left: 113 114, on right: 111 113 Pair (114) on left: 115 116, on right: 113 114 PairPattern (115) on left: 117 118, on right: 80 PairName (116) on left: 119, on right: 116 118 SurfSequence (117) on left: 120, on right: 115 117 LexSequence (118) on left: 121, on right: 115 117 Sequence (119) on left: 122 123 124 125, on right: 120 121 LetterSTAR (120) on left: 126 127, on right: 122 126 ClassDeclOPT (121) on left: 128 129, on right: 1 ClassHead (122) on left: 130, on right: 128 ClassDefPLUS (123) on left: 131 132, on right: 128 131 ClassDef (124) on left: 133, on right: 131 132 ClassNew (125) on left: 134, on right: 133 ClassPLUS (126) on left: 135 136, on right: 133 135 Class (127) on left: 137 138, on right: 135 136 state 0 ALPHABETS shift, and go to state 1 Start go to state 191 AlphabetDecl go to state 2 AlphabetHead go to state 3 state 1 AlphabetHead -> ALPHABETS . (rule 98) $default reduce using rule 98 (AlphabetHead) state 2 Start -> AlphabetDecl . AttDecl TypeDecl GramDecl ClassDeclOPT PairDeclOPT SpellDeclOPT LexDeclSTAR (rule 1) ATTRIBUTES shift, and go to state 4 AttDecl go to state 5 AttHead go to state 6 state 3 AlphabetDecl -> AlphabetHead . AlphabetDef (rule 97) DNAME shift, and go to state 7 AlphabetDef go to state 8 LexicalNew go to state 9 state 4 AttHead -> ATTRIBUTES . (rule 3) $default reduce using rule 3 (AttHead) state 5 Start -> AlphabetDecl AttDecl . TypeDecl GramDecl ClassDeclOPT PairDeclOPT SpellDeclOPT LexDeclSTAR (rule 1) TYPES shift, and go to state 10 TypeDecl go to state 11 TypeHead go to state 12 state 6 AttDecl -> AttHead . AttDefPLUS (rule 2) DNAME shift, and go to state 13 AttDef go to state 14 AttNew go to state 15 AttDefPLUS go to state 16 state 7 LexicalNew -> DNAME . (rule 100) $default reduce using rule 100 (LexicalNew) state 8 AlphabetDecl -> AlphabetHead AlphabetDef . (rule 97) $default reduce using rule 97 (AlphabetDecl) state 9 AlphabetDef -> LexicalNew . COLON LetterNewPLUS SurfaceNew COLON LetterNewPLUS (rule 99) COLON shift, and go to state 17 state 10 TypeHead -> TYPES . (rule 8) $default reduce using rule 8 (TypeHead) state 11 Start -> AlphabetDecl AttDecl TypeDecl . GramDecl ClassDeclOPT PairDeclOPT SpellDeclOPT LexDeclSTAR (rule 1) GRAMMAR shift, and go to state 18 GramDecl go to state 19 GramHead go to state 20 state 12 TypeDecl -> TypeHead . TypeDefPLUS (rule 7) DNAME shift, and go to state 21 TypeDef go to state 22 TypeNew go to state 23 TypeDefPLUS go to state 24 state 13 AttNew -> DNAME . (rule 5) $default reduce using rule 5 (AttNew) state 14 AttDefPLUS -> AttDef . (rule 45) $default reduce using rule 45 (AttDefPLUS) state 15 AttDef -> AttNew . COLON ValNewPLUS (rule 4) COLON shift, and go to state 25 state 16 AttDecl -> AttHead AttDefPLUS . (rule 2) AttDefPLUS -> AttDefPLUS . AttDef (rule 44) DNAME shift, and go to state 13 $default reduce using rule 2 (AttDecl) AttDef go to state 26 AttNew go to state 15 state 17 AlphabetDef -> LexicalNew COLON . LetterNewPLUS SurfaceNew COLON LetterNewPLUS (rule 99) NAME shift, and go to state 27 STRING shift, and go to state 28 LetterNewPLUS go to state 29 LetterNew go to state 30 state 18 GramHead -> GRAMMAR . (rule 16) $default reduce using rule 16 (GramHead) state 19 Start -> AlphabetDecl AttDecl TypeDecl GramDecl . ClassDeclOPT PairDeclOPT SpellDeclOPT LexDeclSTAR (rule 1) CLASSES shift, and go to state 31 $default reduce using rule 129 (ClassDeclOPT) ClassDeclOPT go to state 32 ClassHead go to state 33 state 20 GramDecl -> GramHead . RulePLUS (rule 15) DNAME shift, and go to state 34 Rule go to state 35 RuleNew go to state 36 RulePLUS go to state 37 state 21 TypeNew -> DNAME . (rule 13) $default reduce using rule 13 (TypeNew) state 22 TypeDefPLUS -> TypeDef . (rule 49) $default reduce using rule 49 (TypeDefPLUS) state 23 TypeDef -> TypeNew . COLON AttNamePLUS NoProjectAttOPTL (rule 9) COLON shift, and go to state 38 state 24 TypeDecl -> TypeHead TypeDefPLUS . (rule 7) TypeDefPLUS -> TypeDefPLUS . TypeDef (rule 48) DNAME shift, and go to state 21 $default reduce using rule 7 (TypeDecl) TypeDef go to state 39 TypeNew go to state 23 state 25 AttDef -> AttNew COLON . ValNewPLUS (rule 4) NAME shift, and go to state 40 ValNew go to state 41 ValNewPLUS go to state 42 state 26 AttDefPLUS -> AttDefPLUS AttDef . (rule 44) $default reduce using rule 44 (AttDefPLUS) state 27 LetterNew -> NAME . (rule 104) $default reduce using rule 104 (LetterNew) state 28 LetterNew -> STRING . (rule 105) $default reduce using rule 105 (LetterNew) state 29 AlphabetDef -> LexicalNew COLON LetterNewPLUS . SurfaceNew COLON LetterNewPLUS (rule 99) LetterNewPLUS -> LetterNewPLUS . LetterNew (rule 102) DNAME shift, and go to state 43 NAME shift, and go to state 27 STRING shift, and go to state 28 SurfaceNew go to state 44 LetterNew go to state 45 state 30 LetterNewPLUS -> LetterNew . (rule 103) $default reduce using rule 103 (LetterNewPLUS) state 31 ClassHead -> CLASSES . (rule 130) $default reduce using rule 130 (ClassHead) state 32 Start -> AlphabetDecl AttDecl TypeDecl GramDecl ClassDeclOPT . PairDeclOPT SpellDeclOPT LexDeclSTAR (rule 1) PAIRS shift, and go to state 46 $default reduce using rule 107 (PairDeclOPT) PairDeclOPT go to state 47 PairHead go to state 48 state 33 ClassDeclOPT -> ClassHead . ClassDefPLUS (rule 128) DNAME shift, and go to state 49 ClassDefPLUS go to state 50 ClassDef go to state 51 ClassNew go to state 52 state 34 RuleNew -> DNAME . (rule 24) $default reduce using rule 24 (RuleNew) state 35 RulePLUS -> Rule . (rule 51) $default reduce using rule 51 (RulePLUS) state 36 Rule -> RuleNew . COLON RuleBody (rule 17) COLON shift, and go to state 53 state 37 GramDecl -> GramHead RulePLUS . (rule 15) RulePLUS -> RulePLUS . Rule (rule 50) DNAME shift, and go to state 34 $default reduce using rule 15 (GramDecl) Rule go to state 54 RuleNew go to state 36 state 38 TypeDef -> TypeNew COLON . AttNamePLUS NoProjectAttOPTL (rule 9) NAME shift, and go to state 55 AttName go to state 56 AttNamePLUS go to state 57 state 39 TypeDefPLUS -> TypeDefPLUS TypeDef . (rule 48) $default reduce using rule 48 (TypeDefPLUS) state 40 ValNew -> NAME . (rule 6) $default reduce using rule 6 (ValNew) state 41 ValNewPLUS -> ValNew . (rule 47) $default reduce using rule 47 (ValNewPLUS) state 42 AttDef -> AttNew COLON ValNewPLUS . (rule 4) ValNewPLUS -> ValNewPLUS . ValNew (rule 46) NAME shift, and go to state 40 $default reduce using rule 4 (AttDef) ValNew go to state 58 state 43 SurfaceNew -> DNAME . (rule 101) $default reduce using rule 101 (SurfaceNew) state 44 AlphabetDef -> LexicalNew COLON LetterNewPLUS SurfaceNew . COLON LetterNewPLUS (rule 99) COLON shift, and go to state 59 state 45 LetterNewPLUS -> LetterNewPLUS LetterNew . (rule 102) $default reduce using rule 102 (LetterNewPLUS) state 46 PairHead -> PAIRS . (rule 108) $default reduce using rule 108 (PairHead) state 47 Start -> AlphabetDecl AttDecl TypeDecl GramDecl ClassDeclOPT PairDeclOPT . SpellDeclOPT LexDeclSTAR (rule 1) SPELLING shift, and go to state 60 $default reduce using rule 59 (SpellDeclOPT) SpellDeclOPT go to state 61 SpellHead go to state 62 state 48 PairDeclOPT -> PairHead . PairDefPLUS (rule 106) DNAME shift, and go to state 63 PairDefPLUS go to state 64 PairDef go to state 65 PairNew go to state 66 state 49 ClassNew -> DNAME . (rule 134) $default reduce using rule 134 (ClassNew) state 50 ClassDeclOPT -> ClassHead ClassDefPLUS . (rule 128) ClassDefPLUS -> ClassDefPLUS . ClassDef (rule 131) DNAME shift, and go to state 49 $default reduce using rule 128 (ClassDeclOPT) ClassDef go to state 67 ClassNew go to state 52 state 51 ClassDefPLUS -> ClassDef . (rule 132) $default reduce using rule 132 (ClassDefPLUS) state 52 ClassDef -> ClassNew . COLON ClassPLUS (rule 133) COLON shift, and go to state 68 state 53 Rule -> RuleNew COLON . RuleBody (rule 17) TNAME shift, and go to state 69 LSTRING shift, and go to state 70 RuleBody go to state 71 VarTfs go to state 72 AffixString go to state 73 Tfs go to state 74 TypeName go to state 75 Affix go to state 76 state 54 RulePLUS -> RulePLUS Rule . (rule 50) $default reduce using rule 50 (RulePLUS) state 55 AttName -> NAME . (rule 14) $default reduce using rule 14 (AttName) state 56 AttNamePLUS -> AttName . (rule 57) $default reduce using rule 57 (AttNamePLUS) state 57 TypeDef -> TypeNew COLON AttNamePLUS . NoProjectAttOPTL (rule 9) AttNamePLUS -> AttNamePLUS . AttName (rule 56) BAR shift, and go to state 77 NAME shift, and go to state 55 $default reduce using rule 11 (NoProjectAttOPTL) NoProjectAttOPTL go to state 78 ProjSep go to state 79 AttName go to state 80 state 58 ValNewPLUS -> ValNewPLUS ValNew . (rule 46) $default reduce using rule 46 (ValNewPLUS) state 59 AlphabetDef -> LexicalNew COLON LetterNewPLUS SurfaceNew COLON . LetterNewPLUS (rule 99) NAME shift, and go to state 27 STRING shift, and go to state 28 LetterNewPLUS go to state 81 LetterNew go to state 30 state 60 SpellHead -> SPELLING . (rule 60) $default reduce using rule 60 (SpellHead) state 61 Start -> AlphabetDecl AttDecl TypeDecl GramDecl ClassDeclOPT PairDeclOPT SpellDeclOPT . LexDeclSTAR (rule 1) LEXICON shift, and go to state 82 $default reduce using rule 82 (LexDeclSTAR) LexDeclSTAR go to state 83 LexDeclPLUS go to state 84 FirstLexHead go to state 85 state 62 SpellDeclOPT -> SpellHead . SpellDefPLUS (rule 58) DNAME shift, and go to state 86 SpellDef go to state 87 SpellNew go to state 88 SpellDefPLUS go to state 89 state 63 PairNew -> DNAME . (rule 112) $default reduce using rule 112 (PairNew) state 64 PairDeclOPT -> PairHead PairDefPLUS . (rule 106) PairDefPLUS -> PairDefPLUS . PairDef (rule 109) DNAME shift, and go to state 63 $default reduce using rule 106 (PairDeclOPT) PairDef go to state 90 PairNew go to state 66 state 65 PairDefPLUS -> PairDef . (rule 110) $default reduce using rule 110 (PairDefPLUS) state 66 PairDef -> PairNew . COLON PairPLUS (rule 111) COLON shift, and go to state 91 state 67 ClassDefPLUS -> ClassDefPLUS ClassDef . (rule 131) $default reduce using rule 131 (ClassDefPLUS) state 68 ClassDef -> ClassNew COLON . ClassPLUS (rule 133) NAME shift, and go to state 92 STRING shift, and go to state 93 ClassPLUS go to state 94 Class go to state 95 state 69 TypeName -> TNAME . (rule 26) $default reduce using rule 26 (TypeName) state 70 AffixString -> LSTRING . (rule 23) $default reduce using rule 23 (AffixString) state 71 Rule -> RuleNew COLON RuleBody . (rule 17) $default reduce using rule 17 (Rule) state 72 RuleBody -> VarTfs . Rewrite Rhs (rule 18) LARROW shift, and go to state 96 Rewrite go to state 97 state 73 Affix -> AffixString . Tfs (rule 43) TNAME shift, and go to state 69 Tfs go to state 98 TypeName go to state 75 state 74 RuleBody -> Tfs . (rule 20) VarTfs -> Tfs . (rule 22) LARROW reduce using rule 22 (VarTfs) $default reduce using rule 20 (RuleBody) state 75 Tfs -> TypeName . AttSpec (rule 25) LBRA shift, and go to state 99 AttSpec go to state 100 state 76 RuleBody -> Affix . (rule 19) $default reduce using rule 19 (RuleBody) state 77 ProjSep -> BAR . (rule 12) $default reduce using rule 12 (ProjSep) state 78 TypeDef -> TypeNew COLON AttNamePLUS NoProjectAttOPTL . (rule 9) $default reduce using rule 9 (TypeDef) state 79 NoProjectAttOPTL -> ProjSep . AttNamePLUS (rule 10) NAME shift, and go to state 55 AttName go to state 56 AttNamePLUS go to state 101 state 80 AttNamePLUS -> AttNamePLUS AttName . (rule 56) $default reduce using rule 56 (AttNamePLUS) state 81 AlphabetDef -> LexicalNew COLON LetterNewPLUS SurfaceNew COLON LetterNewPLUS . (rule 99) LetterNewPLUS -> LetterNewPLUS . LetterNew (rule 102) NAME shift, and go to state 27 STRING shift, and go to state 28 $default reduce using rule 99 (AlphabetDef) LetterNew go to state 45 state 82 FirstLexHead -> LEXICON . (rule 86) $default reduce using rule 86 (FirstLexHead) state 83 Start -> AlphabetDecl AttDecl TypeDecl GramDecl ClassDeclOPT PairDeclOPT SpellDeclOPT LexDeclSTAR . (rule 1) $default reduce using rule 1 (Start) state 84 LexDeclSTAR -> LexDeclPLUS . (rule 81) LexDeclPLUS -> LexDeclPLUS . LexHead LexDefSTAR (rule 83) LEXICON shift, and go to state 102 $default reduce using rule 81 (LexDeclSTAR) LexHead go to state 103 state 85 LexDeclPLUS -> FirstLexHead . LexDefSTAR (rule 84) $default reduce using rule 96 (LexDefSTAR) LexDefSTAR go to state 104 state 86 SpellNew -> DNAME . (rule 62) $default reduce using rule 62 (SpellNew) state 87 SpellDefPLUS -> SpellDef . (rule 64) $default reduce using rule 64 (SpellDefPLUS) state 88 SpellDef -> SpellNew . COLON Arrow LeftContext Focus RightContext ConstraintSTAR (rule 61) COLON shift, and go to state 105 state 89 SpellDeclOPT -> SpellHead SpellDefPLUS . (rule 58) SpellDefPLUS -> SpellDefPLUS . SpellDef (rule 63) DNAME shift, and go to state 86 $default reduce using rule 58 (SpellDeclOPT) SpellDef go to state 106 SpellNew go to state 88 state 90 PairDefPLUS -> PairDefPLUS PairDef . (rule 109) $default reduce using rule 109 (PairDefPLUS) state 91 PairDef -> PairNew COLON . PairPLUS (rule 111) ANY shift, and go to state 107 LANGLE shift, and go to state 108 NAME shift, and go to state 109 LSTRING shift, and go to state 110 PairPLUS go to state 111 Pair go to state 112 PairName go to state 113 SurfSequence go to state 114 Sequence go to state 115 state 92 Class -> NAME . (rule 137) $default reduce using rule 137 (Class) state 93 Class -> STRING . (rule 138) $default reduce using rule 138 (Class) state 94 ClassDef -> ClassNew COLON ClassPLUS . (rule 133) ClassPLUS -> ClassPLUS . Class (rule 135) NAME shift, and go to state 92 STRING shift, and go to state 93 $default reduce using rule 133 (ClassDef) Class go to state 116 state 95 ClassPLUS -> Class . (rule 136) $default reduce using rule 136 (ClassPLUS) state 96 Rewrite -> LARROW . (rule 21) $default reduce using rule 21 (Rewrite) state 97 RuleBody -> VarTfs Rewrite . Rhs (rule 18) TNAME shift, and go to state 69 LSTRING shift, and go to state 70 VarTfs go to state 117 AffixString go to state 73 Tfs go to state 118 TypeName go to state 75 Rhs go to state 119 Affix go to state 120 state 98 Affix -> AffixString Tfs . (rule 43) $default reduce using rule 43 (Affix) state 99 AttSpec -> LBRA . AttValSTAR RBRA (rule 27) $default reduce using rule 53 (AttValSTAR) AttValSTAR go to state 121 state 100 Tfs -> TypeName AttSpec . (rule 25) $default reduce using rule 25 (Tfs) state 101 NoProjectAttOPTL -> ProjSep AttNamePLUS . (rule 10) AttNamePLUS -> AttNamePLUS . AttName (rule 56) NAME shift, and go to state 55 $default reduce using rule 10 (NoProjectAttOPTL) AttName go to state 80 state 102 LexHead -> LEXICON . (rule 85) $default reduce using rule 85 (LexHead) state 103 LexDeclPLUS -> LexDeclPLUS LexHead . LexDefSTAR (rule 83) $default reduce using rule 96 (LexDefSTAR) LexDefSTAR go to state 122 state 104 LexDeclPLUS -> FirstLexHead LexDefSTAR . (rule 84) LexDefSTAR -> LexDefSTAR . LexDef (rule 95) TNAME shift, and go to state 69 $default reduce using rule 84 (LexDeclPLUS) Tfs go to state 123 TypeName go to state 75 LexDef go to state 124 CommonTfs go to state 125 state 105 SpellDef -> SpellNew COLON . Arrow LeftContext Focus RightContext ConstraintSTAR (rule 61) BIARROW shift, and go to state 126 RARROW shift, and go to state 127 COERCEARROW shift, and go to state 128 Arrow go to state 129 state 106 SpellDefPLUS -> SpellDefPLUS SpellDef . (rule 63) $default reduce using rule 63 (SpellDefPLUS) state 107 Sequence -> ANY . (rule 125) $default reduce using rule 125 (Sequence) state 108 Sequence -> LANGLE . LetterSTAR RANGLE (rule 122) $default reduce using rule 127 (LetterSTAR) LetterSTAR go to state 130 state 109 PairName -> NAME . (rule 119) Sequence -> NAME . (rule 124) SLASH reduce using rule 124 (Sequence) $default reduce using rule 119 (PairName) state 110 Sequence -> LSTRING . (rule 123) $default reduce using rule 123 (Sequence) state 111 PairDef -> PairNew COLON PairPLUS . (rule 111) PairPLUS -> PairPLUS . Pair (rule 113) ANY shift, and go to state 107 LANGLE shift, and go to state 108 NAME shift, and go to state 109 LSTRING shift, and go to state 110 $default reduce using rule 111 (PairDef) Pair go to state 131 PairName go to state 113 SurfSequence go to state 114 Sequence go to state 115 state 112 PairPLUS -> Pair . (rule 114) $default reduce using rule 114 (PairPLUS) state 113 Pair -> PairName . (rule 116) $default reduce using rule 116 (Pair) state 114 Pair -> SurfSequence . SLASH LexSequence (rule 115) SLASH shift, and go to state 132 state 115 SurfSequence -> Sequence . (rule 120) $default reduce using rule 120 (SurfSequence) state 116 ClassPLUS -> ClassPLUS Class . (rule 135) $default reduce using rule 135 (ClassPLUS) state 117 Rhs -> VarTfs . (rule 39) Rhs -> VarTfs . VarTfs (rule 40) Rhs -> VarTfs . Affix (rule 42) TNAME shift, and go to state 69 LSTRING shift, and go to state 70 $default reduce using rule 39 (Rhs) VarTfs go to state 133 AffixString go to state 73 Tfs go to state 118 TypeName go to state 75 Affix go to state 134 state 118 VarTfs -> Tfs . (rule 22) $default reduce using rule 22 (VarTfs) state 119 RuleBody -> VarTfs Rewrite Rhs . (rule 18) $default reduce using rule 18 (RuleBody) state 120 Rhs -> Affix . VarTfs (rule 41) TNAME shift, and go to state 69 VarTfs go to state 135 Tfs go to state 118 TypeName go to state 75 state 121 AttSpec -> LBRA AttValSTAR . RBRA (rule 27) AttValSTAR -> AttValSTAR . AttVal (rule 52) RBRA shift, and go to state 136 NAME shift, and go to state 55 AttName go to state 137 AttVal go to state 138 state 122 LexDeclPLUS -> LexDeclPLUS LexHead LexDefSTAR . (rule 83) LexDefSTAR -> LexDefSTAR . LexDef (rule 95) TNAME shift, and go to state 69 $default reduce using rule 83 (LexDeclPLUS) Tfs go to state 123 TypeName go to state 75 LexDef go to state 124 CommonTfs go to state 125 state 123 CommonTfs -> Tfs . (rule 88) $default reduce using rule 88 (CommonTfs) state 124 LexDefSTAR -> LexDefSTAR LexDef . (rule 95) $default reduce using rule 95 (LexDefSTAR) state 125 LexDef -> CommonTfs . LexicalPLUS (rule 87) LSTRING shift, and go to state 139 LexicalPLUS go to state 140 Lexical go to state 141 LexNew go to state 142 state 126 Arrow -> BIARROW . (rule 69) $default reduce using rule 69 (Arrow) state 127 Arrow -> RARROW . (rule 68) $default reduce using rule 68 (Arrow) state 128 Arrow -> COERCEARROW . (rule 70) $default reduce using rule 70 (Arrow) state 129 SpellDef -> SpellNew COLON Arrow . LeftContext Focus RightContext ConstraintSTAR (rule 61) ANY shift, and go to state 107 WORDBOUNDARY shift, and go to state 143 CONCATBOUNDARY shift, and go to state 144 MORPHEMEBOUNDARY shift, and go to state 145 LANGLE shift, and go to state 108 NAME shift, and go to state 109 LSTRING shift, and go to state 110 $default reduce using rule 76 (PatternSTAR) LeftContext go to state 146 PatternPLUS go to state 147 PatternSTAR go to state 148 Pattern go to state 149 PairPattern go to state 150 PairName go to state 151 SurfSequence go to state 152 Sequence go to state 115 state 130 Sequence -> LANGLE LetterSTAR . RANGLE (rule 122) LetterSTAR -> LetterSTAR . NAME (rule 126) RANGLE shift, and go to state 153 NAME shift, and go to state 154 state 131 PairPLUS -> PairPLUS Pair . (rule 113) $default reduce using rule 113 (PairPLUS) state 132 Pair -> SurfSequence SLASH . LexSequence (rule 115) ANY shift, and go to state 107 LANGLE shift, and go to state 108 NAME shift, and go to state 155 LSTRING shift, and go to state 110 LexSequence go to state 156 Sequence go to state 157 state 133 Rhs -> VarTfs VarTfs . (rule 40) $default reduce using rule 40 (Rhs) state 134 Rhs -> VarTfs Affix . (rule 42) $default reduce using rule 42 (Rhs) state 135 Rhs -> Affix VarTfs . (rule 41) $default reduce using rule 41 (Rhs) state 136 AttSpec -> LBRA AttValSTAR RBRA . (rule 27) $default reduce using rule 27 (AttSpec) state 137 AttVal -> AttName . ValSpec (rule 28) EQUAL shift, and go to state 158 NOTEQUAL shift, and go to state 159 ValSpec go to state 160 ValSetSpec go to state 161 ValSet go to state 162 state 138 AttValSTAR -> AttValSTAR AttVal . (rule 52) $default reduce using rule 52 (AttValSTAR) state 139 LexNew -> LSTRING . (rule 94) $default reduce using rule 94 (LexNew) state 140 LexDef -> CommonTfs LexicalPLUS . (rule 87) LexicalPLUS -> LexicalPLUS . Lexical (rule 89) LSTRING shift, and go to state 139 $default reduce using rule 87 (LexDef) Lexical go to state 163 LexNew go to state 142 state 141 LexicalPLUS -> Lexical . (rule 90) $default reduce using rule 90 (LexicalPLUS) state 142 Lexical -> LexNew . BaseFormOPTL (rule 91) EQUAL shift, and go to state 164 $default reduce using rule 93 (BaseFormOPTL) BaseFormOPTL go to state 165 state 143 Pattern -> WORDBOUNDARY . (rule 79) $default reduce using rule 79 (Pattern) state 144 Pattern -> CONCATBOUNDARY . (rule 77) $default reduce using rule 77 (Pattern) state 145 Pattern -> MORPHEMEBOUNDARY . (rule 78) $default reduce using rule 78 (Pattern) state 146 SpellDef -> SpellNew COLON Arrow LeftContext . Focus RightContext ConstraintSTAR (rule 61) CONTEXTBOUNDARY shift, and go to state 166 Focus go to state 167 state 147 PatternPLUS -> PatternPLUS . Pattern (rule 73) PatternSTAR -> PatternPLUS . (rule 75) ANY shift, and go to state 107 WORDBOUNDARY shift, and go to state 143 CONCATBOUNDARY shift, and go to state 144 MORPHEMEBOUNDARY shift, and go to state 145 LANGLE shift, and go to state 108 NAME shift, and go to state 109 LSTRING shift, and go to state 110 $default reduce using rule 75 (PatternSTAR) Pattern go to state 168 PairPattern go to state 150 PairName go to state 151 SurfSequence go to state 152 Sequence go to state 115 state 148 LeftContext -> PatternSTAR . (rule 65) $default reduce using rule 65 (LeftContext) state 149 PatternPLUS -> Pattern . (rule 74) $default reduce using rule 74 (PatternPLUS) state 150 Pattern -> PairPattern . (rule 80) $default reduce using rule 80 (Pattern) state 151 PairPattern -> PairName . (rule 118) $default reduce using rule 118 (PairPattern) state 152 PairPattern -> SurfSequence . SLASH LexSequence (rule 117) SLASH shift, and go to state 169 state 153 Sequence -> LANGLE LetterSTAR RANGLE . (rule 122) $default reduce using rule 122 (Sequence) state 154 LetterSTAR -> LetterSTAR NAME . (rule 126) $default reduce using rule 126 (LetterSTAR) state 155 Sequence -> NAME . (rule 124) $default reduce using rule 124 (Sequence) state 156 Pair -> SurfSequence SLASH LexSequence . (rule 115) $default reduce using rule 115 (Pair) state 157 LexSequence -> Sequence . (rule 121) $default reduce using rule 121 (LexSequence) state 158 ValSpec -> EQUAL . DOLLAR VarName (rule 30) ValSpec -> EQUAL . DOLLAR VarName ValSetSpec (rule 31) ValSet -> EQUAL . ValDisj (rule 35) DOLLAR shift, and go to state 170 NAME shift, and go to state 171 ValDisj go to state 172 ValName go to state 173 state 159 ValSet -> NOTEQUAL . ValDisj (rule 34) NAME shift, and go to state 171 ValDisj go to state 174 ValName go to state 173 state 160 AttVal -> AttName ValSpec . (rule 28) $default reduce using rule 28 (AttVal) state 161 ValSpec -> ValSetSpec . (rule 29) $default reduce using rule 29 (ValSpec) state 162 ValSetSpec -> ValSet . (rule 33) $default reduce using rule 33 (ValSetSpec) state 163 LexicalPLUS -> LexicalPLUS Lexical . (rule 89) $default reduce using rule 89 (LexicalPLUS) state 164 BaseFormOPTL -> EQUAL . LSTRING (rule 92) LSTRING shift, and go to state 175 state 165 Lexical -> LexNew BaseFormOPTL . (rule 91) $default reduce using rule 91 (Lexical) state 166 Focus -> CONTEXTBOUNDARY . PatternPLUS CONTEXTBOUNDARY (rule 67) ANY shift, and go to state 107 WORDBOUNDARY shift, and go to state 143 CONCATBOUNDARY shift, and go to state 144 MORPHEMEBOUNDARY shift, and go to state 145 LANGLE shift, and go to state 108 NAME shift, and go to state 109 LSTRING shift, and go to state 110 PatternPLUS go to state 176 Pattern go to state 149 PairPattern go to state 150 PairName go to state 151 SurfSequence go to state 152 Sequence go to state 115 state 167 SpellDef -> SpellNew COLON Arrow LeftContext Focus . RightContext ConstraintSTAR (rule 61) ANY shift, and go to state 107 WORDBOUNDARY shift, and go to state 143 CONCATBOUNDARY shift, and go to state 144 MORPHEMEBOUNDARY shift, and go to state 145 LANGLE shift, and go to state 108 NAME shift, and go to state 109 LSTRING shift, and go to state 110 $default reduce using rule 76 (PatternSTAR) RightContext go to state 177 PatternPLUS go to state 147 PatternSTAR go to state 178 Pattern go to state 149 PairPattern go to state 150 PairName go to state 151 SurfSequence go to state 152 Sequence go to state 115 state 168 PatternPLUS -> PatternPLUS Pattern . (rule 73) $default reduce using rule 73 (PatternPLUS) state 169 PairPattern -> SurfSequence SLASH . LexSequence (rule 117) ANY shift, and go to state 107 LANGLE shift, and go to state 108 NAME shift, and go to state 155 LSTRING shift, and go to state 110 LexSequence go to state 179 Sequence go to state 157 state 170 ValSpec -> EQUAL DOLLAR . VarName (rule 30) ValSpec -> EQUAL DOLLAR . VarName ValSetSpec (rule 31) NAME shift, and go to state 180 VarName go to state 181 state 171 ValName -> NAME . (rule 37) $default reduce using rule 37 (ValName) state 172 ValSet -> EQUAL ValDisj . (rule 35) $default reduce using rule 35 (ValSet) state 173 ValDisj -> ValName . ValDisjRestSTAR (rule 36) $default reduce using rule 55 (ValDisjRestSTAR) ValDisjRestSTAR go to state 182 state 174 ValSet -> NOTEQUAL ValDisj . (rule 34) $default reduce using rule 34 (ValSet) state 175 BaseFormOPTL -> EQUAL LSTRING . (rule 92) $default reduce using rule 92 (BaseFormOPTL) state 176 Focus -> CONTEXTBOUNDARY PatternPLUS . CONTEXTBOUNDARY (rule 67) PatternPLUS -> PatternPLUS . Pattern (rule 73) ANY shift, and go to state 107 WORDBOUNDARY shift, and go to state 143 CONTEXTBOUNDARY shift, and go to state 183 CONCATBOUNDARY shift, and go to state 144 MORPHEMEBOUNDARY shift, and go to state 145 LANGLE shift, and go to state 108 NAME shift, and go to state 109 LSTRING shift, and go to state 110 Pattern go to state 168 PairPattern go to state 150 PairName go to state 151 SurfSequence go to state 152 Sequence go to state 115 state 177 SpellDef -> SpellNew COLON Arrow LeftContext Focus RightContext . ConstraintSTAR (rule 61) $default reduce using rule 72 (ConstraintSTAR) ConstraintSTAR go to state 184 state 178 RightContext -> PatternSTAR . (rule 66) $default reduce using rule 66 (RightContext) state 179 PairPattern -> SurfSequence SLASH LexSequence . (rule 117) $default reduce using rule 117 (PairPattern) state 180 VarName -> NAME . (rule 32) $default reduce using rule 32 (VarName) state 181 ValSpec -> EQUAL DOLLAR VarName . (rule 30) ValSpec -> EQUAL DOLLAR VarName . ValSetSpec (rule 31) EQUAL shift, and go to state 185 NOTEQUAL shift, and go to state 159 $default reduce using rule 30 (ValSpec) ValSetSpec go to state 186 ValSet go to state 162 state 182 ValDisj -> ValName ValDisjRestSTAR . (rule 36) ValDisjRestSTAR -> ValDisjRestSTAR . ValDisjRest (rule 54) BAR shift, and go to state 187 $default reduce using rule 36 (ValDisj) ValDisjRest go to state 188 state 183 Focus -> CONTEXTBOUNDARY PatternPLUS CONTEXTBOUNDARY . (rule 67) $default reduce using rule 67 (Focus) state 184 SpellDef -> SpellNew COLON Arrow LeftContext Focus RightContext ConstraintSTAR . (rule 61) ConstraintSTAR -> ConstraintSTAR . Tfs (rule 71) TNAME shift, and go to state 69 $default reduce using rule 61 (SpellDef) Tfs go to state 189 TypeName go to state 75 state 185 ValSet -> EQUAL . ValDisj (rule 35) NAME shift, and go to state 171 ValDisj go to state 172 ValName go to state 173 state 186 ValSpec -> EQUAL DOLLAR VarName ValSetSpec . (rule 31) $default reduce using rule 31 (ValSpec) state 187 ValDisjRest -> BAR . ValName (rule 38) NAME shift, and go to state 171 ValName go to state 190 state 188 ValDisjRestSTAR -> ValDisjRestSTAR ValDisjRest . (rule 54) $default reduce using rule 54 (ValDisjRestSTAR) state 189 ConstraintSTAR -> ConstraintSTAR Tfs . (rule 71) $default reduce using rule 71 (ConstraintSTAR) state 190 ValDisjRest -> BAR ValName . (rule 38) $default reduce using rule 38 (ValDisjRest) state 191 $ go to state 192 state 192 $ go to state 193 state 193 $default accept mmorph-2.3.4.2.orig/user.tab.c0100644000175000001440000020557606313321341015047 0ustar mvelausers /* A Bison parser, made from user.y by GNU Bison version 1.25 */ #define YYBISON 1 /* Identify Bison output. */ #define ANY 258 #define BAR 259 #define BIARROW 260 #define WORDBOUNDARY 261 #define CONTEXTBOUNDARY 262 #define CONCATBOUNDARY 263 #define MORPHEMEBOUNDARY 264 #define DOLLAR 265 #define EQUAL 266 #define LANGLE 267 #define LARROW 268 #define LBRA 269 #define NOTEQUAL 270 #define RANGLE 271 #define RARROW 272 #define RBRA 273 #define COERCEARROW 274 #define COLON 275 #define SLASH 276 #define ALPHABETS 277 #define ATTRIBUTES 278 #define CLASSES 279 #define GRAMMAR 280 #define LEXICON 281 #define PAIRS 282 #define SPELLING 283 #define TYPES 284 #define DNAME 285 #define NAME 286 #define STRING 287 #define SNAME 288 #define TNAME 289 #define LSTRING 290 #line 1 "user.y" /* mmorph, MULTEXT morphology tool Version 2.3, October 1995 Copyright (c) 1994,1995 ISSCO/SUISSETRA, Geneva, Switzerland Dominique Petitpierre, */ #include "user.h" #include "parse.h" s_symbol *defined_symbol; static s_symbol *largest_type_sym; static t_card largest_type_card; e_symbol_kind defined_kind; static s_symbol_set *value_set; static s_symbol_set *variable_set; static t_boolean variable_allowed; static s_symbol *current_attribute; static s_type *current_type; static s_rule *current_rule; static s_tfs *current_tfs; static s_tfs *common_tfs; static s_chain *current_chain; static s_chain *affix_tree_chain; static int var_map_card; static t_letter *current_string; static t_letter *current_base_form; e_symbol_kind current_letter_kind; static s_pair *current_pair; static t_flag class_flags; static t_flag current_pair_flags; static int current_pair_width; static s_bitmap *current_class; static s_symbol fake_symbol; /* used for pointing defined_symbol to */ static s_spell_instance *current_spell; static s_bitmap *current_lexical_set; static int current_pattern_length; static s_chain *current_pattern; static t_boolean within_focus; static t_boolean has_concat_pos; #define LETTER_STRING_SIZE_MAX 128 static t_letter letter_string[LETTER_STRING_SIZE_MAX]; /* temp storage */ static int letter_string_size; /* size of data in letter_string */ #line 47 "user.y" typedef union { t_str string; s_symbol *symbol; s_chain *chain; t_value value; s_tfs *tfs; s_var_map *var_map; t_letter *letter_string; s_pair *pair; } YYSTYPE; #ifndef YYDEBUG #define YYDEBUG 1 #endif #include #ifndef __cplusplus #ifndef __STDC__ #define const #endif #endif #define YYFINAL 193 #define YYFLAG -32768 #define YYNTBASE 36 #define YYTRANSLATE(x) ((unsigned)(x) <= 290 ? yytranslate[x] : 128) static const char yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 }; #if YYDEBUG != 0 static const short yyprhs[] = { 0, 0, 9, 12, 14, 18, 20, 22, 25, 27, 32, 35, 36, 38, 40, 42, 45, 47, 51, 55, 57, 59, 61, 63, 65, 67, 70, 72, 76, 79, 81, 85, 90, 92, 94, 97, 100, 103, 105, 108, 110, 113, 116, 119, 122, 125, 127, 130, 132, 135, 137, 140, 142, 145, 146, 149, 150, 153, 155, 158, 159, 161, 169, 171, 174, 176, 178, 180, 184, 186, 188, 190, 193, 194, 197, 199, 201, 202, 204, 206, 208, 210, 212, 213, 217, 220, 222, 224, 227, 229, 232, 234, 237, 240, 241, 243, 246, 247, 250, 252, 259, 261, 263, 266, 268, 270, 272, 275, 276, 278, 281, 283, 287, 289, 292, 294, 298, 300, 304, 306, 308, 310, 312, 316, 318, 320, 322, 325, 326, 329, 330, 332, 335, 337, 341, 343, 346, 348, 350 }; static const short yyrhs[] = { 101, 37, 42, 49, 121, 108, 77, 90, 0, 38, 70, 0, 23, 0, 40, 20, 71, 0, 30, 0, 31, 0, 43, 72, 0, 29, 0, 47, 20, 76, 45, 0, 46, 76, 0, 0, 4, 0, 30, 0, 31, 0, 50, 73, 0, 25, 0, 56, 20, 52, 0, 54, 53, 68, 0, 69, 0, 57, 0, 13, 0, 57, 0, 35, 0, 30, 0, 58, 59, 0, 34, 0, 14, 74, 18, 0, 48, 61, 0, 63, 0, 11, 10, 62, 0, 11, 10, 62, 63, 0, 31, 0, 64, 0, 15, 65, 0, 11, 65, 0, 66, 75, 0, 31, 0, 4, 66, 0, 54, 0, 54, 54, 0, 69, 54, 0, 54, 69, 0, 55, 57, 0, 70, 39, 0, 39, 0, 71, 41, 0, 41, 0, 72, 44, 0, 44, 0, 73, 51, 0, 51, 0, 74, 60, 0, 0, 75, 67, 0, 0, 76, 48, 0, 48, 0, 78, 81, 0, 0, 28, 0, 80, 20, 85, 82, 84, 83, 86, 0, 30, 0, 81, 79, 0, 79, 0, 88, 0, 88, 0, 7, 87, 7, 0, 17, 0, 5, 0, 19, 0, 86, 57, 0, 0, 87, 89, 0, 89, 0, 87, 0, 0, 8, 0, 9, 0, 6, 0, 115, 0, 91, 0, 0, 91, 92, 100, 0, 93, 100, 0, 26, 0, 26, 0, 95, 96, 0, 57, 0, 96, 97, 0, 97, 0, 99, 98, 0, 11, 35, 0, 0, 35, 0, 100, 94, 0, 0, 102, 103, 0, 22, 0, 104, 20, 106, 105, 20, 106, 0, 30, 0, 30, 0, 106, 107, 0, 107, 0, 31, 0, 32, 0, 109, 110, 0, 0, 27, 0, 110, 111, 0, 111, 0, 112, 20, 113, 0, 30, 0, 113, 114, 0, 114, 0, 117, 21, 118, 0, 116, 0, 117, 21, 118, 0, 116, 0, 31, 0, 119, 0, 119, 0, 12, 120, 16, 0, 35, 0, 31, 0, 3, 0, 120, 31, 0, 0, 122, 123, 0, 0, 24, 0, 123, 124, 0, 124, 0, 125, 20, 126, 0, 30, 0, 126, 127, 0, 127, 0, 31, 0, 32, 0 }; #endif #if YYDEBUG != 0 static const short yyrline[] = { 0, 141, 148, 157, 165, 173, 183, 191, 213, 222, 240, 243, 248, 254, 264, 272, 283, 293, 299, 305, 311, 325, 331, 337, 344, 353, 368, 381, 387, 393, 397, 401, 407, 439, 456, 463, 469, 475, 482, 488, 494, 500, 506, 514, 523, 527, 533, 537, 543, 547, 553, 557, 563, 569, 576, 580, 586, 594, 604, 614, 619, 627, 646, 665, 669, 675, 687, 694, 706, 710, 714, 721, 726, 733, 736, 741, 744, 749, 760, 767, 774, 783, 786, 791, 795, 800, 805, 823, 833, 846, 849, 854, 879, 884, 890, 896, 900, 906, 913, 950, 961, 974, 989, 992, 997, 1012, 1035, 1043, 1048, 1056, 1060, 1065, 1071, 1085, 1088, 1093, 1121, 1141, 1162, 1171, 1183, 1191, 1199, 1204, 1208, 1233, 1239, 1247, 1254, 1262, 1266, 1274, 1277, 1282, 1300, 1308, 1311, 1316, 1359 }; #endif #if YYDEBUG != 0 || defined (YYERROR_VERBOSE) static const char * const yytname[] = { "$","error","$undefined.","ANY","BAR", "BIARROW","WORDBOUNDARY","CONTEXTBOUNDARY","CONCATBOUNDARY","MORPHEMEBOUNDARY", "DOLLAR","EQUAL","LANGLE","LARROW","LBRA","NOTEQUAL","RANGLE","RARROW","RBRA", "COERCEARROW","COLON","SLASH","ALPHABETS","ATTRIBUTES","CLASSES","GRAMMAR","LEXICON", "PAIRS","SPELLING","TYPES","DNAME","NAME","STRING","SNAME","TNAME","LSTRING", "Start","AttDecl","AttHead","AttDef","AttNew","ValNew","TypeDecl","TypeHead", "TypeDef","NoProjectAttOPTL","ProjSep","TypeNew","AttName","GramDecl","GramHead", "Rule","RuleBody","Rewrite","VarTfs","AffixString","RuleNew","Tfs","TypeName", "AttSpec","AttVal","ValSpec","VarName","ValSetSpec","ValSet","ValDisj","ValName", "ValDisjRest","Rhs","Affix","AttDefPLUS","ValNewPLUS","TypeDefPLUS","RulePLUS", "AttValSTAR","ValDisjRestSTAR","AttNamePLUS","SpellDeclOPT","SpellHead","SpellDef", "SpellNew","SpellDefPLUS","LeftContext","RightContext","Focus","Arrow","ConstraintSTAR", "PatternPLUS","PatternSTAR","Pattern","LexDeclSTAR","LexDeclPLUS","LexHead", "FirstLexHead","LexDef","CommonTfs","LexicalPLUS","Lexical","BaseFormOPTL","LexNew", "LexDefSTAR","AlphabetDecl","AlphabetHead","AlphabetDef","LexicalNew","SurfaceNew", "LetterNewPLUS","LetterNew","PairDeclOPT","PairHead","PairDefPLUS","PairDef", "PairNew","PairPLUS","Pair","PairPattern","PairName","SurfSequence","LexSequence", "Sequence","LetterSTAR","ClassDeclOPT","ClassHead","ClassDefPLUS","ClassDef", "ClassNew","ClassPLUS","Class", NULL }; #endif static const short yyr1[] = { 0, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 52, 52, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 61, 61, 62, 63, 64, 64, 65, 66, 67, 68, 68, 68, 68, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 89, 89, 90, 90, 91, 91, 92, 93, 94, 95, 96, 96, 97, 98, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 106, 107, 107, 108, 108, 109, 110, 110, 111, 112, 113, 113, 114, 114, 115, 115, 116, 117, 118, 119, 119, 119, 119, 120, 120, 121, 121, 122, 123, 123, 124, 125, 126, 126, 127, 127 }; static const short yyr2[] = { 0, 8, 2, 1, 3, 1, 1, 2, 1, 4, 2, 0, 1, 1, 1, 2, 1, 3, 3, 1, 1, 1, 1, 1, 1, 2, 1, 3, 2, 1, 3, 4, 1, 1, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2, 1, 2, 0, 1, 7, 1, 2, 1, 1, 1, 3, 1, 1, 1, 2, 0, 2, 1, 1, 0, 1, 1, 1, 1, 1, 0, 3, 2, 1, 1, 2, 1, 2, 1, 2, 2, 0, 1, 2, 0, 2, 1, 6, 1, 1, 2, 1, 1, 1, 2, 0, 1, 2, 1, 3, 1, 2, 1, 3, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, 2, 0, 2, 0, 1, 2, 1, 3, 1, 2, 1, 1, 1 }; static const short yydefact[] = { 0, 98, 0, 0, 3, 0, 0, 100, 97, 0, 8, 0, 0, 5, 45, 0, 2, 0, 16, 129, 0, 13, 49, 0, 7, 0, 44, 104, 105, 0, 103, 130, 107, 0, 24, 51, 0, 15, 0, 48, 6, 47, 4, 101, 0, 102, 108, 59, 0, 134, 128, 132, 0, 0, 50, 14, 57, 11, 46, 0, 60, 82, 0, 112, 106, 110, 0, 131, 0, 26, 23, 17, 0, 0, 20, 0, 19, 12, 9, 0, 56, 99, 86, 1, 81, 96, 62, 64, 0, 58, 109, 0, 137, 138, 133, 136, 21, 0, 43, 53, 25, 10, 85, 96, 84, 0, 63, 125, 127, 119, 123, 111, 114, 116, 0, 120, 135, 39, 22, 18, 0, 0, 83, 88, 95, 0, 69, 68, 70, 76, 0, 113, 0, 40, 42, 41, 27, 0, 52, 94, 87, 90, 93, 79, 77, 78, 0, 75, 65, 74, 80, 118, 0, 122, 126, 124, 115, 121, 0, 0, 28, 29, 33, 89, 0, 91, 0, 76, 73, 0, 0, 37, 35, 55, 34, 92, 0, 72, 66, 117, 32, 30, 36, 67, 61, 0, 31, 0, 54, 71, 38, 0, 0, 0 }; static const short yydefgoto[] = { 191, 5, 6, 14, 15, 41, 11, 12, 22, 78, 79, 23, 56, 19, 20, 35, 71, 97, 72, 73, 36, 118, 75, 100, 138, 160, 181, 161, 162, 172, 173, 188, 119, 76, 16, 42, 24, 37, 121, 182, 57, 61, 62, 87, 88, 89, 146, 177, 167, 129, 184, 147, 148, 149, 83, 84, 103, 85, 124, 125, 140, 141, 165, 142, 104, 2, 3, 8, 9, 44, 29, 30, 47, 48, 64, 65, 66, 111, 112, 150, 151, 152, 156, 115, 130, 32, 33, 50, 51, 52, 94, 95 }; static const short yypact[] = { 7, -32768, 35, -6,-32768, 6, 26,-32768,-32768, 53,-32768, 38, 46,-32768,-32768, 57, 26, 29,-32768, 54, 49, -32768,-32768, 60, 46, 50,-32768,-32768,-32768, 40,-32768, -32768, 55, 56,-32768,-32768, 63, 49, 58,-32768,-32768, -32768, 50,-32768, 64,-32768,-32768, 59, 61,-32768, 56, -32768, 65, 33,-32768,-32768,-32768, 19,-32768, 29,-32768, 62, 66,-32768, 61,-32768, 70,-32768, 43,-32768,-32768, -32768, 79, 67, 80, 81,-32768,-32768,-32768, 58,-32768, 29,-32768,-32768, 68,-32768,-32768,-32768, 77, 66,-32768, 2,-32768,-32768, 43,-32768,-32768, 33,-32768,-32768,-32768, 58,-32768,-32768, 67, 47,-32768,-32768,-32768, 78,-32768, 2,-32768,-32768, 82,-32768,-32768, 33,-32768,-32768, 67, -1, 67,-32768,-32768, 69,-32768,-32768,-32768, 13, 12, -32768, 3,-32768,-32768,-32768,-32768, 42,-32768,-32768, 69, -32768, 87,-32768,-32768,-32768, 93, 13,-32768,-32768,-32768, -32768, 84,-32768,-32768,-32768,-32768,-32768, 8, 71,-32768, -32768,-32768,-32768, 72,-32768, 13, 13,-32768, 3, 75, -32768,-32768,-32768,-32768,-32768, 1,-32768,-32768,-32768,-32768, 44, 104,-32768, 67, 71,-32768, 71,-32768,-32768,-32768, 109, 110,-32768 }; static const short yypgoto[] = {-32768, -32768,-32768, 95,-32768, 73,-32768,-32768, 88,-32768,-32768, -32768, -56,-32768,-32768, 76,-32768,-32768, -71,-32768,-32768, -53,-32768,-32768,-32768,-32768,-32768, -67,-32768, -43, -70, -32768,-32768, -86,-32768,-32768,-32768,-32768,-32768,-32768, 39, -32768,-32768, 30,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -46, -45, -135,-32768,-32768,-32768,-32768,-32768,-32768,-32768, -19,-32768,-32768, 20,-32768,-32768,-32768,-32768,-32768, 74, -27,-32768,-32768,-32768, 83,-32768,-32768, 14,-32768, -64, -49, -42, -129,-32768,-32768,-32768,-32768, 85,-32768,-32768, 32 }; #define YYLAST 147 static const short yytable[] = { 74, 80, 45, 157, 107, 107, 107, 143, 183, 144, 145, 120, 168, 108, 108, 108, 107, 136, 170, 143, 98, 144, 145, 77, 7, 108, 117, 113, 153, 1, 55, 134, 109, 109, 155, 10, 110, 110, 110, 171, 157, 168, 114, 154, 109, 80, 133, 113, 110, 135, 55, 123, 126, 158, 45, 185, 13, 159, 4, 159, 27, 28, 114, 18, 127, 137, 128, 69, 70, 123, 43, 27, 28, 17, 92, 93, 21, 25, 31, 34, 38, 40, 46, 53, 59, 68, 49, 60, 82, 55, 91, 63, 96, -22, 102, 99, 86, 105, 164, -124, 166, 69, 171, 132, 139, 169, 180, 175, 187, 192, 193, 26, 39, 54, 186, 58, 174, 190, 101, 106, 176, 163, 178, 122, 0, 131, 116, 179, 0, 0, 0, 189, 0, 81, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90 }; static const short yycheck[] = { 53, 57, 29, 132, 3, 3, 3, 6, 7, 8, 9, 97, 147, 12, 12, 12, 3, 18, 10, 6, 73, 8, 9, 4, 30, 12, 97, 91, 16, 22, 31, 117, 31, 31, 31, 29, 35, 35, 35, 31, 169, 176, 91, 31, 31, 101, 117, 111, 35, 120, 31, 104, 5, 11, 81, 11, 30, 15, 23, 15, 31, 32, 111, 25, 17, 121, 19, 34, 35, 122, 30, 31, 32, 20, 31, 32, 30, 20, 24, 30, 20, 31, 27, 20, 20, 20, 30, 28, 26, 31, 20, 30, 13, 13, 26, 14, 30, 20, 11, 21, 7, 34, 31, 21, 35, 21, 31, 35, 4, 0, 0, 16, 24, 37, 181, 42, 159, 187, 79, 89, 166, 140, 167, 103, -1, 111, 94, 169, -1, -1, -1, 184, -1, 59, -1, 50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 64 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ #line 3 "/usr/share/bison.simple" /* Skeleton output parser for bison, Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* As a special exception, when this file is copied by Bison into a Bison output file, you may use that output file without restriction. This special exception was added by the Free Software Foundation in version 1.24 of Bison. */ #ifndef alloca #ifdef __GNUC__ #define alloca __builtin_alloca #else /* not GNU C. */ #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) #include #else /* not sparc */ #if defined (MSDOS) && !defined (__TURBOC__) #include #else /* not MSDOS, or __TURBOC__ */ #if defined(_AIX) #include #pragma alloca #else /* not MSDOS, __TURBOC__, or _AIX */ #ifdef __hpux #ifdef __cplusplus extern "C" { void *alloca (unsigned int); }; #else /* not __cplusplus */ void *alloca (); #endif /* not __cplusplus */ #endif /* __hpux */ #endif /* not _AIX */ #endif /* not MSDOS, or __TURBOC__ */ #endif /* not sparc. */ #endif /* not GNU C. */ #endif /* alloca not defined. */ /* This is the parser code that is written into each bison parser when the %semantic_parser declaration is not specified in the grammar. It was written by Richard Stallman by simplifying the hairy parser used when %semantic_parser is specified. */ /* Note: there must be only one dollar sign in this file. It is replaced by the list of actions, each action as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY -2 #define YYEOF 0 #define YYACCEPT return(0) #define YYABORT return(1) #define YYERROR goto yyerrlab1 /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ #define YYFAIL goto yyerrlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(token, value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { yychar = (token), yylval = (value); \ yychar1 = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ { yyerror ("syntax error: cannot back up"); YYERROR; } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 #ifndef YYPURE #define YYLEX yylex() #endif #ifdef YYPURE #ifdef YYLSP_NEEDED #ifdef YYLEX_PARAM #define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) #else #define YYLEX yylex(&yylval, &yylloc) #endif #else /* not YYLSP_NEEDED */ #ifdef YYLEX_PARAM #define YYLEX yylex(&yylval, YYLEX_PARAM) #else #define YYLEX yylex(&yylval) #endif #endif /* not YYLSP_NEEDED */ #endif /* If nonreentrant, generate the variables here */ #ifndef YYPURE int yychar; /* the lookahead symbol */ YYSTYPE yylval; /* the semantic value of the */ /* lookahead symbol */ #ifdef YYLSP_NEEDED YYLTYPE yylloc; /* location data for the lookahead */ /* symbol */ #endif int yynerrs; /* number of parse errors so far */ #endif /* not YYPURE */ #if YYDEBUG != 0 int yydebug; /* nonzero means print parse trace */ /* Since this is uninitialized, it does not stop multiple parsers from coexisting. */ #endif /* YYINITDEPTH indicates the initial size of the parser's stacks */ #ifndef YYINITDEPTH #define YYINITDEPTH 200 #endif /* YYMAXDEPTH is the maximum size the stacks can grow to (effective only if the built-in stack extension method is used). */ #if YYMAXDEPTH == 0 #undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH #define YYMAXDEPTH 10000 #endif /* Prevent warning if -Wstrict-prototypes. */ #ifdef __GNUC__ int yyparse (void); #endif #if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ #define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) #else /* not GNU C or C++ */ #ifndef __cplusplus /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __yy_memcpy (to, from, count) char *to; char *from; int count; { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #else /* __cplusplus */ /* This is the most reliable way to avoid incompatibilities in available built-in functions on various systems. */ static void __yy_memcpy (char *to, char *from, int count) { register char *f = from; register char *t = to; register int i = count; while (i-- > 0) *t++ = *f++; } #endif #endif #line 196 "/usr/share/bison.simple" /* The user can define YYPARSE_PARAM as the name of an argument to be passed into yyparse. The argument should have type void *. It should actually point to an object. Grammar actions can access the variable by casting it to the proper pointer type. */ #ifdef YYPARSE_PARAM #ifdef __cplusplus #define YYPARSE_PARAM_ARG void *YYPARSE_PARAM #define YYPARSE_PARAM_DECL #else /* not __cplusplus */ #define YYPARSE_PARAM_ARG YYPARSE_PARAM #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; #endif /* not __cplusplus */ #else /* not YYPARSE_PARAM */ #define YYPARSE_PARAM_ARG #define YYPARSE_PARAM_DECL #endif /* not YYPARSE_PARAM */ int yyparse(YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { register int yystate; register int yyn; register short *yyssp; register YYSTYPE *yyvsp; int yyerrstatus; /* number of tokens to shift before error messages enabled */ int yychar1 = 0; /* lookahead token as an internal (translated) token number */ short yyssa[YYINITDEPTH]; /* the state stack */ YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ short *yyss = yyssa; /* refer to the stacks thru separate pointers */ YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ #ifdef YYLSP_NEEDED YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ YYLTYPE *yyls = yylsa; YYLTYPE *yylsp; #define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) #else #define YYPOPSTACK (yyvsp--, yyssp--) #endif int yystacksize = YYINITDEPTH; #ifdef YYPURE int yychar; YYSTYPE yylval; int yynerrs; #ifdef YYLSP_NEEDED YYLTYPE yylloc; #endif #endif YYSTYPE yyval; /* the variable used to return */ /* semantic values from the action */ /* routines */ int yylen; #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Starting parse\n"); #endif yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss - 1; yyvsp = yyvs; #ifdef YYLSP_NEEDED yylsp = yyls; #endif /* Push a new state, which is found in yystate . */ /* In all cases, when you get here, the value and location stacks have just been pushed. so pushing a state here evens the stacks. */ yynewstate: *++yyssp = yystate; if (yyssp >= yyss + yystacksize - 1) { /* Give user a chance to reallocate the stack */ /* Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; short *yyss1 = yyss; #ifdef YYLSP_NEEDED YYLTYPE *yyls1 = yyls; #endif /* Get the current used size of the three stacks, in elements. */ int size = yyssp - yyss + 1; #ifdef yyoverflow /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. */ #ifdef YYLSP_NEEDED /* This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yyls1, size * sizeof (*yylsp), &yystacksize); #else yyoverflow("parser stack overflow", &yyss1, size * sizeof (*yyssp), &yyvs1, size * sizeof (*yyvsp), &yystacksize); #endif yyss = yyss1; yyvs = yyvs1; #ifdef YYLSP_NEEDED yyls = yyls1; #endif #else /* no yyoverflow */ /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) { yyerror("parser stack overflow"); return 2; } yystacksize *= 2; if (yystacksize > YYMAXDEPTH) yystacksize = YYMAXDEPTH; yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp)); yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp)); #ifdef YYLSP_NEEDED yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp)); #endif #endif /* no yyoverflow */ yyssp = yyss + size - 1; yyvsp = yyvs + size - 1; #ifdef YYLSP_NEEDED yylsp = yyls + size - 1; #endif #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Stack size increased to %d\n", yystacksize); #endif if (yyssp >= yyss + yystacksize - 1) YYABORT; } #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Entering state %d\n", yystate); #endif goto yybackup; yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ /* yyresume: */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yyn == YYFLAG) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* yychar is either YYEMPTY or YYEOF or a valid token in external form. */ if (yychar == YYEMPTY) { #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Reading a token: "); #endif yychar = YYLEX; } /* Convert token to internal form (in yychar1) for indexing tables with */ if (yychar <= 0) /* This means end of input. */ { yychar1 = 0; yychar = YYEOF; /* Don't call YYLEX any more */ #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Now at end of input.\n"); #endif } else { yychar1 = YYTRANSLATE(yychar); #if YYDEBUG != 0 if (yydebug) { fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); /* Give the individual parser a way to print the precise meaning of a token, for further debugging info. */ #ifdef YYPRINT YYPRINT (stderr, yychar, yylval); #endif fprintf (stderr, ")\n"); } #endif } yyn += yychar1; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) goto yydefault; yyn = yytable[yyn]; /* yyn is what to do for this token type in this state. Negative => reduce, -yyn is rule number. Positive => shift, yyn is new state. New state is final state => don't bother to shift, just return success. 0, or most negative number => error. */ if (yyn < 0) { if (yyn == YYFLAG) goto yyerrlab; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); #endif /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; #ifdef YYLSP_NEEDED *++yylsp = yylloc; #endif /* count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; yystate = yyn; goto yynewstate; /* Do the default action for the current state. */ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; /* Do a reduction. yyn is the number of a rule to reduce with. */ yyreduce: yylen = yyr2[yyn]; if (yylen > 0) yyval = yyvsp[1-yylen]; /* implement default value of the action */ #if YYDEBUG != 0 if (yydebug) { int i; fprintf (stderr, "Reducing via rule %d (line %d), ", yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) fprintf (stderr, "%s ", yytname[yyrhs[i]]); fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); } #endif switch (yyn) { case 1: #line 143 "user.y" { ; break;} case 2: #line 149 "user.y" { defined_symbol=NULL; /* end of definitions */ make_symbol_reference(&symbol_set[Attribute]); if (debug & DEBUG_INIT) print_symbols_by_ref(&symbol_set[Attribute]); ; break;} case 3: #line 158 "user.y" { defined_kind=Attribute; crc32file_addn(&crc, (unsigned char *) "@Attributes ", sizeof("@Attributes ")); ; break;} case 4: #line 166 "user.y" { make_symbol_reference(value_set); link_attribute(value_set,yyvsp[-2].symbol); defined_symbol=NULL; /* for error message */ ; break;} case 5: #line 174 "user.y" { yyval.symbol=*new_symbol(yyvsp[0].string,&symbol_set[Attribute]); value_set=&yyval.symbol->data->attribute.value_set; defined_symbol=yyval.symbol; crc32file_addn(&crc, (unsigned char *) yyvsp[0].string, (int) strlen(yyvsp[0].string)); crc32file_add(&crc, (unsigned char) ':'); ; break;} case 6: #line 184 "user.y" { (void) new_symbol(yyvsp[0].string,value_set); crc32file_addn(&crc, (unsigned char *) yyvsp[0].string, (int) strlen(yyvsp[0].string)); crc32file_add(&crc, (unsigned char) ' '); ; break;} case 7: #line 192 "user.y" { defined_symbol=NULL; /* end of definitions */ make_symbol_reference(&symbol_set[Type]); largest_type=largest_type_sym->ordinal; if (debug & DEBUG_INIT) print_symbols_by_ref(&symbol_set[Type]); /* TODO: move this to end of spelling rules when looking up unknown words works. */ if (db_operation & Lookup) { crc32file_hash(&crc, crc_hash); parsing=FALSE; /* change format of fatal errors */ tfs_table_init(db_operation, gram_file_name, db_file_name, crc_hash); parsing=TRUE; } if (db_operation == Lookup) YYACCEPT; /* skip the rest of the file */ ; break;} case 8: #line 214 "user.y" { defined_kind=Type; largest_type_card = 0; crc32file_addn(&crc, (unsigned char *) "@Types ", sizeof("@Types ")); ; break;} case 9: #line 223 "user.y" { if (current_type->project_card==0) current_type->project_card=current_type->card; if (current_type->card > largest_type_card) { largest_type_sym = defined_symbol; largest_type_card = current_type->card; } current_type->attribute_ref= (s_symbol **) new_ref((int) current_type->card, map_chain, (t_ptr) current_chain, ref_is_item); free_chain(current_chain); defined_symbol=NULL; /* for error message */ ; break;} case 10: #line 241 "user.y" { ; break;} case 11: #line 244 "user.y" { ; break;} case 12: #line 249 "user.y" { current_type->project_card= current_type->card; crc32file_add(&crc, (unsigned char) '|'); ; break;} case 13: #line 255 "user.y" { defined_symbol = *new_symbol(yyvsp[0].string,&symbol_set[Type]); current_type = (s_type *) defined_symbol->data; current_chain = NULL; crc32file_addn(&crc, (unsigned char *) yyvsp[0].string, (int) strlen(yyvsp[0].string)); crc32file_add(&crc, (unsigned char) ':'); ; break;} case 14: #line 265 "user.y" { yyval.symbol=*find_symbol(yyvsp[0].string,&symbol_set[Attribute]); current_attribute=yyval.symbol; value_set= &((yyval.symbol)->data->attribute.value_set); ; break;} case 15: #line 273 "user.y" { defined_symbol=NULL; /* end of definitions */ make_symbol_reference(&symbol_set[Rule]); if (debug & DEBUG_INIT) print_symbols_by_ref(&symbol_set[Rule]); if (! parse_only) prepare_rules(); ; break;} case 16: #line 284 "user.y" { defined_kind=Rule; goal_card = 0; /* tell tokenizer to interpret strings as lexical strings */ current_letter_kind=Lexical_Letter; current_letter_map=lexical_letter_map; ; break;} case 17: #line 294 "user.y" { defined_symbol=NULL; /* for error message */ ; break;} case 18: #line 300 "user.y" { make_symbol_reference(variable_set); current_rule->instance->lhs=yyvsp[-2].tfs; adjust_var_map(variable_set->ref,current_rule->instance); ; break;} case 19: #line 306 "user.y" { variable_set = NULL; /* no variable to handle */ current_rule->instance->rule_kind = Lexical; current_rule->instance->lhs=yyvsp[0].tfs; ; break;} case 20: #line 312 "user.y" { current_rule->instance->rule_kind = Goal; goal_card++; if (yyvsp[0].tfs->var_map != NULL) /* TODO catch this earlier */ fatal_error("variables not allowed in goal rule"); current_rule->instance->first=yyvsp[0].tfs; current_rule->instance->lex= (t_letter *) "";/* empty string */ current_rule->instance->lhs=new_tfs(yyvsp[0].tfs->type); fill_tfs_with_variables(current_rule->instance->lhs); ident_var_map(current_rule->instance->lhs); ; break;} case 21: #line 326 "user.y" { ; break;} case 22: #line 332 "user.y" { yyval.tfs=yyvsp[0].tfs; ; break;} case 23: #line 338 "user.y" { variable_allowed=FALSE; yyval.letter_string=yyvsp[0].letter_string; ; break;} case 24: #line 345 "user.y" { defined_symbol = *new_symbol(yyvsp[0].string,&symbol_set[Rule]); current_rule = (s_rule *)defined_symbol->data; variable_set = &(current_rule->variable_set); variable_allowed=TRUE; ; break;} case 25: #line 354 "user.y" { yyval.tfs = yyvsp[-1].tfs; /* that's the tfs */ if (yyvsp[0].chain == NULL) yyval.tfs->var_map = NULL; else { yyval.tfs->var_map = (s_var_map **) new_ref(var_map_card, map_chain, (t_ptr) yyvsp[0].chain, ref_is_item); free_chain(yyvsp[0].chain); } ; break;} case 26: #line 369 "user.y" { s_symbol *symbol; symbol = *find_symbol(yyvsp[0].string,&symbol_set[Type]); current_type = (s_type *) symbol->data; yyval.tfs=new_tfs(symbol->ordinal); current_tfs=yyval.tfs; /* fill the type feature structure with full sets */ fill_tfs_with_variables(yyval.tfs); ; break;} case 27: #line 382 "user.y" { yyval.chain=yyvsp[-1].chain; ; break;} case 28: #line 388 "user.y" { yyval.var_map=yyvsp[0].var_map; ; break;} case 29: #line 394 "user.y" { yyval.var_map=NULL; ; break;} case 30: #line 398 "user.y" { yyval.var_map=yyvsp[0].var_map; ; break;} case 31: #line 402 "user.y" { yyval.var_map=yyvsp[-1].var_map; ; break;} case 32: #line 408 "user.y" { int pos; s_symbol *variable; pos = reference_position((t_ptr *) current_type->attribute_ref, (t_ptr) current_attribute); if ( pos < 0 ) fatal_error( "attribute \"%s\" not declared for type \"%s\"", current_attribute->name, symbol_set[Type].ref[current_tfs->type]->name); if (! variable_allowed) fatal_error( "a variable is not allowed in this context"); variable = *new_symbol(yyvsp[0].string,variable_set); if (variable->data->variable.attribute_link == NULL) variable->data->variable.attribute_link=current_attribute; else if (variable->data->variable.attribute_link != current_attribute) fatal_error("variable $%s %s \"%s\" and \"%s\"", yyvsp[0].string, "is used for incompatible attributes:", variable->data->variable.attribute_link->name, current_attribute->name); MY_MALLOC(yyval.var_map,s_var_map); yyval.var_map->foreign_index = (t_index) variable->ordinal; yyval.var_map->local_index = (t_index) pos; ; break;} case 33: #line 440 "user.y" { int pos; pos = reference_position((t_ptr *) current_type->attribute_ref, (t_ptr) current_attribute); if ( pos < 0 ) fatal_error( "attribute \"%s\" not declared for type \"%s\"", current_attribute->name, symbol_set[Type].ref[current_tfs->type]->name); current_tfs->att_list[pos] &= yyvsp[0].value; if (current_tfs->att_list[pos] == NO_BITS) fatal_error("value set complement for \"%s\" is empty", current_attribute->name); ; break;} case 34: #line 457 "user.y" { yyval.value = ~ (yyvsp[0].value); if (yyval.value == NO_BITS) /* occurs only when there is MAXVAL values for attribute */ fatal_error("value set complement is empty"); ; break;} case 35: #line 464 "user.y" { yyval.value = yyvsp[0].value; ; break;} case 36: #line 470 "user.y" { yyval.value = (yyvsp[-1].value | yyvsp[0].value); ; break;} case 37: #line 476 "user.y" { yyval.value = BIT_N((*find_symbol(yyvsp[0].string,value_set))->ordinal); ; break;} case 38: #line 483 "user.y" { yyval.value = yyvsp[0].value; ; break;} case 39: #line 489 "user.y" { current_rule->instance->rule_kind=Unary; current_rule->instance->first=yyvsp[0].tfs; current_rule->instance->second=NULL; ; break;} case 40: #line 495 "user.y" { current_rule->instance->rule_kind=Binary; current_rule->instance->first=yyvsp[-1].tfs; current_rule->instance->second=yyvsp[0].tfs; ; break;} case 41: #line 501 "user.y" { current_rule->instance->rule_kind=Prefix; current_rule->instance->first=yyvsp[0].tfs; current_rule->instance->second=yyvsp[-1].tfs; ; break;} case 42: #line 507 "user.y" { current_rule->instance->rule_kind=Suffix; current_rule->instance->first=yyvsp[-1].tfs; current_rule->instance->second=yyvsp[0].tfs; ; break;} case 43: #line 515 "user.y" { /* affix tfs cannot have variables; see adjust_var_map() */ current_rule->instance->lex=yyvsp[-1].letter_string; current_rule->instance->lex_length=strlen((char *) yyvsp[-1].letter_string); yyval.tfs=yyvsp[0].tfs; variable_allowed = TRUE; /* useful only for prefix */ ; break;} case 44: #line 524 "user.y" { ; break;} case 45: #line 528 "user.y" { ; break;} case 46: #line 534 "user.y" { ; break;} case 47: #line 538 "user.y" { ; break;} case 48: #line 544 "user.y" { ; break;} case 49: #line 548 "user.y" { ; break;} case 50: #line 554 "user.y" { ; break;} case 51: #line 558 "user.y" { ; break;} case 52: #line 564 "user.y" { var_map_card++; if (yyvsp[0].var_map != NULL) yyval.chain = insert_chain_link(yyvsp[-1].chain, (t_ptr) yyvsp[0].var_map); ; break;} case 53: #line 570 "user.y" { var_map_card=0; yyval.chain=NULL; ; break;} case 54: #line 577 "user.y" { yyval.value = ( yyvsp[-1].value | yyvsp[0].value ); ; break;} case 55: #line 581 "user.y" { yyval.value = 0L; ; break;} case 56: #line 587 "user.y" { current_type->card++; current_chain=insert_chain_link(current_chain, (t_ptr) yyvsp[0].symbol); crc32file_addn(&crc, (unsigned char *) yyvsp[0].symbol->name, (int) strlen(yyvsp[0].symbol->name)); crc32file_add(&crc, (unsigned char) ' '); ; break;} case 57: #line 595 "user.y" { current_type->card++; current_chain=insert_chain_link(current_chain, (t_ptr) yyvsp[0].symbol); crc32file_addn(&crc, (unsigned char *) yyvsp[0].symbol->name, (int) strlen(yyvsp[0].symbol->name)); crc32file_add(&crc, (unsigned char) ' '); ; break;} case 58: #line 605 "user.y" { defined_symbol=NULL; /* end of definitions */ make_symbol_reference(&symbol_set[Spelling]); if (debug & DEBUG_INIT) print_symbols_by_ref(&symbol_set[Spelling]); max_spell_length=max_left_context_length + max_rest_length; if (!parse_only) prepare_spell(); ; break;} case 59: #line 615 "user.y" { ; break;} case 60: #line 620 "user.y" { defined_kind=Spelling; max_left_context_length=0; max_rest_length=0; ; break;} case 61: #line 629 "user.y" { current_spell->left_context = reverse_chain(current_spell->left_context); if (! has_concat_pos) current_spell->concat_pos = NO_CONCAT; /* impossible value */ defined_symbol=NULL; /* for error message */ max_left_context_length = MAX(current_spell->left_context_length, max_left_context_length); max_rest_length = MAX(current_spell->focus_length + current_spell->right_context_length, max_rest_length); current_spell->constraint = yyvsp[0].chain; ; break;} case 62: #line 647 "user.y" { defined_symbol = *new_symbol(yyvsp[0].string,&symbol_set[Spelling]); current_spell = defined_symbol->data->spelling.instance; current_spell->spell_link=defined_symbol; /* next letter will be found in surface alphabet */ current_letter_kind=Surface_Letter; current_letter_map=surface_letter_map; current_pair_flags=BOTH_LETTERS; /* for next explicit Pair */ has_concat_pos=FALSE; current_spell->concat_pos=0; current_pattern=NULL; /* prepare for left context */ current_pattern_length=0; within_focus=FALSE; ; break;} case 63: #line 666 "user.y" { ; break;} case 64: #line 670 "user.y" { ; break;} case 65: #line 676 "user.y" { current_spell->left_context=current_pattern; current_spell->left_context_length=current_pattern_length; if (has_concat_pos) current_spell->concat_pos -= current_pattern_length; current_pattern=NULL; /* prepare for focus */ current_pattern_length=0; within_focus=TRUE; ; break;} case 66: #line 688 "user.y" { current_spell->right_context=current_pattern; current_spell->right_context_length=current_pattern_length; ; break;} case 67: #line 695 "user.y" { current_spell->focus = current_pattern; current_spell->focus_length=current_pattern_length; if (! has_concat_pos) current_spell->concat_pos += current_pattern_length; current_pattern = NULL; /* prepare for right context */ current_pattern_length=0; within_focus=FALSE; ; break;} case 68: #line 707 "user.y" { current_spell->kind= Optional; ; break;} case 69: #line 711 "user.y" { current_spell->kind= Obligatory; ; break;} case 70: #line 715 "user.y" { current_spell->kind = Coerce; ; break;} case 71: #line 722 "user.y" { yyval.chain = insert_chain_link(yyvsp[-1].chain, (t_ptr) yyvsp[0].tfs); current_spell->constraint_card++; ; break;} case 72: #line 727 "user.y" { current_spell->constraint_card = 0; yyval.chain = NULL; ; break;} case 73: #line 734 "user.y" { ; break;} case 74: #line 737 "user.y" { ; break;} case 75: #line 742 "user.y" { ; break;} case 76: #line 745 "user.y" { ; break;} case 77: #line 750 "user.y" { if (has_concat_pos) fatal_error("concatenation position already specified"); has_concat_pos=TRUE; current_spell->concat_pos += current_pattern_length; current_pattern = insert_chain_link(current_pattern, (t_ptr) morpheme_boundary_pair); current_pattern_length++; ; break;} case 78: #line 761 "user.y" { current_pattern = insert_chain_link(current_pattern, (t_ptr) morpheme_boundary_pair); current_pattern_length++; ; break;} case 79: #line 768 "user.y" { current_pattern = insert_chain_link(current_pattern, (t_ptr) word_boundary_pair); current_pattern_length++; ; break;} case 80: #line 775 "user.y" { current_pattern = insert_chain_link(current_pattern, (t_ptr) yyvsp[0].pair); current_pattern_length += lexical_width(yyvsp[0].pair); ; break;} case 81: #line 784 "user.y" { ; break;} case 82: #line 787 "user.y" { ; break;} case 83: #line 792 "user.y" { ; break;} case 84: #line 796 "user.y" { ; break;} case 85: #line 801 "user.y" { ; break;} case 86: #line 806 "user.y" { defined_kind = Lexicon; variable_set=NULL; /* prevent variables in lexical Tfs */ variable_allowed=FALSE; if ((db_operation & Update)) { /* options mentionned -a */ augmenting=TRUE; initfile(augment_file_name); /* splice in file now */ } /* otherwise splice it at the end of this file, cf tokenize.l */ /* tell tokenizer to interpret strings as lexical strings */ current_letter_kind=Lexical_Letter; current_letter_map=lexical_letter_map; normalize = normalize_flag; ; break;} case 87: #line 824 "user.y" { free_tfs(common_tfs); if (! parse_only) { map_chain(affix_tree_chain, free_affix_tree); free_chain(affix_tree_chain); } ; break;} case 88: #line 834 "user.y" { common_tfs = yyvsp[0].tfs; if (! parse_only) affix_tree_chain = build_affix_trees(common_tfs); else if (normalize) { print_out("\t"); print_tfs1(outfile, common_tfs, FALSE, FALSE, FALSE); } ; break;} case 89: #line 847 "user.y" { ; break;} case 90: #line 850 "user.y" { ; break;} case 91: #line 855 "user.y" { parsing=FALSE; if (! parse_only) generate_surface(current_string, current_base_form, affix_tree_chain); else if (normalize) { print_out("\""); print_string(outfile, current_string); if (current_string != current_base_form && strcmp((char *) current_string, (char *) current_base_form)) { print_out("\" = \""); print_string(outfile, current_base_form); } print_out("\"\n"); } parsing=TRUE; if (current_string != current_base_form) MY_FREE(current_base_form); MY_FREE(current_string); ; break;} case 92: #line 880 "user.y" { /* TODO should not be in the lexical alphabet but user */ current_base_form = yyvsp[0].letter_string; ; break;} case 93: #line 885 "user.y" { current_base_form = current_string; ; break;} case 94: #line 891 "user.y" { /* save string */ current_string = yyvsp[0].letter_string; ; break;} case 95: #line 897 "user.y" { ; break;} case 96: #line 901 "user.y" { ; break;} case 97: #line 907 "user.y" { defined_symbol=NULL; /* end of definitions */ allow_string_letters=FALSE; ; break;} case 98: #line 914 "user.y" { t_str filler_symbol_name; defined_kind=Alphabet; init_symbol_set(&symbol_set[Pair], Lexical_Letter); /* fill the slot with ordinal number 0 with a dummy symbol so that letter strings can also terminate with 0; Use strdup, just in case the symbol is freed one day. */ MY_STRDUP(filler_symbol_name,""); /* impossible symbol name */ (void) new_symbol(filler_symbol_name,&symbol_set[Pair]); /* declare word boundary and morpheme boundary */ MY_STRDUP(filler_symbol_name," + "); /* unlikely symbol name */ morpheme_boundary_pair = (s_pair *) (*new_symbol(filler_symbol_name, &symbol_set[Pair]))->data; morpheme_boundary = morpheme_boundary_pair->lexical; /* tinker with the symbol table */ morpheme_boundary_pair->surface= empty_string; first_lexical_letter=*morpheme_boundary; MY_STRDUP(filler_symbol_name," ~ "); /* unlikely symbol name */ word_boundary_pair = (s_pair *) (*new_symbol(filler_symbol_name, &symbol_set[Pair]))->data; word_boundary=word_boundary_pair->lexical; /* tinker with the symbol table */ word_boundary_pair->surface= empty_string; allow_string_letters=TRUE; /* allow ASTRING strings */ MY_CALLOC(surface_letter_map,LETTER_MAP_SIZE,t_letter); MY_CALLOC(lexical_letter_map,LETTER_MAP_SIZE,t_letter); MY_CALLOC(letter_to_char_map,LETTER_MAP_SIZE,unsigned char); crc32file_addn(&crc, (unsigned char *) "@Alphabets ", sizeof("@Alphabets ")); ; break;} case 99: #line 951 "user.y" { MY_FREE(fake_symbol.name); alphabet_size=symbol_set[Pair].card; make_symbol_reference(&symbol_set[Pair]); if (debug & DEBUG_INIT) { print_symbols_by_ref(&symbol_set[Pair]); } ; break;} case 100: #line 962 "user.y" { /* don't care about name, first is lexical, second surface */ fake_symbol.name=yyvsp[0].string; fake_symbol.ordinal=0; defined_symbol=&fake_symbol; symbol_set[Pair].kind = Lexical_Letter; current_letter_map=lexical_letter_map; crc32file_addn(&crc, (unsigned char *) "Lexical:", sizeof("Lexical:")); ; break;} case 101: #line 975 "user.y" { /* don't care about name, first is lexical, second surface */ defined_kind=Alphabet; MY_FREE(fake_symbol.name); fake_symbol.name=yyvsp[0].string; fake_symbol.ordinal=0; symbol_set[Pair].kind = Surface_Letter; current_letter_map=surface_letter_map; lexical_alphabet_size=symbol_set[Pair].card; crc32file_addn(&crc, (unsigned char *) "Surface:", sizeof("Surface:")); ; break;} case 102: #line 990 "user.y" { ; break;} case 103: #line 993 "user.y" { ; break;} case 104: #line 998 "user.y" { s_symbol *symbol; int length; symbol= *new_symbol(yyvsp[0].string,&symbol_set[Pair]); if ((length = strlen(symbol->name)) == 1) { current_letter_map[(unsigned char) *symbol->name] = (t_letter) symbol->ordinal; letter_to_char_map[symbol->ordinal] = (unsigned char) *symbol->name; } crc32file_addn(&crc, (unsigned char *) yyvsp[0].string , (int) length); crc32file_add(&crc, (unsigned char) ' '); ; break;} case 105: #line 1013 "user.y" { /* allow special characters to be declared as letter */ /* TODO: cleanup the cases where this name could be printed */ s_symbol *symbol; symbol= *new_symbol(yyvsp[0].string,&symbol_set[Pair]); if (strlen(symbol->name) != 1) fatal_error("%s %s %s", "Sorry: cannot accept string definition of", symbol_kind_str[current_letter_kind], "longer than one character"); else { current_letter_map[(unsigned char) *symbol->name] = (t_letter) symbol->ordinal; letter_to_char_map[symbol->ordinal] = (unsigned char) *symbol->name; } crc32file_add(&crc, (unsigned char) '"'); crc32file_add(&crc, (unsigned char) *yyvsp[0].string); crc32file_add(&crc, (unsigned char) '"'); ; break;} case 106: #line 1036 "user.y" { defined_symbol=NULL; /* end of definitions */ if (debug & DEBUG_INIT) { /* TODO change this */ print_symbol_table(&symbol_set[Pair]); } MY_FREE(current_lexical_set); ; break;} case 107: #line 1044 "user.y" { ; break;} case 108: #line 1049 "user.y" { defined_kind=Pair; symbol_set[Pair].kind = Pair; current_lexical_set=new_bitmap((long) alphabet_size); ; break;} case 109: #line 1057 "user.y" { ; break;} case 110: #line 1061 "user.y" { ; break;} case 111: #line 1066 "user.y" { defined_symbol=NULL; /* for error message */ ; break;} case 112: #line 1072 "user.y" { defined_symbol = *new_symbol(yyvsp[0].string,&symbol_set[Pair]); current_pair = (s_pair *) defined_symbol->data; /* next letter will be found in surface alphabet */ current_letter_kind=Surface_Letter; current_letter_map=surface_letter_map; current_pair_flags=BOTH_LETTERS; /* for next explicit Pair */ empty_bitmap(current_lexical_set); current_pair_width=-1; ; break;} case 113: #line 1086 "user.y" { ; break;} case 114: #line 1089 "user.y" { ; break;} case 115: #line 1094 "user.y" { int lexical_width; if (current_pair_flags & LEXICAL_IS_CLASS) lexical_width=1; else lexical_width=strlen((char *) yyvsp[0].letter_string); if (lexical_width > 1) { /* TODO: print pair */ fatal_error("%s\nthe lexical part %s", "Sorry, not yet implemented.", "of the pair cannot be longer than one symbol"); } if (current_pair_width == -1) current_pair_width = lexical_width; else if (current_pair_width != lexical_width) fatal_error("%s %s", "you cannot mix pairs with different", "lexical lengths"); if (lexical_width==0 && !(current_pair_flags & SURFACE_IS_CLASS) && *(yyvsp[-2].letter_string) == NUL_LETTER) fatal_error("empty pair <>/<> is not allowed"); add_explicit_pair(current_pair,yyvsp[-2].letter_string,yyvsp[0].letter_string,current_pair_flags, current_lexical_set); current_pair_flags=BOTH_LETTERS; /* restore for next */ ; break;} case 116: #line 1122 "user.y" { int pair_width; /* TODO factorize this code and similar above */ if (yyvsp[0].symbol == defined_symbol) fatal_error("pair name is used in its own definition"); pair_width=lexical_width((s_pair *) yyvsp[0].symbol->data); if (current_pair_width == -1) current_pair_width = pair_width; else if (current_pair_width != pair_width) fatal_error("%s %s", "you cannot mix pairs with different", "lexical lengths"); add_pair(current_pair, (s_pair *) yyvsp[0].symbol->data, current_lexical_set); ; break;} case 117: #line 1142 "user.y" { /* similar to Pair above */ int lexical_width; if (! (current_pair_flags & LEXICAL_IS_CLASS)) { lexical_width=strlen((char *) yyvsp[0].letter_string); if (lexical_width > 1) /* TODO: print pair */ fatal_error("%s\nthe lexical part of th pair %s", "Sorry, not yet implemented.", "cannot be longer than one symbol"); else if (lexical_width == 0 && ! (current_pair_flags & LEXICAL_IS_CLASS) && *(yyvsp[-2].letter_string) == NUL_LETTER) fatal_error("empty pair <>/<> is not allowed"); } yyval.pair=new_pair(yyvsp[-2].letter_string,yyvsp[0].letter_string,current_pair_flags,(s_pair *) NULL); if (within_focus) is_pair_concrete(yyval.pair); current_pair_flags=BOTH_LETTERS; /* restore for next */ ; break;} case 118: #line 1163 "user.y" { yyval.pair= (s_pair *) yyvsp[0].symbol->data; if (within_focus) is_pair_concrete(yyval.pair); ; break;} case 119: #line 1172 "user.y" { yyval.symbol= *find_symbol(yyvsp[0].string,&symbol_set[Pair]); if (! (yyval.symbol->kind == Pair || yyval.symbol->kind == Pair_Letter || yyval.symbol->kind == Pair_Class)) fatal_error("%s \"%s\"", "There is no pair associated to symbol", yyval.symbol->name); ; break;} case 120: #line 1184 "user.y" { current_letter_kind=Lexical_Letter; /* alternate */ current_letter_map=lexical_letter_map; yyval.letter_string=yyvsp[0].letter_string; ; break;} case 121: #line 1192 "user.y" { current_letter_kind=Surface_Letter; /* alternate */ current_letter_map=surface_letter_map; yyval.letter_string=yyvsp[0].letter_string; ; break;} case 122: #line 1200 "user.y" { letter_string[letter_string_size]= NUL_LETTER; MY_STRDUP(yyval.letter_string,letter_string); ; break;} case 123: #line 1205 "user.y" { yyval.letter_string= (t_letter *) yyvsp[0].letter_string; ; break;} case 124: #line 1209 "user.y" { s_symbol *pair_symbol; pair_symbol = *find_symbol(yyvsp[0].string, &symbol_set[Pair]); if (pair_symbol->kind== Pair || (current_letter_kind == Surface_Letter && (pair_symbol->kind == Lexical_Letter || pair_symbol->kind == Lexical_Class)) || (current_letter_kind == Lexical_Letter && (pair_symbol->kind == Surface_Letter || pair_symbol->kind == Surface_Class))) fatal_error("symbol \"%s\" is not a %s", pair_symbol->name, symbol_kind_str[current_letter_kind]); if (pair_symbol->data->pair.pair_flags == BOTH_CLASSES) if (current_letter_kind == Surface_Letter) current_pair_flags |= SURFACE_IS_CLASS; else current_pair_flags |= LEXICAL_IS_CLASS; if (current_letter_kind == Surface_Letter) yyval.letter_string = pair_symbol->data->pair.surface; else yyval.letter_string = pair_symbol->data->pair.lexical; ; break;} case 125: #line 1234 "user.y" { yyval.letter_string = letter_any; ; break;} case 126: #line 1240 "user.y" { if (letter_string_size >= LETTER_STRING_SIZE_MAX - 1) fatal_error("symbol sequence too long, maximum=%d", LETTER_STRING_SIZE_MAX - 1); letter_string[letter_string_size++] = *find_letter(yyvsp[0].string, current_letter_kind); ; break;} case 127: #line 1248 "user.y" { letter_string_size=0; ; break;} case 128: #line 1255 "user.y" { defined_symbol=NULL; /* end of definitions */ allow_string_letters=FALSE; if (debug & DEBUG_INIT) { /* TODO change this */ print_symbol_table(&symbol_set[Pair]); } ; break;} case 129: #line 1263 "user.y" { ; break;} case 130: #line 1267 "user.y" { defined_kind=Pair_Class; symbol_set[Pair].kind = Pair_Class; allow_string_letters=TRUE; ; break;} case 131: #line 1275 "user.y" { ; break;} case 132: #line 1278 "user.y" { ; break;} case 133: #line 1283 "user.y" { if (class_flags & SURFACE_FLAG) if (class_flags & LEXICAL_FLAG) { defined_symbol->kind=Pair_Class; defined_symbol->data->class.lexical = current_class; } else defined_symbol->kind=Surface_Class; else { defined_symbol->kind = Lexical_Class; defined_symbol->data->class.lexical = current_class; defined_symbol->data->class.surface = NULL; } defined_symbol=NULL; /* for error message */ ; break;} case 134: #line 1301 "user.y" { defined_symbol = *new_symbol(yyvsp[0].string,&symbol_set[Pair]); current_class = defined_symbol->data->class.surface; class_flags = SURFACE_FLAG | LEXICAL_FLAG; ; break;} case 135: #line 1309 "user.y" { ; break;} case 136: #line 1312 "user.y" { ; break;} case 137: #line 1317 "user.y" { s_symbol *class_symbol; class_symbol = *find_symbol(yyvsp[0].string,&symbol_set[Pair]); switch (class_symbol->kind) { case Surface_Letter: class_flags &= SURFACE_FLAG; set_bit(current_class, (long) *(class_symbol->data->pair.surface)); break; case Lexical_Letter: class_flags &= LEXICAL_FLAG; /*FALLTHROUGH*/ case Pair_Letter: set_bit(current_class, (long) *(class_symbol->data->pair.lexical)); break; case Surface_Class: class_flags &= SURFACE_FLAG; assign_or(current_class, class_symbol->data->class.surface); break; case Lexical_Class: class_flags &= LEXICAL_FLAG; /*FALLTHROUGH*/ case Pair_Class: if (class_symbol == defined_symbol) fatal_error( "symbol class is used in its own definition"); assign_or(current_class, class_symbol->data->class.lexical); break; default: fatal_error("program bug: no such class kind"); break; } if (class_flags == 0) fatal_error("you cannot mix %s (class=\"%s\", symbol=\"%s\")", "pure lexical and surface symbols in same class", defined_symbol->name, class_symbol->name); ; break;} case 138: #line 1360 "user.y" { /* allow special characters to be used as a class definition */ /* TODO: cleanup the cases where this name could be printed ?? */ s_symbol *class_symbol; class_symbol= *find_symbol(yyvsp[0].string,&symbol_set[Pair]); switch (class_symbol->kind) { case Surface_Letter: class_flags &= SURFACE_FLAG; set_bit(current_class, (long) *(class_symbol->data->pair.surface)); break; case Lexical_Letter: class_flags &= LEXICAL_FLAG; /*FALLTHROUGH*/ case Pair_Letter: set_bit(current_class, (long) *(class_symbol->data->pair.lexical)); break; default: fatal_error("program bug: no such class kind"); break; } if (class_flags == 0) fatal_error("%s %s (class=\"%s\", symbol=\"%s\")", "you cannot mix pure lexical and surface", "symbols in the same class", defined_symbol->name, class_symbol->name); ; break;} } /* the action file gets copied in in place of this dollarsign */ #line 498 "/usr/share/bison.simple" yyvsp -= yylen; yyssp -= yylen; #ifdef YYLSP_NEEDED yylsp -= yylen; #endif #if YYDEBUG != 0 if (yydebug) { short *ssp1 = yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif *++yyvsp = yyval; #ifdef YYLSP_NEEDED yylsp++; if (yylen == 0) { yylsp->first_line = yylloc.first_line; yylsp->first_column = yylloc.first_column; yylsp->last_line = (yylsp-1)->last_line; yylsp->last_column = (yylsp-1)->last_column; yylsp->text = 0; } else { yylsp->last_line = (yylsp+yylen-1)->last_line; yylsp->last_column = (yylsp+yylen-1)->last_column; } #endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate; yyerrlab: /* here on detecting error */ if (! yyerrstatus) /* If not already recovering from an error, report this error. */ { ++yynerrs; #ifdef YYERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, yytname[x]); strcat(msg, "'"); count++; } } yyerror(msg); free(msg); } else yyerror ("parse error; also virtual memory exceeded"); } else #endif /* YYERROR_VERBOSE */ yyerror("parse error"); } goto yyerrlab1; yyerrlab1: /* here on error raised explicitly by an action */ if (yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (yychar == YYEOF) YYABORT; #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); #endif yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ goto yyerrhandle; yyerrdefault: /* current state does not do anything special for the error token. */ #if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (yyn) goto yydefault; #endif yyerrpop: /* pop the current state because it cannot handle the error token */ if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp; #ifdef YYLSP_NEEDED yylsp--; #endif #if YYDEBUG != 0 if (yydebug) { short *ssp1 = yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); } #endif yyerrhandle: yyn = yypact[yystate]; if (yyn == YYFLAG) goto yyerrdefault; yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) goto yyerrdefault; yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) goto yyerrpop; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; #if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Shifting error token, "); #endif *++yyvsp = yylval; #ifdef YYLSP_NEEDED *++yylsp = yylloc; #endif yystate = yyn; goto yynewstate; } #line 1390 "user.y" mmorph-2.3.4.2.orig/user.tab.h0100644000175000001440000000156306313321341015042 0ustar mvelauserstypedef union { t_str string; s_symbol *symbol; s_chain *chain; t_value value; s_tfs *tfs; s_var_map *var_map; t_letter *letter_string; s_pair *pair; } YYSTYPE; #define ANY 258 #define BAR 259 #define BIARROW 260 #define WORDBOUNDARY 261 #define CONTEXTBOUNDARY 262 #define CONCATBOUNDARY 263 #define MORPHEMEBOUNDARY 264 #define DOLLAR 265 #define EQUAL 266 #define LANGLE 267 #define LARROW 268 #define LBRA 269 #define NOTEQUAL 270 #define RANGLE 271 #define RARROW 272 #define RBRA 273 #define COERCEARROW 274 #define COLON 275 #define SLASH 276 #define ALPHABETS 277 #define ATTRIBUTES 278 #define CLASSES 279 #define GRAMMAR 280 #define LEXICON 281 #define PAIRS 282 #define SPELLING 283 #define TYPES 284 #define DNAME 285 #define NAME 286 #define STRING 287 #define SNAME 288 #define TNAME 289 #define LSTRING 290 extern YYSTYPE yylval;