home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / snobol / aisnobol / wang.spt < prev   
Text File  |  1987-10-16  |  3KB  |  88 lines

  1. *  WANG.SPT - SPITBOL Version
  2. *
  3. * Wang's algorlthm
  4. *
  5. * Adapted from
  6. *      Griswold, R. E., Poage, J. F., & Polonsky, I. P.
  7. *          The SNOBOL4 Programming Language.
  8. *          Pp. 183-185.
  9. *
  10. * To run:
  11. * spitbol wang.spt <wang.in
  12. *
  13.  DEFINE('WANG(ANTECEDENT,CONSEQUENT)PHI,PSI')
  14.  UNOP = 'NOT'
  15.  BINOP  = ('AND' | 'IMP' | 'OR' | 'EQU')
  16.  UNOP.FORMULA = ' ' (UNOP . OP) '(' (BAL . PHI) ')'
  17.  BINOP.FORMULA = ' ' (BINOP . OP) '(' (BAL . PHI) ','
  18. +                    (BAL . PSI) ')'
  19.  FORMULA = UNOP.FORMULA | BINOP.FORMULA
  20.  ATOM = (NOTANY(' ') (BREAK(' ') | REM)) . A
  21. +                                               :(WANG.END)
  22. *
  23. WANG
  24.        OUTPUT = ANTECEDENT ' >>> ' CONSEQUENT
  25.        ANTECEDENT FORMULA = NULL
  26. +             :F(WANG1)S( $('WANG.A.' OP) )
  27. WANG.A.NOT
  28.        WANG(ANTECEDENT, CONSEQUENT ' ' PHI)
  29. +          :S(RETURN)F(FRETURN)
  30. WANG.A.AND
  31.        WANG(ANTECEDENT ' ' PHI ' ' PSI, CONSEQUENT)
  32. +          :S(RETURN)F(FRETURN)
  33. WANG.A.OR
  34.        WANG(ANTECEDENT ' ' PHI, CONSEQUENT)     :F(FRETURN)
  35.        WANG(ANTECEDENT ' ' PSI, CONSEQUENT)
  36. +          :S(RETURN)F(FRETURN)
  37. WANG.A.IMP
  38.        WANG(ANTECEDENT ' ' PSI, CONSEQUENT)     :F(FRETURN)
  39.        WANG(ANTECEDENT, CONSEQUENT ' ' PHI)
  40. +          :S(RETURN)F(FRETURN)
  41. WANG.A.EQU
  42.        WANG(ANTECEDENT ' ' PHI ' ' PSI, CONSEQUENT)
  43. +        :F(FRETURN)
  44.        WANG(ANTECEDENT, CONSEQUENT ' ' PHI ' ' PSI)
  45. +          :S(RETURN)F(FRETURN)
  46. WANG1
  47.        CONSEQUENT FORMULA =
  48. +          :F(WANG2)S( $('WANG.C.' OP) )
  49. WANG.C.NOT
  50.        WANG(ANTECEDENT ' ' PHI, CONSEQUENT)
  51. +          :S(RETURN)F(FRETURN)
  52. WANG.C.AND
  53.        WANG(ANTECEDENT, CONSEQUENT ' ' PHI)       :F(FRETURN)
  54.        WANG(ANTECEDENT, CONSEQUENT ' ' PSI)
  55. +          :S(RETURN)F(FRETURN)
  56. WANG.C.OR
  57.        WANG(ANTECEDENT, CONSEQUENT ' ' PHI ' ' PSI)
  58. +          :S(RETURN)F(FRETURN)
  59. WANG.C.IMP
  60.        WANG(ANTECEDENT ' ' PHI, CONSEQUENT ' ' PSI)
  61. +         :S(RETURN)F(FRETURN)
  62. WANG.C.EQU
  63.        WANG(ANTECEDENT ' ' PHI, CONSEQUENT ' ' PSI)
  64. +        :F(FRETURN)
  65.        WANG(ANTECEDENT ' ' PSI, CONSEQUENT ' ' PHI)
  66. +        :S(RETURN)F(FRETURN)
  67. WANG2
  68.        ANTECEDENT ATOM =                          :F(FRETURN)
  69.        CONSEQUENT A                               :S(RETURN)F(WANG2)
  70. WANG.END
  71. *
  72. *
  73. *
  74.  &ANCHOR = 0
  75.  &TRIM  = 1
  76.  SETEXIT(.CONTINUE)
  77. *
  78. READ
  79.        EXPRESSION = INPUT                         :F(END)
  80.        OUTPUT =
  81.        OUTPUT = 'FORMULA:  ' EXPRESSION
  82.        OUTPUT =
  83.        OUTPUT = WANG( NULL, ' ' EXPRESSION ) 'VALID'
  84. +        :S(READ)
  85.        OUTPUT = 'INVALID'
  86. +        :(READ)
  87. END
  88.