(FILECREATED " 9-Aug-84 12:23:50" {ERIS}<SPEECH>LEXICON>HALVORSEN>DFOOT.;1 41447 changes to: (FNS FOOTFONTS) (VARS DFOOTCOMS) previous date: " 8-Aug-84 12:37:08" {ERIS}<SPEECH>HALVORSEN>DFOOT.;5) (* Copyright (c) 1984 by XEROX. All rights reserved.) (PRETTYCOMPRINT DFOOTCOMS) (RPAQQ DFOOTCOMS ((FNS ANAPEST-FOOT ANTEPENULTSYLLABLE CATEGORIZE CONSONANT? COUNTTHEM VVAS.RULE EDGEMARKER FALLING-FOOT FIND-BOUNDARY FIND-1-STRESS FIND-STRESS FOOT-PARSER FOOT? HEAVY-SYLLABLE-FOOT LAST.BUT.NOT.SEPR HEAVY-SYLLABLE? LASTSYLLABLE LOADFOOT LONG-VOWEL? MAINSTRESS MAKE-FOOT ONSET PACKFEET PACKWORD PACKFOOT PARSE-1-WORD PARSE-TEST FOOT.DOMAINS PENULTRULE PENULTSYLLABLE PRETTYFOOT PRINTFOOT LEFT.WEAK.BRACKET RIGHT.STRONG.BRACKET LEFT.STRONG.BRACKET LEFT.SYLLABLE.INCORPORATION RIGHT.WEAK.BRACKET PRINTSTRONGFOOT PRUNE PRUNE1 REAL-LONG-VOWEL? RUNFEET SECONDARY-FOOT SECONDARY-STRESS STRESS STRESS&STRIP STRESS-SYLLABLE STRESS-VOWEL MAINSTRESS.FOOT STRESS? STRIPFOOT SYLLABLE-STACKER TERTIARY-STRESS TEST-FUNCTION TEST-STRESSER TRANSFORMFOOT VOWEL?) (FNS DEBUG FOOTSUBSCRIPT MARKED.STRONG SETUP.FOOTWINDOW FOOTFONTS DEFAULT.FOOT) (* Functions to parse feet) (VARS CONSONANTS FOOT-RULES FOOTFILES FOOTOUTPUTFILE LONG-CONSONANTS LONG-VOWELS NAMEFILES VOWELS TEST-WORDS Z) (ADDVARS (FOOTFILES SYLLABLE) (FOOT-RULES (FALLING-FOOT))) (RECORDS DOMAINS FOOT WORD))) (DEFINEQ (ANAPEST-FOOT [LAMBDA (SYLLABLES) (* kh: " 5-APR-83 14:24") (for SYLLABLE-TAIL on old SYLLABLES collect (COND [(AND (NOT (FOOT? (CAR SYLLABLE-TAIL))) (NOT (FOOT? (CADR SYLLABLE-TAIL))) (NOT (FOOT? (CADDR SYLLABLE-TAIL))) (STRESS? (CAR SYLLABLE-TAIL) 1) (STRESS? (CADR SYLLABLE-TAIL) 0) (STRESS? (CADDR SYLLABLE-TAIL) 0)) (SETQ SYLLABLES (CDDR SYLLABLES)) (* SYLLABLES will be decremented when we iterate as well, therefore no ADD1) (MAKE-FOOT (LIST (CAR SYLLABLE-TAIL) (CADR SYLLABLE-TAIL) (CADDR SYLLABLE-TAIL] (T (CAR SYLLABLE-TAIL))) finally $$VAL]) (ANTEPENULTSYLLABLE [LAMBDA (SYLLABLES) (* kh: "29-Mar-82 21:21" posted: "29-Mar-82 21:47") (* Returns the antepenultimate syllable of a word given the syllables as input) (CADDR SYLLABLES]) (CATEGORIZE [LAMBDA (W) (* pkh: " 8-Aug-84 11:59" posted: "29-Mar-82 00:22") (* Finds the / which indicates the morphological info in a word, and puts it on the porperty list of the word) (* / Indicates beginning of morphological information. If WORD has it, POS will be the character-position following /) (COND [(SETQ POS (STRPOS (QUOTE "/") (fetch INPUT of W) NIL NIL NIL T)) [replace CATEGORY of W with (MKATOM (U-CASE (SUBSTRING (fetch INPUT of W) POS] (* The category is that part of the word which follows /) (* The word itself is the substring preceding /) (replace TRANSCRIPTION of W with (MKATOM (SUBSTRING (fetch INPUT of W) 1 (IDIFFERENCE POS 2] (T (replace TRANSCRIPTION of W with (fetch INPUT of W]) (CONSONANT? [LAMBDA (SEGMENT) (* kh: "30-Mar-82 21:41" posted: "30-Mar-82 21:37") (* Returns the consonant if a syllable contains one) (COND ((MEMBER SEGMENT CONSONANTS) SEGMENT) (T NIL]) (COUNTTHEM [LAMBDA (ARRAY) (* pkh: " 7-Aug-84 15:42") (for X from 1 to (ARRAYSIZE ARRAY) do (printout T X " " (ELT ARRAY X) T]) (VVAS.RULE [LAMBDA (SYLLABLE) (* pkh: " 3-Aug-84 21:40" posted: "29-Mar-82 21:33") (PROG (TEMP) (COND ((MEMBER (fetch (WORD CATEGORY) of WREC) (QUOTE (a v))) (* Shouldn't use WREC freely here) (* Special treatment of verbs and adjectives. They get stressed if the last syllables has a long vowel or if it has a vowel followed by at least 2 consonants) (COND ((NULL (LONG-VOWEL? (HEAVY-SYLLABLE? SYLLABLE))) (* Long vowels that are the final segment don't count as long) (RETURN (STRESS-SYLLABLE SYLLABLE 11))) (T NIL))) ([AND (SETQ TEMP (SOME SYLLABLE (QUOTE LONG-VOWEL?))) (CDR TEMP) (NOT (NUMBERP (CADR TEMP] (* The VVAS.RULE says to stress the last syllable if there is a long-vowel in it, provided this vowel is not the last segment in the word) (RETURN (STRESS-SYLLABLE SYLLABLE 11))) (T NIL]) (EDGEMARKER [LAMBDA (SYLLABLES) (* edited: " 8-Apr-82 21:21") (* Stresses the edge of a word with 1 if it isn't already stressed) (PROG [(FIRST (CAR SYLLABLES)) (LAST (CAR (LAST SYLLABLES] (COND ((STRESS? FIRST 0) (STRESS-SYLLABLE FIRST 1))) (COND ((STRESS? LAST 0) (STRESS-SYLLABLE LAST 1]) (FALLING-FOOT [LAMBDA (SYLLABLES) (* pkh: " 7-Aug-84 16:54") (for SYLLABLE-TAIL on old SYLLABLES bind AFTER-STRESS-STRETCH MAIN-UPTO-SECONDARY MAIN-UPTO-BOUNDARY collect (COND ((AND (STRESS? (CAR SYLLABLE-TAIL) 1) (SETQ AFTER-STRESS-STRETCH (FIND-STRESS (CDR SYLLABLE-TAIL) 2))) (* Looking for a main-stress followed by a secondary-stress; makes a foot out of the main-stress syllable and the unstressed syllables up to the seocndary stress) [SETQ MAIN-UPTO-SECONDARY (CONS (CAR SYLLABLE-TAIL) (REVERSE (CDR (REVERSE AFTER-STRESS-STRETCH] (* Recurse down the syllable-tail until a 3 stress is found, if FIND-1-STRESS can find a 1 stress on the tail then make this domain of a 3 and 1 stress into a foot pop it off the stack (i.e. remainder)) (SETQ SYLLABLES (NTH SYLLABLES (LENGTH MAIN-UPTO-SECONDARY))) (MAKE-FOOT MAIN-UPTO-SECONDARY)) ([AND (STRESS? (CAR SYLLABLE-TAIL) 1) (SETQ AFTER-STRESS-TO-BOUNDARY (FIND-BOUNDARY (CDR SYLLABLE-TAIL] (* Looking for a main-stress followed by a secondary-stress; makes a foot out of the main-stress syllable and the unstressed syllables up to the seocndary stress) (SETQ MAIN-UPTO-BOUNDARY (CONS (CAR SYLLABLE-TAIL) AFTER-STRESS-TO-BOUNDARY)) (* Recurse down the syllable-tail until a 3 stress is found, if FIND-1-STRESS can find a 1 stress on the tail then make this domain of a 3 and 1 stress into a foot pop it off the stack (i.e. remainder)) (SETQ SYLLABLES (NTH SYLLABLES (LENGTH MAIN-UPTO-BOUNDARY))) (MAKE-FOOT MAIN-UPTO-BOUNDARY)) ((STRESS? (CAR SYLLABLE-TAIL) 1) (* Make a foot of the domain from the main-stress to the end of the word when there is no secondary stress following the main-stress) (PROG1 (MAKE-FOOT SYLLABLE-TAIL) (SETQ SYLLABLES NIL))) (T (* If we don't find a foot return the syllable at top of the stack unchanged) (CAR SYLLABLE-TAIL))) finally (RETURN $$VAL]) (FIND-BOUNDARY [LAMBDA (SYLLABLES) (* pkh: " 7-Aug-84 16:20") (for SYLLABLE in old SYLLABLES while (NOT (SETQ FOOTFLG (type? FOOT SYLLABLE))) collect SYLLABLE finally (RETURN (COND (FOOTFLG $$VAL) (T $$VAL]) (FIND-1-STRESS [LAMBDA (SYLLABLES) (* edited: "10-Apr-82 18:15") (* Walks down a list of with 0 stress syllables until a 1 stress is found. Returns the list of the unstressed syllables and the 1 stress, if failure NIL is returned) (for SYLLABLE in old SYLLABLES while (STRESS? SYLLABLE 0) collect SYLLABLE finally (COND [(STRESS? SYLLABLE 1) (RETURN (APPEND $$VAL (LIST SYLLABLE] (T (RETURN NIL]) (FIND-STRESS [LAMBDA (SYLLABLES STRESS) (* pkh: " 7-Aug-84 16:55") (* Walks down a list of with 0 stress syllables until a stress is found. Returns the list of the unstressed syllables and the stressed syllable if failure NIL is returned) (* If you want to find the first stressed syllable regardless of whether it has primary or secondary stress use NIL for the STRESS parameter) (for SYLLABLE FOOTFLG in old SYLLABLES while (AND (NOT (SETQ FOOTFLG (type? FOOT SYLLABLE))) (STRESS? SYLLABLE 0)) collect SYLLABLE finally (RETURN (COND (FOOTFLG (RETURN NIL)) ((NULL SYLLABLES) NIL) [(NULL STRESS) (COND ((OR (STRESS? SYLLABLE 2) (STRESS? SYLLABLE 1)) (RETURN (APPEND $$VAL (LIST SYLLABLE] [(STRESS? SYLLABLE STRESS) (RETURN (APPEND $$VAL (LIST SYLLABLE] (T NIL]) (FOOT-PARSER [LAMBDA (WREC) (* pkh: " 7-Aug-84 17:37") (* Takes a word as input, focusses on the STRUCTURE field of the WORD, i.e. where the the syllables sit, and parses the STRUCTURE into feet; finally we replace the parentheses with foot-boundary markers) (PROG (FEET (SYLLABLES (fetch STRUCTURE of WREC))) (SETQ FEET (FALLING-FOOT SYLLABLES)) (COND ((AND (BOUNDP DEBUG) DEBUG) (printout T (QUOTE "Falling-foot ===> ") T FEET T))) (SETQ FEET (SECONDARY-FOOT FEET)) (COND ((AND (BOUNDP DEBUG) DEBUG) (printout T (QUOTE "Secondary-foot ===> ") T FEET T))) (SETQ FEET (HEAVY-SYLLABLE-FOOT FEET)) (COND ((AND (BOUNDP DEBUG) DEBUG) (printout T (QUOTE "Heavy-syllable-foot ===> ") T FEET T))) (SETQ FEET (ANAPEST-FOOT FEET)) (COND ((AND (BOUNDP DEBUG) DEBUG) (printout T (QUOTE "Anapest-foot ===> ") T FEET T))) (SETQ FEET (DEFAULT.FOOT FEET)) (COND ((AND (BOUNDP DEBUG) DEBUG) (printout T (QUOTE "Default-foot ===> ") T FEET T))) (SETQ FEET (LEFT.SYLLABLE.INCORPORATION FEET)) (COND ((AND (BOUNDP DEBUG) DEBUG) (printout T (QUOTE "Left Syllable Incorporation ===> ") T FEET T))) (RETURN (replace STRUCTURE of WREC with FEET]) (FOOT? [LAMBDA (FOOTCANDIDATE) (* kh: "23-MAR-83 20:28") (COND ((EQUAL (CAR FOOTCANDIDATE) (QUOTE FOOT)) FOOTCANDIDATE) (T NIL]) (HEAVY-SYLLABLE-FOOT [LAMBDA (SYLLABLES) (* pkh: " 7-Aug-84 11:41") (* Makes a heavy-syllable into a foot provided either that it is not the final syllable or that provided that there is no long vowel in the syllable (tentative comment)) (for SYLLABLE in SYLLABLES bind (HEAVYSYLLABLERESULT (SYLL# ← (LENGTH SYLLABLES)) FOOTHOLDER) do [COND [[AND (NOT (FOOT? SYLLABLE)) (AND (SETQ HEAVYSYLLABLEHOLDER (HEAVY-SYLLABLE? SYLLABLE)) (OR [NOT (EQUAL SYLL# (ADD1 (LENGTH FOOTHOLDER] (NOT (LONG-VOWEL? (CAR (LAST.BUT.NOT.SEPR HEAVYSYLLABLEHOLDER] (SETQ FOOTHOLDER (APPEND FOOTHOLDER (LIST (MAKE-FOOT (LIST SYLLABLE] (T (SETQ FOOTHOLDER (APPEND FOOTHOLDER (LIST SYLLABLE] finally (RETURN FOOTHOLDER]) (LAST.BUT.NOT.SEPR [LAMBDA (SYLLABLE) (* pkh: " 7-Aug-84 15:23") (COND [(MEMBER (CAR (LAST SYLLABLE)) (QUOTE (- < *))) (NTH SYLLABLE (SUB1 (LENGTH SYLLABLE] (T (LAST SYLLABLE]) (HEAVY-SYLLABLE? [LAMBDA (SYLLABLE) (* pkh: " 7-Aug-84 17:53") (* Returns the rest of the syllable starting with a long-vowel (VV's have to be treated separately) or starting with the VCCC sequence; if the syllable isn't long we return NIL) (OR (SOME SYLLABLE (QUOTE LONG-VOWEL?)) (SOME (CDR (SOME (CDR (SOME (CDR (SOME SYLLABLE (QUOTE VOWEL?))) (QUOTE CONSONANT?))) (QUOTE CONSONANT?))) (QUOTE CONSONANT?]) (LASTSYLLABLE [LAMBDA (SYLLABLES) (* kh: "29-Mar-82 18:31" posted: "29-Mar-82 18:41") (CAR SYLLABLES]) (LOADFOOT [LAMBDA (FLG) (* pkh: " 1-Aug-84 20:39") (* Loads the files necessary to run the foot parser) (* I use DLAMBDAs so this file from <lisp>library> needs to be loaded) (LOAD? (QUOTE DECL.DCOM)) (COND [FLG (PROGN (LOAD (QUOTE {PHYLUM}<HALVORSEN>LISP>DFOOT.DCOM)) (LOAD (QUOTE {PHYLUM}<HALVORSEN>LISP>SYLLABLE.DCOM)) (LOAD (QUOTE {PHYLUM}<HALVORSEN>LISP>METRICS.DCOM)) (LOAD (QUOTE {PHYLUM}<HALVORSEN>LISP>METRICSPATCH] (T (PROGN (LOAD? (QUOTE {PHYLUM}<HALVORSEN>LISP>DFOOT.DCOM)) (LOAD? (QUOTE {PHYLUM}<HALVORSEN>LISP>SYLLABLE.DCOM)) (LOAD? (QUOTE {PHYLUM}<HALVORSEN>LISP>METRICS.DCOM]) (LONG-VOWEL? [LAMBDA (SEGMENT) (* pkh: " 7-Aug-84 10:32" posted: "28-Mar-82 23:09") (* Checks to see if the segment is among the long-vowels listed in LONG-VOWELS (and returns the vowel if it is)) (COND ((MEMBER SEGMENT LONG-VOWELS) SEGMENT) (T NIL]) (MAINSTRESS [LAMBDA (SYLLABLE) (* pkh: " 7-Aug-84 16:55" posted: "29-Mar-82 16:44") (* Takes a syllable and inserts main stress indication (3) after the first vowel; SHOULDNT if there is no vowel) (STRESS-VOWEL SYLLABLE 1]) (MAKE-FOOT [LAMBDA (DOMAIN) (* edited: " 8-Apr-82 15:44") (LIST (QUOTE FOOT) DOMAIN]) (ONSET [LAMBDA (SYLLABLE) (* kh: "31-Mar-82 20:33" posted: "31-Mar-82 20:37") (CAR SYLLABLE]) (PACKFEET [LAMBDA (FEET) (* edited: "11-Apr-82 18:16") (for ELT in old FEET bind PACKEDFEET first (SETQ ELT# (LENGTH FEET)) do [COND ((FOOT? ELT) (SETQ ELT (TRANSFORMFOOT ELT] [COND [(IGREATERP (LENGTH FEET) 1) (SETQ PACKEDFEET (APPEND PACKEDFEET ELT (LIST (QUOTE -] (T (SETQ PACKEDFEET (APPEND PACKEDFEET ELT] finally (RETURN PACKEDFEET]) (PACKWORD [LAMBDA (STRUC) (* pkh: " 7-Aug-84 15:45") (* Takes as input the structure field of a WORD-record and produces string output which goes back into the dictionary as a pronunciation) (for FOOT FLG RESULT in old STRUC join (COND [FLG (PROG1 (CONS (QUOTE \) (PACKFOOT FOOT] (T (SETQ FLG T) (PACKFOOT FOOT))) finally (RETURN (PROG1 (SETQ RESULT (PACK $$VAL)) (printout FOOTOUTPUTFILE RESULT T]) (PACKFOOT [LAMBDA (FOOT) (* pkh: " 7-Aug-84 15:28") (* Takes a foot and returns a string with syllable indications) (PROG [(SEGMENTS (COND ((type? FOOT FOOT) (fetch (FOOT SYLLABLES) of FOOT)) (T FOOT] (RETURN (for X in SEGMENTS join X]) (PARSE-1-WORD [LAMBDA (ARRAYENTRY PRINTTOTERMINAL) (* pkh: " 7-Aug-84 18:56") (* Top level function; Input is a LEXENTRY outputted by READLEXENTRY on PARSE-LEX; Output is a modified version of the PRON field of LEXENTRY which has foot indication; the RESULT is a string which can be substituted for the original pronunciation in the dictionary) (PROG ([BITTBL (MAKEBITTABLE (QUOTE (- < *] RESULT) (SETQ WREC (create WORD INPUT ← (fetch (LEXENTRY ORTH) of ARRAYENTRY))) (replace (WORD STRUCTURE) of WREC with (LISTIFY.SYLLABIFICATION (fetch (LEXENTRY PRON) of ARRAYENTRY) BITTBL)) (PARSE-WORD-RECORD WREC) (SETQ RESULT (PACKWORD (fetch STRUCTURE of WREC))) (COND (PRINTTOTERMINAL (printout FOOTOUTPUTFILE (fetch INPUT of WREC) .TAB 22 # RESULT T))) (RETURN RESULT]) (PARSE-TEST [LAMBDA (WREC) (* pkh: " 7-Aug-84 15:39") (PROGN (SYLLABLE-STACKER WREC) (* Takes word with syllables indicated by -, explodes the strings and puts them in reverse order under the property SYLLABLES) (STRESS WREC) (* Replace with English stress rule) (EDGEMARKER (fetch STRUCTURE of WREC)) (* Put the stress-indications on the list under the SYLLABLES property; ready to do a parse of feet) (replace STRUCTURE of WREC with (REVERSE (fetch STRUCTURE of WREC))) (* Get the syllables in the correct order (left-to-right)) (COND ((AND (BOUNDP DEBUG) DEBUG) (printout FOOTOUTPUTFILE WREC T))) (FOOT-PARSER WREC) (FOOT.DOMAINS WREC]) (FOOT.DOMAINS [LAMBDA (WREC) (* pkh: " 3-Aug-84 22:21") (PROG ((FEET (fetch STRUCTURE of WREC))) (create DOMAINS STRONG ← FEET]) (PENULTRULE [LAMBDA (SYLLABLE) (* pkh: " 7-Aug-84 16:55" posted: "30-Mar-82 21:38") (* Stresses a syllable if it is long, i.e. if it has a long vowel, or is closed (finnsonant)) (PROG [(LONG-VOWEL (SOME SYLLABLE (QUOTE LONG-VOWEL?] (COND ([OR (CONSONANT? (CAR (LAST SYLLABLE))) (REAL-LONG-VOWEL? LONG-VOWEL (ONSET (LASTSYLLABLE SYLLABLES] (* Stress the penult if it is closed or if it has a long-vowel provided it is not immediately succeeded by an initial-vowel in the next syllable) (RETURN (STRESS-SYLLABLE SYLLABLE 1))) (T NIL]) (PENULTSYLLABLE [LAMBDA (SYLLABLES) (* kh: "29-Mar-82 21:20" posted: "29-Mar-82 21:48") (* Returns the penultimate syllable of a word given the syllables of the word as input) (CADR SYLLABLES]) (PRETTYFOOT [LAMBDA (LONGFOOT) (* kh: "23-MAR-83 20:30") (for ELT in (COND ((type? DOMAINS LONGFOOT) (APPEND (fetch WEAK of LONGFOOT) (fetch STRONG of LONGFOOT))) (T LONGFOOT)) join [COND ((FOOT? ELT) (STRIPFOOT ELT)) ((LISTP (CAR ELT)) (PRETTYFOOT FOOT)) (T (CONS (QUOTE -) (APPEND ELT (LIST (QUOTE -] finally $$VAL]) (PRINTFOOT [LAMBDA (F) (* pkh: " 7-Aug-84 16:55") (COND [(type? DOMAINS F) (* We are at the first pass through PRINTFOOT; there is only one domain in a word) (COND ((fetch WEAK of F) (LEFT.WEAK.BRACKET) (PRINTFOOT (fetch WEAK of F)) (RIGHT.WEAK.BRACKET))) (COND ((fetch STRONG of F) (PRINTSTRONGFOOT (fetch STRONG of F] ((type? FOOT (CAR F)) (* Input must be a WEAK or a STRONG from a DOMAIN; There will be one or more feet, print them with vertical bars "\" in between) (for F FLG in F do (printout FOOTOUTPUTFILE "\") (PRINTFOOT F))) [(type? FOOT F) (for SYLLABLE FLG in (fetch SYLLABLES of F) do (COND (FLG (printout FOOTOUTPUTFILE (QUOTE -)) (PRINTFOOT SYLLABLE)) (T (SETQ FLG T) (PRINTFOOT SYLLABLE] (T (for ELT in F do (COND [(LISTP ELT) (for SOUND in ELT do (printout FOOTOUTPUTFILE (COND ((EQ SOUND 1) 1) (T SOUND] (T (printout FOOTOUTPUTFILE (COND ((EQ ELT 1) 1) (T ELT]) (LEFT.WEAK.BRACKET [LAMBDA NIL (* pkh: " 7-Aug-84 15:39") (FOOTSUBSCRIPT "a") (printout FOOTOUTPUTFILE # (DSPFONT FOOTFONT (TTYDISPLAYSTREAM)) "[") (DSPFONT FOOTFONT (TTYDISPLAYSTREAM]) (RIGHT.STRONG.BRACKET [LAMBDA NIL (* pkh: " 7-Aug-84 15:39") (printout FOOTOUTPUTFILE "]"]) (LEFT.STRONG.BRACKET [LAMBDA NIL (* pkh: " 7-Aug-84 15:39") (FOOTSUBSCRIPT "b") (printout FOOTOUTPUTFILE # (DSPFONT FOOTFONT (TTYDISPLAYSTREAM)) "[") (DSPFONT FOOTFONT (TTYDISPLAYSTREAM]) (LEFT.SYLLABLE.INCORPORATION [LAMBDA (SYLLABLES) (* pkh: " 6-Aug-84 17:30") (* Incorporate the unstressed syllable before a foot into the foot) (for SYLL KEEPER in old SYLLABLES collect (COND ((type? FOOT SYLL) SYLL) [(AND (STRESS? SYLL 0) (type? FOOT (CADR SYLLABLES))) (SETQ KEEPER SYLLABLES) (SETQ SYLLABLES (CDR SYLLABLES)) (MAKE-FOOT (APPEND (LIST SYLL) (fetch (FOOT SYLLABLES) of (CADR KEEPER] (T SYLL)) finally $$VAL]) (RIGHT.WEAK.BRACKET [LAMBDA NIL (* pkh: " 7-Aug-84 15:39") (printout FOOTOUTPUTFILE "]"]) (PRINTSTRONGFOOT [LAMBDA (STRONGFOOT) (* kh: "24-MAR-83 12:35") (LEFT.STRONG.BRACKET) (PRINTFOOT (fetch STRONG of FOOT)) (RIGHT.STRONG.BRACKET]) (PRUNE [LAMBDA (FOOT) (* edited: "12-Apr-82 02:21") (PRUNE1 (LEAVES FOOT]) (PRUNE1 [LAMBDA (TREE) (* edited: "13-Apr-82 23:57") (for LEAF in old TREE join (COND ((AND (EQUAL LEAF (QUOTE -)) (NOT $$VAL)) NIL) ([AND (EQUAL LEAF (QUOTE -)) (MEMBER (CADR TREE) (QUOTE (- %] %[] NIL) ((AND (OR (EQUAL LEAF (QUOTE %[)) (EQUAL LEAF (QUOTE %]))) (EQUAL (CADR TREE) (QUOTE -))) (SETQ TREE (CDR TREE)) (LIST LEAF)) ((AND (EQUAL LEAF (QUOTE -)) (NULL (CDR TREE))) NIL) (T (LIST LEAF))) finally $$VAL]) (REAL-LONG-VOWEL? [LAMBDA (SYLLABLETAIL NEXTONSET) (* kh: "31-Mar-82 20:27" posted: "31-Mar-82 20:37") (* Checks that the long-vowel isn't followed by a vowel-onset in the next syllable) (COND ((OR (IGREATERP (LENGTH SYLLABLETAIL) 1) (NOT (VOWEL? NEXTONSET))) SYLLABLETAIL) (T NIL]) (RUNFEET [LAMBDA NIL (* kh: "23-MAR-83 16:38") (LOAD (QUOTE {PHYLUM}<HALVORSEN>FOOT>DFOOT.DCOM)) (LOAD (QUOTE {PHYLUM}<HALVORSEN>FOOT>SYLLABLE.DCOM]) (SECONDARY-FOOT [LAMBDA (SYLLABLES) (* pkh: " 7-Aug-84 16:24") (* Makes a foot of a domain consisting of a secondary stress and following unstressed syllables up to a stress or a foot) (for SYLLABLE-TAIL on old SYLLABLES bind AFTER-STRESS-STRETCH FOOT-SECONDARY-UPTO-STRESS collect (COND ([AND (NOT (type? FOOT (CAR SYLLABLE-TAIL))) (STRESS? (CAR SYLLABLE-TAIL) 2) (SETQ AFTER-STRESS-STRETCH (FIND-STRESS (CDR SYLLABLE-TAIL] [SETQ FOOT-SECONDARY-UPTO-STRESS (CONS (CAR SYLLABLE-TAIL) (REVERSE (CDR (REVERSE AFTER-STRESS-STRETCH] (* Recurse down the syllable-tail until a 3 stress is found, if FIND-1-STRESS can find a 1 stress on the tail then make this domain of a 3 and 1 stress into a foot pop it off the stack (i.e. remainder)) [SETQ SYLLABLES (NTH SYLLABLES (MAX 1 (SUB1 (LENGTH FOOT-SECONDARY-UPTO-STRESS] (MAKE-FOOT FOOT-SECONDARY-UPTO-STRESS)) ((AND (NOT (type? FOOT (CAR SYLLABLE-TAIL))) (STRESS? (CAR SYLLABLE-TAIL) 2)) (SETQ AFTER-STRESS-STRETCH (FIND-BOUNDARY (CDR SYLLABLE-TAIL))) (SETQ FOOT-SECONDARY-UPTO-STRESS (CONS (CAR SYLLABLE-TAIL) AFTER-STRESS-STRETCH)) (* Recurse down the syllable-tail until a 3 stress is found, if FIND-1-STRESS can find a 1 stress on the tail then make this domain of a 3 and 1 stress into a foot pop it off the stack (i.e. remainder)) (SETQ SYLLABLES (NTH SYLLABLES (LENGTH FOOT-SECONDARY-UPTO-STRESS))) (MAKE-FOOT FOOT-SECONDARY-UPTO-STRESS)) (T (* If we don't find a foot return the syllable at top of the stack unchanged) (CAR SYLLABLE-TAIL))) finally (RETURN $$VAL]) (SECONDARY-STRESS [LAMBDA (SYLLABLE) (* kh: "29-Mar-82 16:40" posted: "29-Mar-82 16:43") (STRESS-VOWEL SYLLABLE 2]) (STRESS [LAMBDA (WREC) (* pkh: " 7-Aug-84 16:57" posted: "29-Mar-82 16:46") (* Top-level function for stress-assignment. Takes a word (with the morphological information stripped off) and assigns stress to the syllables of the word according to the stress-rules. Outputs the word on the terminal and stores the stress-indication (PRINT-STRESSED-WORD)) (PROG ((SYLLABLES (fetch STRUCTURE of WREC)) (SYLLABLE# (fetch SYLLABLE# of WREC))) (COND ((EQ SYLLABLE# 1) (STRESS-SYLLABLE (LASTSYLLABLE SYLLABLES) 1) (RETURN WREC)) ((VVAS.RULE (LASTSYLLABLE SYLLABLES)) (RETURN WREC))) (* If it is a monosyllable, stress it and quit, else see if there is a long vowel in the last syllable) (COND ((EQ SYLLABLE# 2) (STRESS-SYLLABLE (PENULTSYLLABLE SYLLABLES) 1) (RETURN WREC)) ((PENULTRULE (PENULTSYLLABLE SYLLABLES)) (RETURN WREC))) (* If it is a diasyllable (which didn't match the VVAS.RULE) stress the penult, for longer words see if the PENTULTRULE (long V or closed syllable) is matched) (STRESS-SYLLABLE (ANTEPENULTSYLLABLE SYLLABLES) 1) (for SYLL in SYLLABLES do (COND ((MARKED.STRONG SYLL) (* REMOVE.MARK SYLL) (STRESS-SYLLABLE SYLL 1))) finally (RETURN WREC)) (* If everything else fails the antepenult gets the stress) (RETURN WREC]) (STRESS&STRIP [LAMBDA (WORD) (* kh: " 7-Apr-82 00:35" posted: " 7-Apr-82 00:40") (* Takes a word, strips off the category indication and puts it on the property-list of the word (minus the /<cat>) under the property name CAT) (PROG ((STRIPPED-WORD (CATEGORIZE WORD))) (SYLLABLE-STACKER STRIPPED-WORD) (STRESS STRIPPED-WORD) (PUTPROP STRIPPED-WORD 'SYLLABLES (REVERSE (GETP STRIPPED-WORD 'SYLLABLES))) (RETURN STRIPPED-WORD]) (STRESS-SYLLABLE [LAMBDA (SYLLABLE STRESS) (* kh: " 4-APR-83 21:00" posted: "30-Mar-82 20:52") (* Smashes STRESS, which should be an integer (3 for main stress, 2 for secondary and 1 for tertiary), onto the end of the list of characters which represents the syllable) (NCONC SYLLABLE (LIST STRESS]) (STRESS-VOWEL [LAMBDA (SYLLABLE STRESS) (* kh: "29-Mar-82 16:37" posted: "29-Mar-82 16:44") (* Iterate down the segments in the syllable, if it isn't a vowel put it at the end of the list TEMP, and set REST to the remainder of the syllable; if it is a vowel splice in the stress (an integer) in a list inbetween TEMP (the front) and (CDR REST)) (for SEGMENT in SYLLABLE bind (TEMP (REST ← SYLLABLE)) do [COND ((NOT (VOWEL? SEGMENT)) (SETQ TEMP (APPEND TEMP (LIST SEGMENT))) (SETQ REST (CDR REST))) (T (RETURN (APPEND TEMP (CONS SEGMENT (CONS STRESS (CDR REST] finally (COND ((NULL $$VAL) (SHOULDNT]) (MAINSTRESS.FOOT [LAMBDA (FOOT) (* pkh: " 7-Aug-84 16:57") (for SYLLABLE in (CADR FOOT) thereis (STRESS? SYLLABLE 1]) (STRESS? [LAMBDA (SYLLABLE STRESS#) (* pkh: " 7-Aug-84 15:06") (* Returns the stress# if a syllable is stressed, returns NIL if the syllable is empty and 0 if the stress# is 0 and the syllable is infact unstressed) (COND ((EQ NIL SYLLABLE) (* Didn't find a stress) NIL) ((OR [AND (ZEROP STRESS#) (NOT (NUMBERP (CAR (LAST.BUT.NOT.SEPR SYLLABLE] (EQUAL (CAR (LAST.BUT.NOT.SEPR SYLLABLE)) STRESS#)) (* If STRESS# is 0 then we are looking for an UNstressed syllable, therefore we return a non-nil value (i.e. STRESS#) when there is no stress indication (i.e. no number at the end of the list of segments)) (* If the STRESS# is a number other than 0 then return the STRESS# when we find its match at the end of the segment list) STRESS#) (T NIL]) (STRIPFOOT [LAMBDA (FOOT) (* kh: "23-MAR-83 19:16") < (QUOTE %[) ! (PRETTYFOOT FOOT:2) (QUOTE %]) >]) (SYLLABLE-STACKER [LAMBDA (WREC) (* kh: " 4-APR-83 20:43" posted: "29-Mar-82 15:09") (* edited: "10-Apr-82 03:47") (* Finds the syllables in a word (no morphological info (/-info) allowed) and puts them (represented as a list of characters) last syllable first on a stack on the the property list of the word under the property-name SYLLABLES. The property-name SYLLABLE# gives the number of syllables in the word) (PROG (SYLLABLE-STACK SYLLABLE# (BPOS 0) EPOS (SYLLABIFIEDWORD (fetch STRUCTURE of WREC))) (* The STRUCTURE of the word is at this point simply the syllabified version of the word (hyphens indicating syllabification)) (while BPOS count (COND ((SETQ EPOS (STRPOS (QUOTE -) SYLLABIFIEDWORD (ADD1 BPOS))) (* if - is found put the material from the beginning of the word or the last - on the syllable stack, and set BPOS to the character-position where the search is to resume) [push SYLLABLE-STACK (UNPACK (SUBSTRING SYLLABIFIEDWORD (ADD1 BPOS) (SUB1 EPOS] (SETQ BPOS EPOS)) (T (* - hasn't been found; put whole word or rest of word on the syllable-stack and set BPOS to NIL so we quit) (push SYLLABLE-STACK (UNPACK (SUBSTRING SYLLABIFIEDWORD (ADD1 BPOS) NIL))) (SETQ BPOS EPOS))) finally ((replace STRUCTURE of WREC with SYLLABLE-STACK) (replace SYLLABLE# of WREC with (ADD1 $$VAL]) (TERTIARY-STRESS [LAMBDA (SYLLABLE) (* kh: "29-Mar-82 16:40" posted: "29-Mar-82 16:43") (STRESS-VOWEL SYLLABLE 1]) (TEST-FUNCTION [LAMBDA (WORDLIST) (* pkh: " 7-Aug-84 15:39" posted: " 7-Apr-82 00:08") (for WORD in WORDLIST do (PROG ((TEMP (CATEGORIZE WORD))) (TEST-STRESSER TEMP) (EDGEMARKER TEMP) (COND ((AND (BOUNDP DEBUG) DEBUG) (printout FOOTOUTPUTFILE T (REVERSE (GETP TEMP (QUOTE SYLLABLES))) T]) (TEST-STRESSER [LAMBDA (WORD) (* pkh: " 7-Aug-84 15:39" posted: "30-Mar-82 21:40") (* Test-function for the foot-parser, extendable) (CATEGORIZE WORD) (SYLLABLE-STACKER WORD) (STRESS WORD) (COND ((AND (NEQ (QUOTE NOBIND) (EVALV (QUOTE DEBUG))) DEBUG) (printout FOOTOUTPUTFILE , WORD (QUOTE " has the stress pattern") , , , , (REVERSE (GETP WORD (QUOTE SYLLABLES))) T]) (TRANSFORMFOOT [LAMBDA (FOOT) (* edited: "10-Apr-82 19:02") (PROG (TEMP) (RETURN (COND ((EQ ELT# 1) (PACKFEET (CADR FOOT))) (T (SETQ TEMP (CONS (QUOTE %[) (APPEND (PACKFEET (CADR FOOT)) (LIST (QUOTE %]]) (VOWEL? [LAMBDA (SEGMENT) (* kh: "29-Mar-82 13:33" posted: "28-Mar-82 23:10") (* Checks if segment is a vowel according to VOWELS. Returns the vowel or NIL) (COND ((MEMBER SEGMENT VOWELS) SEGMENT) (T NIL]) ) (DEFINEQ (DEBUG [LAMBDA (FLG) (GLOBALVARS DEBUG) DEBUG←FLG]) (FOOTSUBSCRIPT [LAMBDA (X) (* kh: " 6-APR-83 21:09") (* Prints X as a subscript in the LFGSMALLFONT) (DECLARE (GLOBALVARS FOOTSUBFONT FOOTSUBOFFSET)) (RELMOVETO 0 (IMINUS FOOTSUBOFFSET) (TTYDISPLAYSTREAM)) (RESETFORM (DSPFONT FOOTSUBFONT (TTYDISPLAYSTREAM)) (PRIN1 X)) (RELMOVETO 0 FOOTSUBOFFSET (TTYDISPLAYSTREAM]) (MARKED.STRONG [LAMBDA (SYLLABLE) (* pkh: " 3-Aug-84 18:10" posted: "29-Mar-82 21:33") (* COND ((MEMBER NIL) (for SOUND in SYLLABLE collect SOUND unless (EQ (QUOTE (QUOTE NIL) SOUND))))) (DREMOVE NIL SYLLABLE]) (SETUP.FOOTWINDOW [LAMBDA NIL (* kh: " 6-APR-83 21:18") (PROG ((W (CREATEW (create REGION LEFT ← 10 BOTTOM ← 15 WIDTH ← 560 HEIGHT ← 370) "Prosodic Structure"))) (DSPRIGHTMARGIN 32000 W) (RETURN W]) (FOOTFONTS [LAMBDA (FONT) (* pkh: " 9-Aug-84 11:22") (DECLARE (GLOBALVARS FOOTFONT FOOTSUBFONT FOOTSUBOFFSET)) (SELECTQ FONT (LARGE FONT← (QUOTE (GACHA 12))) ((SMALL NIL) FONT← (QUOTE (GACHA 10))) NIL) FOOTFONT← (FONTCREATE FONT) FOOTSUBFONT← (FONTCREATE (QUOTE (HIPPO 10))) FOOTSUBOFFSET← (FONTPROP FOOTFONT (QUOTE SIZE))/2 (DSPFONT FONT (TTYDISPLAYSTREAM]) (DEFAULT.FOOT [LAMBDA (SYLLABLES) (* pkh: " 7-Aug-84 16:40") (* Looks at individual syllables; the variable SYLL holds the syllables/feet) (* Finds a final syllable, whether it is in a foot or on its own and makes a foot of it if there is a tense vowel) (for SYLL TEMP LASTINFOOT in old SYLLABLES join (COND [[AND (type? FOOT SYLL) (NULL (CDR SYLLABLES)) (NEQ 1 (LENGTH (SETQ TEMP (fetch (FOOT SYLLABLES) of SYLL] (* The final syllable is in a foot; look inside it) (SETQ LASTINFOOT (CAR (LAST TEMP))) (COND [(NOT (OR (MEMBER (QUOTE x) LASTINFOOT) (MEMBER (QUOTE %|) LASTINFOOT) (MEMBER (QUOTE i) LASTINFOOT) (MEMBER (QUOTE I) LASTINFOOT) (MEMBER (QUOTE E) LASTINFOOT) (MEMBER (QUOTE ↑) LASTINFOOT) (MEMBER (QUOTE U) LASTINFOOT) (MEMBER (QUOTE N) LASTINFOOT) (MEMBER (QUOTE X) LASTINFOOT) (MEMBER (QUOTE L) LASTINFOOT) (MEMBER (QUOTE M) LASTINFOOT) (MEMBER (QUOTE N) LASTINFOOT) (MEMBER (QUOTE R) LASTINFOOT))) (LIST [MAKE-FOOT (REVERSE (CDR (REVERSE TEMP] (MAKE-FOOT (LIST LASTINFOOT] (T (LIST SYLL] [[AND (NOT (type? FOOT SYLL)) (NULL (CDR SYLLABLES)) (NOT (OR (MEMBER (QUOTE x) LASTINFOOT) (MEMBER (QUOTE %|) LASTINFOOT) (MEMBER (QUOTE i) LASTINFOOT) (MEMBER (QUOTE I) LASTINFOOT) (MEMBER (QUOTE E) LASTINFOOT) (MEMBER (QUOTE ↑) LASTINFOOT) (MEMBER (QUOTE U) LASTINFOOT) (MEMBER (QUOTE N) LASTINFOOT) (MEMBER (QUOTE X) LASTINFOOT) (MEMBER (QUOTE L) LASTINFOOT) (MEMBER (QUOTE M) LASTINFOOT) (MEMBER (QUOTE N) LASTINFOOT) (MEMBER (QUOTE R) LASTINFOOT] (* The final syllable is not in a foot and it is tense) (LIST (MAKE-FOOT (LIST SYLL] (T (LIST SYLL))) finally $$VAL]) ) (* Functions to parse feet) (RPAQQ CONSONANTS (w r t T y p s S d D f g G h J k l z Z C v b n m)) (RPAQQ FOOT-RULES ((FALLING-FOOT) FALLING-FOOT HEAVY-SYLLABLE-FOOT ANAPEST-FOOT)) (RPAQQ FOOTFILES (SYLLABLE)) (RPAQQ FOOTOUTPUTFILE T) (RPAQQ LONG-CONSONANTS (G)) (RPAQQ LONG-VOWELS (A e u Y i o W)) (RPAQQ NAMEFILES (<LFG.PARSER>LFG.NAMES)) (RPAQQ VOWELS (@ ↑ e E u U i I o O a A R L N c Y W x)) (RPAQQ TEST-WORDS (bi b@-bxl/v beb be-bxl b@-bun bx-bUS-kx be-bi b@-kx-lc-ri-xt b@-kx-nel-yx b@-Cx-lR b@-Cx-lE-ri bx-sI-lxs b@k b@k-fild/c b@k-g@-mxn b@k-rEst/c b@k-sAd/c b@k-spIn/c b@k-wcS/c be-kxn b@k-tI-ri-a-lx-Ji b@k-tI-ri-xm b@d/a bed/v b@J b@-JR b@d-x-naZ b@d-mIn-txn b@-fxl/v b@g bx-g@s b@-gx-tEl be-gxl JRnLIstIk J↑kstxpoz JuJItsu xt@lyxn @bxtwar xt bl@ndISmxnt bl@Gkxt bl@st bletNt blit)) (RPAQQ Z (JRnLIstIk J↑kstxpoz/a JuJItsu xt@lyxn @bxtwar xt bl@ndISmxnt bl@Gkxt bl@st bletNt blit)) (ADDTOVAR FOOTFILES SYLLABLE) (ADDTOVAR FOOT-RULES (FALLING-FOOT)) [DECLARE: EVAL@COMPILE (TYPERECORD DOMAINS (NONFOOT WEAK STRONG)) (TYPERECORD FOOT (SYLLABLES)) (TYPERECORD WORD (INPUT SPELLING TRANSCRIPTION STRUCTURE CATEGORY SYLLABLE#)) ] (PUTPROPS DFOOT COPYRIGHT ("XEROX" 1984)) (DECLARE: DONTCOPY (FILEMAP (NIL (1499 36047 (ANAPEST-FOOT 1509 . 2375) (ANTEPENULTSYLLABLE 2377 . 2702) (CATEGORIZE 2704 . 3930) (CONSONANT? 3932 . 4252) (COUNTTHEM 4254 . 4469) (VVAS.RULE 4471 . 5569) (EDGEMARKER 5571 . 6065) (FALLING-FOOT 6067 . 8333) (FIND-BOUNDARY 8335 . 8638) (FIND-1-STRESS 8640 . 9164) (FIND-STRESS 9166 . 10174) (FOOT-PARSER 10176 . 11700) (FOOT? 11702 . 11899) (HEAVY-SYLLABLE-FOOT 11901 . 12769) ( LAST.BUT.NOT.SEPR 12771 . 13022) (HEAVY-SYLLABLE? 13024 . 13530) (LASTSYLLABLE 13532 . 13687) ( LOADFOOT 13689 . 14518) (LONG-VOWEL? 14520 . 14919) (MAINSTRESS 14921 . 15301) (MAKE-FOOT 15303 . 15447) (ONSET 15449 . 15596) (PACKFEET 15598 . 16080) (PACKWORD 16082 . 16725) (PACKFOOT 16727 . 17159 ) (PARSE-1-WORD 17161 . 18162) (PARSE-TEST 18164 . 19174) (FOOT.DOMAINS 19176 . 19388) (PENULTRULE 19390 . 20133) (PENULTSYLLABLE 20135 . 20463) (PRETTYFOOT 20465 . 20954) (PRINTFOOT 20956 . 22306) ( LEFT.WEAK.BRACKET 22308 . 22577) (RIGHT.STRONG.BRACKET 22579 . 22735) (LEFT.STRONG.BRACKET 22737 . 23008) (LEFT.SYLLABLE.INCORPORATION 23010 . 23705) (RIGHT.WEAK.BRACKET 23707 . 23861) (PRINTSTRONGFOOT 23863 . 24087) (PRUNE 24089 . 24225) (PRUNE1 24227 . 24862) (REAL-LONG-VOWEL? 24864 . 25297) (RUNFEET 25299 . 25513) (SECONDARY-FOOT 25515 . 27462) (SECONDARY-STRESS 27464 . 27637) (STRESS 27639 . 29391) (STRESS&STRIP 29393 . 29952) (STRESS-SYLLABLE 29954 . 30324) (STRESS-VOWEL 30326 . 31074) ( MAINSTRESS.FOOT 31076 . 31267) (STRESS? 31269 . 32209) (STRIPFOOT 32211 . 32386) (SYLLABLE-STACKER 32388 . 34198) (TERTIARY-STRESS 34200 . 34372) (TEST-FUNCTION 34374 . 34833) (TEST-STRESSER 34835 . 35377) (TRANSFORMFOOT 35379 . 35689) (VOWEL? 35691 . 36045)) (36048 40124 (DEBUG 36058 . 36123) ( FOOTSUBSCRIPT 36125 . 36598) (MARKED.STRONG 36600 . 36946) (SETUP.FOOTWINDOW 36948 . 37280) (FOOTFONTS 37282 . 37768) (DEFAULT.FOOT 37770 . 40122))))) STOP