aboutsummaryrefslogtreecommitdiff
path: root/src/interp/parsing.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp/parsing.lisp')
-rw-r--r--src/interp/parsing.lisp284
1 files changed, 0 insertions, 284 deletions
diff --git a/src/interp/parsing.lisp b/src/interp/parsing.lisp
deleted file mode 100644
index a6a321e7..00000000
--- a/src/interp/parsing.lisp
+++ /dev/null
@@ -1,284 +0,0 @@
-;; Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
-;; All rights reserved.
-;; Copyright (C) 2007-2012, Gabriel Dos Reis.
-;; All rights reserved.
-;;
-;; Redistribution and use in source and binary forms, with or without
-;; modification, are permitted provided that the following conditions are
-;; met:
-;;
-;; - Redistributions of source code must retain the above copyright
-;; notice, this list of conditions and the following disclaimer.
-;;
-;; - Redistributions in binary form must reproduce the above copyright
-;; notice, this list of conditions and the following disclaimer in
-;; the documentation and/or other materials provided with the
-;; distribution.
-;;
-;; - Neither the name of The Numerical ALgorithms Group Ltd. nor the
-;; names of its contributors may be used to endorse or promote products
-;; derived from this software without specific prior written permission.
-;;
-;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-;; IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-;; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-;; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-;; OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-; NAME: META/LISP Parser Generator and Lexical Analysis Utilities (Parsing)
-;
-; PURPOSE: This package provides routines to support the Metalanguage
-; translator writing system. Metalanguage is described
-; in META/LISP, R.D. Jenks, Tech Report, IBM T.J. Watson Research Center,
-; 1969. Familiarity with this document is assumed.
-;
-; The parser generator itself is described in either the file
-; MetaBoot.lisp (hand-coded version) or the file MetaMeta.lisp (machine
-; generated from self-descriptive Meta code), both of which load themselves
-; into package Parsing.
-
-; CONTENTS:
-;
-; 2. Recursive descent parsing support routines
-; A. Stacking and retrieving reductions of rules.
-; B. Applying metagrammatical elements of a production (e.g., Star).
-;
-; 3. Routines for handling lexical scanning
-;
-; A. Manipulating the token stack and reading tokens
-; B. Error handling
-; C. Constructing parsing procedures
-; D. Managing rule sets
-;
-; 4. Tracing routines
-;
-; 5. Routines for inspecting and resetting total I/O system state
-;
-
-
-(import-module "lexing")
-(import-module "macros")
-
-(in-package "BOOT")
-
-
-; 0. Current I/O Stream definition
-
-(MAKEPROP 'END_UNIT 'KEY 'T)
-
-(defparameter out-stream t "Current output stream.")
-
-(defun Line-Print (line)
- (format out-stream "~&~5D> ~A~%" (|lineNumber| line) (|lineBuffer| Line))
- (format out-stream "~v@T^~%" (+ 7 (|lineCurrentIndex| line))))
-
-(defun make-string-adjustable (s)
- (cond ((adjustable-array-p s) s)
- (t (make-array (array-dimensions s) :element-type 'character
- :adjustable t :initial-contents s))))
-
-(defun Next-Lines-Clear () (setq |$lineStack| nil))
-
-(defun Next-Lines-Show ()
- (and |$lineStack| (format t "Currently preparsed lines are:~%~%"))
- (mapcar #'(lambda (line)
- (format t "~&~5D> ~A~%" (car line) (cdr Line)))
- |$lineStack|))
-
-
-; 3. Routines for handling lexical scanning
-;
-; Lexical scanning of tokens is performed off of the current line. No
-; token can span more than 1 line. All real I/O is handled in a line-oriented
-; fashion (in a slight paradox) below the character level. All character
-; routines implicitly assume the parameter |$spadLine|. We do not make
-; |$spadLine| an explicit optional parameter for reasons of efficiency.
-
-(defmacro current-line-print () '(Line-Print |$spadLine|))
-
-(defmacro current-line-show ()
- `(if (|linePastEnd?| |$spadLine|)
- (format t "~&The current line is empty.~%")
- (progn (format t "~&The current line is:~%~%")
- (current-line-print))))
-
-(defmacro current-line-clear () `(|lineClear!| |$spadLine|))
-
-; *** Print New Line
-
-(defparameter Printer-Line-Stack (|makeStack|)
- "Stack of output listing lines waiting to print. [local to PRINT-NEW-LINE]")
-
-(defparameter Read-Quietly nil
- "Whether or not to produce an output listing. [local to PRINT-NEW-LINE]")
-
-(defun Print-New-Line (string &optional (strm |$OutputStream|))
- "Makes output listings."
- (if Read-Quietly (|stackPush!| (copy-tree string) Printer-Line-Stack)
- (progn (mapc #'(lambda (x) (format strm "; ~A~%" x) (terpri))
- (|reverse!| (|stackStore| Printer-Line-Stack)))
- (|stackClear!| Printer-Line-Stack)
- (format strm "~&; ~A~%" string))))
-
-; 1C. Token
-(defun Token-Print (token)
- (format out-stream "(token (symbol ~S) (type ~S))~%"
- (|tokenSymbol| token) (|tokenType| token)))
-
-(defun reduce-stack-show ()
- (let ((store (|stackStore| |$reduceStack|))
- (*print-pretty* t))
- (if store
- (progn (format t "~%Reduction stack contains:~%")
- (mapcar #'(lambda (x)
- (if (eq (type-of x) 'token)
- (describe x)
- (print x)))
- (|stackStore| |$reduceStack|)))
- (format t "~%There is nothing on the reduction stack.~%"))))
-
-(defun token-stack-show ()
- (if (= |$validTokens| 0) (format t "~%There are no valid tokens.~%")
- (format t "~%The number of valid tokens is ~S.~%" |$validTokens|))
- (if (> |$validTokens| 0)
- (progn (format t "The current token is~%")
- (describe |$currentToken|)))
- (if (> |$validTokens| 1)
- (progn (format t "The next token is~%")
- (describe |$nextToken|)))
- (if (|tokenType| |$priorToken|)
- (progn (format t "The prior token was~%")
- (describe |$priorToken|))))
-
-(defun make-adjustable-string (n)
- (make-array (list n) :element-type 'character :adjustable t))
-
-; *** 5. META Error Handling
-
-(defparameter $num_of_meta_errors 0)
-
-(defparameter Meta_Errors_Occurred nil "Did any errors occur")
-
-(defun IOStreams-Show ()
- (format t "~&Input is coming from ~A, and output is going to ~A.~%"
- (or (streamp in-stream) "the keyboard")
- (or (streamp out-stream) "the screen"))
- (format t "~:[~;The current input stream is logically closed.~%~]~%"
- (|eof?| in-stream)))
-
-(defmacro IOStreams-Set (input output) `(setq in-stream ,input out-stream ,output))
-
-(defmacro IOStreams-Clear (&optional (in t) (out t))
- `(progn (and (streamp in-stream) (close in-stream))
- (and (streamp out-stream) (close out-stream))
- (IOStreams-Set ,in ,out)))
-
-; 2B. Routines for applying certain metagrammatical elements
-; of a production (e.g., Star).
-
-; Must means that if it is not present in the token stream, it is a syntax error.
-
-; FUNCTIONS DEFINED IN THIS SECTION:
-;
-; Star, Bang, Must, Optional, Action
-
-(defmacro Star (lab prod)
-
-"Succeeds if there are one or more of PROD, stacking as one unit
-the sub-reductions of PROD and labelling them with LAB.
-E.G., (Star IDs (parse-id)) with A B C will stack (3 IDs (A B C)),
-where (parse-id) would stack (1 ID (A)) when applied once."
-
- `(prog ((oldstacksize (|stackSize| |$reduceStack|)))
- (if (not ,prod) ;(progn (format t "~&Star failed for ~A.~%" ',lab) (return nil)))
- (return nil))
- loop (if (not ,prod)
- (let* ((newstacksize (|stackSize| |$reduceStack|))
- (number-of-new-reductions (- newstacksize oldstacksize)))
-; (format t "~&Starring ~A with ~D new reductions.~%"
-; ',lab number-of-new-reductions)
- (if (> number-of-new-reductions 0)
- (return (do ((i 0 (1+ i)) (accum nil))
- ((= i number-of-new-reductions)
- (|pushReduction| ',lab accum)
-; (format t "~&Star accumulated ~D reductions.~%"
-; (length accum))
- (return t))
- (push (|popStack1|) accum)))
- (return t)))
- (go loop))))
-
-(defmacro Bang (lab prod)
-
-"If the execution of prod does not result in an increase in the size of
-the stack, then stack a NIL. Return the value of prod."
-
- `(progn (setf (|stackUpdated?| |$reduceStack|) nil)
- (let* ((prodvalue ,prod)
- (updated (|stackUpdated?| |$reduceStack|)))
- (if updated
- (progn ; (format t "~&Banged ~A and I think the stack is updated!~%" ',lab)
- prodvalue)
- (progn (|pushReduction| ',lab nil)
- prodvalue)))))
-
-(defmacro must (dothis &optional (this-is nil) (in-rule nil))
- `(or ,dothis (spad_syntax_error ,this-is ,in-rule)))
-
-; Optional means that if it is present in the token stream, that is a good thing,
-; otherwise don't worry (like [ foo ] in BNF notation).
-
-(defun Optional (dothis) (or dothis t))
-
-; Action is something we do as a consequence of successful parsing; it is
-; inserted at the end of the conjunction of requirements for a successful
-; parse, and so should return T.
-
-(defun action (dothis) (or dothis t))
-
-; 3B. Error handling
-
-(defparameter line nil)
-
-; 5. Routines for inspecting and resetting total I/O system state
-;
-; The package largely assumes that:
-;
-; A. One I/O stream pair is in effect at any moment.
-; B. There is a Current Line
-; C. There is a Current Token and a Next Token
-; D. There is a Reduction Stack
-;
-; This state may be examined and reset with the procedures IOSTAT and IOCLEAR.
-
-(defun IOStat ()
- "Tell me what the current state of the parsing world is."
- (current-line-show)
- (if $SPAD (next-lines-show))
- (token-stack-show)
- nil)
-
-(defun IOClear (&optional (in t) (out t))
- ;(IOStreams-clear in out)
- (current-line-clear)
- (|tokenStackClear!|)
- (|reduceStackClear|)
- (if $SPAD (next-lines-clear))
- nil)
-
-;; auxiliary functions needed by the parser
-
-(Defun FLOATEXPID (X &aux S)
- (if (AND (|ident?| X) (char= (char-upcase (ELT (SETQ S (PNAME X)) 0)) #\E)
- (> (LENGTH S) 1)
- (SPADREDUCE AND 0 (COLLECT (STEP I 1 1 (|maxIndex| S))
- (DIGITP (ELT S I)))))
- (READ-FROM-STRING S t nil :start 1)
- NIL))