home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
snobol4
/
aisnobol.arc
/
ENDING.SPT
< prev
next >
Wrap
Text File
|
1987-10-16
|
4KB
|
116 lines
* ENDING.SPT -- SPITBOL Version
*
* Analysis of English Endings
*
* SNO8OL4 implementation of flowchart on p. 74 of
* Winograd, T. Understanding Natural Language.
* New York: Academic Press, 1972.
*
* To run:
* spitbol ending.spt <ending.in
*
&TRIM = 1
LCASE = "abcdefghijklmnopqrstuvwxyz"
UCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
DEFINE('WORDEND(WORD)L,VOWEL,DOUBLE,LIQUID,NOEND')
DEFINE('MATCH(L,PAT)')
DEFINE('CUT(N)')
DEFINE('ADDON(X)')
DEFINE('TRY()')
:(WORDEND.END)
*
WORDEND
WRD = WORD
DOUBLE = (LEN(1) $ L) *L RPOS(0)
LIQUID = ANY("LRSVZ")
NOEND = ANY("CGSVZ")
VOWEL = ANY("AEIOUY")
*
WRD
+ ("N'T" | "'S" | "S'" | "S" | "LY" |
+ "ING" | "ED" | "EN" | "ER" | "EST")
+ $ WEND RPOS(0) = :F(WTRY)
*
WEND POS(0) ("S" | "'S" | "S'" | "N'T") RPOS(0)
+ :F(WORDEND.1)
*
MATCH(1,"E") :F(WTRY)
MATCH(2,"I") CUT(2) ADDON("Y") :S(WTRY)
MATCH(2,"TH") :S(WTRY)
MATCH(2,ANY("HX")) CUT(1) :S(WTRY)
MATCH(2,ANY("SZ") ANY("SZ")) CUT(1) :S(WTRY)
MATCH(2,ANY("SZ")) :S(WTRY)
MATCH(2,"V") :F(WTRY)
~TRY() CUT(2) ADDON("FE") :S(WTRY)F(RETURN)
*
WORDEND.1
IDENT(WEND,"LY") :F(WORDEND.2)
MATCH(1,"I") CUT(1) ADDON("Y") :S(WTRY)
~TRY() ADDON("LE") :S(WTRY)F(RETURN)
*
WORDEND.2
MATCH(1,VOWEL) :F(WORDEND.3)
MATCH(1,"I") CUT(1) ADDON("Y") :S(WTRY)
MATCH(1,"Y") :S(WTRY)
~MATCH(1,"E") ADDON("E") :S(WTRY)
MATCH(2,"E") :S(WTRY)
~TRY() ADDON("E") :S(WTRY)F(RETURN)
*
WORDEND.3
MATCH(1,"H") :F(WORDEND.4)
MATCH(2,"T") :F(WTRY)
~TRY() ADDON("E") :S(WTRY)F(RETURN)
*
WORDEND.4
WRD DOUBLE :F(WORDEND.5)
~MATCH(1,LIQUID) CUT(1) :S(WTRY)
~TRY() CUT(1) :S(WTRY)F(RETURN)
*
WORDEND.5
MATCH(2,VOWEL) :S(WORDEND.6)
MATCH(1,"RL") :S(WTRY)
MATCH(1,LIQUID | NOEND) ADDON("E") :(WTRY)
*
WORDEND.6
~MATCH(3,VOWEL) ADDON("E") :S(WTRY)
MATCH(1,NOEND) ADDON("E") :(WTRY)
*
WTRY TRY() :S(RETURN)F(FRETURN)
*
*
*
MATCH
WRD PAT RPOS(L - 1) :S(RETURN)F(FRETURN)
*
CUT
WRD RPOS(N) REM = :(RETURN)
*
ADDON
WRD = WRD X :(RETURN)
*
TRY
DIFFER(DICTIONARY<WRD>) :S(RETURN)F(FRETURN)
*
WORDEND.END
*
*
* Main program starts here
*
DICTIONARY = TABLE(101)
WORDS =
+ 'BASH,BATHE,LEAN,LEAVE,DENT,DANCE,DOG,KISS,CURVE,'
+ 'CURL,ROT,ROLL,PLAY,PLY,REAL,PALE,KNIFE,PRETTY,'
+ 'NOBLE,PATROL,'
DICT.LOOP
WORDS BREAK(',') . W LEN(1) = :F(DICT.LOOP.END)
DICTIONARY<W> = 1 :(DICT.LOOP)
DICT.LOOP.END
*
SETEXIT(.CONTINUE)
READ W = REPLACE(INPUT,LCASE,UCASE) :F(END)
WORDEND(W)
OUTPUT = WRD :(READ)
END