home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / snobol / aisnobol / ending.spt < prev    next >
Text File  |  1987-10-16  |  4KB  |  116 lines

  1. * ENDING.SPT -- SPITBOL Version
  2. *
  3. * Analysis of English Endings
  4. *
  5. * SNO8OL4 implementation of flowchart on p. 74 of
  6. *     Winograd, T.  Understanding Natural Language.
  7. *           New York:  Academic Press, 1972.
  8. *
  9. *    To run:
  10. *      spitbol ending.spt <ending.in
  11. *
  12.  &TRIM = 1
  13.  LCASE = "abcdefghijklmnopqrstuvwxyz"
  14.  UCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  15.  
  16.  DEFINE('WORDEND(WORD)L,VOWEL,DOUBLE,LIQUID,NOEND')
  17.  DEFINE('MATCH(L,PAT)')
  18.  DEFINE('CUT(N)')
  19.  DEFINE('ADDON(X)')
  20.  DEFINE('TRY()')
  21.             :(WORDEND.END)
  22. *
  23. WORDEND
  24.         WRD = WORD
  25.         DOUBLE = (LEN(1) $ L) *L RPOS(0)
  26.         LIQUID = ANY("LRSVZ")
  27.         NOEND = ANY("CGSVZ")
  28.         VOWEL = ANY("AEIOUY")
  29. *
  30.         WRD
  31. +       ("N'T" | "'S" | "S'" | "S" | "LY" |
  32. +        "ING" | "ED" | "EN" | "ER" | "EST")
  33. +        $ WEND RPOS(0) =                          :F(WTRY)
  34. *
  35.         WEND POS(0) ("S" | "'S" | "S'" | "N'T") RPOS(0)
  36. +                                                 :F(WORDEND.1)
  37. *
  38.         MATCH(1,"E")                              :F(WTRY)
  39.         MATCH(2,"I") CUT(2) ADDON("Y")            :S(WTRY)
  40.         MATCH(2,"TH")                             :S(WTRY)
  41.         MATCH(2,ANY("HX")) CUT(1)                 :S(WTRY)
  42.         MATCH(2,ANY("SZ") ANY("SZ")) CUT(1)       :S(WTRY)
  43.         MATCH(2,ANY("SZ"))                        :S(WTRY)
  44.         MATCH(2,"V")                              :F(WTRY)
  45.         ~TRY() CUT(2) ADDON("FE")                 :S(WTRY)F(RETURN)
  46. *
  47. WORDEND.1
  48.         IDENT(WEND,"LY")                          :F(WORDEND.2)
  49.         MATCH(1,"I") CUT(1) ADDON("Y")            :S(WTRY)
  50.         ~TRY() ADDON("LE")                        :S(WTRY)F(RETURN)
  51. *
  52. WORDEND.2
  53.         MATCH(1,VOWEL)                            :F(WORDEND.3)
  54.         MATCH(1,"I") CUT(1) ADDON("Y")            :S(WTRY)
  55.         MATCH(1,"Y")                              :S(WTRY)
  56.         ~MATCH(1,"E") ADDON("E")                  :S(WTRY)
  57.         MATCH(2,"E")                              :S(WTRY)
  58.         ~TRY() ADDON("E")                         :S(WTRY)F(RETURN)
  59. *
  60. WORDEND.3
  61.         MATCH(1,"H")                              :F(WORDEND.4)
  62.         MATCH(2,"T")                              :F(WTRY)
  63.         ~TRY() ADDON("E")                         :S(WTRY)F(RETURN)
  64. *
  65. WORDEND.4
  66.         WRD DOUBLE                                :F(WORDEND.5)
  67.         ~MATCH(1,LIQUID) CUT(1)                   :S(WTRY)
  68.         ~TRY() CUT(1)                             :S(WTRY)F(RETURN)
  69. *
  70. WORDEND.5
  71.         MATCH(2,VOWEL)                            :S(WORDEND.6)
  72.         MATCH(1,"RL")                             :S(WTRY)
  73.         MATCH(1,LIQUID | NOEND) ADDON("E")        :(WTRY)
  74. *
  75. WORDEND.6
  76.         ~MATCH(3,VOWEL) ADDON("E")                :S(WTRY)
  77.         MATCH(1,NOEND) ADDON("E")                 :(WTRY)
  78. *
  79. WTRY    TRY()                                     :S(RETURN)F(FRETURN)
  80. *
  81. *
  82. *
  83. MATCH
  84.         WRD PAT RPOS(L - 1)                       :S(RETURN)F(FRETURN)
  85. *
  86. CUT
  87.         WRD RPOS(N) REM =                         :(RETURN)
  88. *
  89. ADDON
  90.         WRD = WRD X                               :(RETURN)
  91. *
  92. TRY
  93.         DIFFER(DICTIONARY<WRD>)                   :S(RETURN)F(FRETURN)
  94. *
  95. WORDEND.END
  96. *
  97. *
  98. * Main program starts here
  99. *
  100.  DICTIONARY = TABLE(101)
  101.  WORDS  =
  102. +     'BASH,BATHE,LEAN,LEAVE,DENT,DANCE,DOG,KISS,CURVE,'
  103. +     'CURL,ROT,ROLL,PLAY,PLY,REAL,PALE,KNIFE,PRETTY,'
  104. +     'NOBLE,PATROL,'
  105. DICT.LOOP
  106.        WORDS BREAK(',') . W LEN(1) =              :F(DICT.LOOP.END)
  107.        DICTIONARY<W> = 1                          :(DICT.LOOP)
  108. DICT.LOOP.END
  109. *
  110.        SETEXIT(.CONTINUE)
  111.  
  112. READ   W = REPLACE(INPUT,LCASE,UCASE)             :F(END)
  113.        WORDEND(W)
  114.        OUTPUT = WRD                               :(READ)
  115. END
  116.