home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / windows / winlisp.zip / OOPL.LZH / PARSER.WL < prev    next >
Lisp/Scheme  |  1989-03-12  |  4KB  |  92 lines

  1. ;===============================================================================
  2. ;
  3. ;             T O P    D O W N    P A R S I N G
  4. ;
  5. ; Let's give the grammar objects a behavior so we can use them to perform
  6. ; top-down parsing on a token stream.
  7. ;===============================================================================
  8.  
  9. [{Class} new 'name 'MetaParser
  10.     'superClass    {Class}
  11.         'methods    '(
  12. new ((grammarFileName)    [[super new] initialize grammarFileName])
  13. )]
  14.  
  15. [{AbstractClass} new 'name 'Parser
  16.     'superClass        {Object}
  17.         'instanceVariables    '(grammar)
  18.         'methods        '(
  19. initialize ((grammarFileName)    
  20.         (setf #Igrammar [{Grammar} new grammarFileName])
  21.                 self)
  22.  
  23. parse ((aTokenStream grammarElementName)
  24.              (or  [#Igrammar element grammarElementName]
  25.                   (error "{Parser}:parse"
  26.                          "not a grammar element" grammarElementName))
  27.              ;; ACTUAL PARSING IS TO BE IMPLEMENTED BY SUBCLASSES
  28.              )
  29. )]
  30.       
  31. [{MetaParser} new 'name 'TopDownParser
  32.     'superClass    {Parser}
  33.         'methods    '(
  34. parse ((aTokenStream grammarElementName)
  35.           [[super parse aTokenStream grammarElementName]
  36.               match aTokenStream])
  37. )]
  38.  
  39. [{AbstractNonTerminal} addMethod
  40. 'match '((tokenStream)
  41.          (let ( (savedPosition [tokenStream position]) )
  42.               (tag {AbstractNonTerminal}:productionsLoop
  43.                    (mapc '(lambda (production)
  44.                             (let ( (value [production match tokenStream]) )
  45.                                  (if (eq value '#:match:fail)
  46.                                      [tokenStream position savedPosition]
  47.                                      ;;ELSE
  48.                                      (exit {AbstractNonTerminal}:productionsLoop
  49.                                            value))))
  50.                          #Iproductions)
  51.                    '#:match:fail)))]
  52.  
  53. [{AbstractProduction} addMethod
  54. 'match '((tokenStream)
  55.       (let ( (grammar #Cgrammar) )
  56.           (if #Ibody
  57.                   (tag {AbstractProduction}:match
  58.                        (apply (or #Iaction '(lambda x x))
  59.                               (mapcar '(lambda (x)
  60.                                          (let ((value [[grammar element x]
  61.                                                             match tokenStream]))
  62.                                               (if (eq value '#:match:fail)
  63.                                                   (exit 
  64.                                                      {AbstractProduction}:match
  65.                                                      '#:match:fail)
  66.                                                   ;;ELSE
  67.                                                   value)))
  68.                                       #Ibody)))
  69.                   ;;ELSE
  70.                   (when #Iaction    (apply #Iaction ())))))]
  71.  
  72. [{AbstractToken} addMethod
  73. 'match '((tokenStream)
  74.      (let ( (nextToken [tokenStream next 1]) )
  75.               (if (eq nextToken 'STREAMATEND)
  76.                   '#:match:fail
  77.                   ;;ELSE
  78.                   (setq nextToken [nextToken at 0])
  79.                   (if (eq #Iname [nextToken name])
  80.                       [nextToken value]
  81.                       ;;ELSE
  82.                       '#:match:fail))))]
  83.  
  84. [{AbstractErrorToken} addMethod
  85. 'match '((tokenStream)
  86.      ;; ALWAYS SUCCEEDS, THE TOKEN STREAM IS RETURNED TO LET THE USER 
  87.          ;; PERFORM ERROR RECOVERY IN ITS ACTION FUNCTION BY SKIPPING BAD
  88.          ;; TOKENS IN THE STREAM AND THEN RETURNING A VOID VALUE IN ORDER
  89.          ;; TO RESUME PARSING IN A CLEAN STATE.
  90.      tokenStream)]
  91.  
  92.