ometa2
changeset 24:fd5a0c2f7761 tip
show partial parse result
ignore anything following an ometa grammar
ignore anything following an ometa grammar
| author | John Leuner <jewel@subvert-the-dominant-paradigm.net> |
|---|---|
| date | Wed Nov 16 19:38:46 2011 +0200 (6 months ago) |
| parents | 750579c3fb6f |
| children | |
| files | ometa-parser.g ometa-parser.lisp ometa-prim.lisp |
line diff
1.1 --- a/ometa-parser.g Fri Aug 28 09:15:50 2009 +0200 1.2 +++ b/ometa-parser.g Wed Nov 16 19:38:46 2011 +0200 1.3 @@ -45,6 +45,6 @@ 1.4 ruleName = name | spaces tsString, 1.5 rule = &(ruleName:n) spaces rulePart(n):x ("," spaces rulePart(n))*:xs -> << (prog1 `(:rule ,n ,(locals o) (:or ,x ,@xs)) (setf (locals o) nil)) >>, 1.6 rulePart :rn = ruleName:n ?<<(equal n rn)>> spaces expr4:b1 (spaces "=" spaces expr:b2 -> << `(:and ,b1 ,b2) >> | empty -> b1), 1.7 -grammar = okeyword("ometa") spaces name:n spaces ("<:" name | empty -> <<"OMeta">>):sn spaces "{" listof("rule", ","):rs spaces "}" -> << `(:grammar ,n ,sn ,@rs) >> 1.8 +grammar = okeyword("ometa") spaces name:n spaces ("<:" name | empty -> <<"OMeta">>):sn spaces "{" listof("rule", ","):rs spaces "}" anything* -> << `(:grammar ,n ,sn ,@rs) >> 1.9 } 1.10
2.1 --- a/ometa-parser.lisp Fri Aug 28 09:15:50 2009 +0200 2.2 +++ b/ometa-parser.lisp Wed Nov 16 19:38:46 2011 +0200 2.3 @@ -1511,5 +1511,14 @@ 2.4 (OMETA::OMETA-APPLY OMETA::O 'OMETA:TOKEN 2.5 (LIST "}"))) 2.6 (LAMBDA (OMETA::O OMETA::NULLARG) 2.7 + (OMETA::OMETA-APPLY OMETA::O 'OMETA::OMANY 2.8 + (LAMBDA 2.9 + (OMETA::O 2.10 + OMETA::NULLARG) 2.11 + (OMETA::OMETA-APPLY 2.12 + OMETA::O 2.13 + 'OMETA:ANYTHING 2.14 + NIL)))) 2.15 + (LAMBDA (OMETA::O OMETA::NULLARG) 2.16 `(:GRAMMAR ,OMETA::N ,OMETA::SN 2.17 ,@OMETA::RS)))))) 2.18 \ No newline at end of file
3.1 --- a/ometa-prim.lisp Fri Aug 28 09:15:50 2009 +0200 3.2 +++ b/ometa-prim.lisp Wed Nov 16 19:38:46 2011 +0200 3.3 @@ -27,23 +27,37 @@ 3.4 (reset-to-mark o) 3.5 (pop-mark o)) 3.6 3.7 +(defmethod remaining ((o ometa-input-stream)) 3.8 + (assert (< (input-position o) (length (input-array o))) () (list "remaining input checked failed" o)) 3.9 + (subseq (input-array o) (input-position o) (- (length (input-array o)) 1))) 3.10 + 3.11 (defmethod parse-input-file ((parser ometa::ometa) (file-name string)) 3.12 - (ometa::init-memo) 3.13 - (let ((input (with-open-file (file file-name :direction :input) 3.14 - (let ((s (make-array (file-length file)))) 3.15 - (read-sequence s file) 3.16 - s)))) 3.17 - (let ((input-stream (make-instance 'ometa:ometa-input-stream :input-array input))) 3.18 - (setf (input-stream parser) input-stream) 3.19 - (ometa-apply parser 'grammar nil) 3.20 - ))) 3.21 + (ometa::init-memo) 3.22 + (let ((input (with-open-file (file file-name :direction :input) 3.23 + (let ((s (make-array (file-length file)))) 3.24 + (read-sequence s file) 3.25 + s)))) 3.26 + (let ((input-stream (make-instance 'ometa:ometa-input-stream :input-array input))) 3.27 + (setf (input-stream parser) input-stream) 3.28 + (let ((parse-result (ometa-apply parser 'grammar nil))) 3.29 + (if (not (o-fail? parse-result)) 3.30 + (if (at-end-p input-stream) 3.31 + parse-result 3.32 + (progn 3.33 + (format t "partial parse result at ~A out of ~A~%" (input-position input-stream) 3.34 + (length (input-array input-stream))) 3.35 + (print (remaining input-stream)) 3.36 + (error "parse failed " parse-result))) 3.37 + parse-result))))) 3.38 + 3.39 3.40 (defmethod parse-input-string ((parser ometa::ometa) (input string)) 3.41 - (ometa::init-memo) 3.42 - (let ((input-stream (make-instance 'ometa:ometa-input-stream :input-array input))) 3.43 - (setf (input-stream parser) input-stream) 3.44 - (ometa-apply parser 'grammar nil) 3.45 - )) 3.46 + (ometa::init-memo) 3.47 + (let ((input-stream (make-instance 'ometa:ometa-input-stream :input-array input))) 3.48 + (setf (input-stream parser) input-stream) 3.49 + (ometa-apply parser 'grammar nil) 3.50 + )) 3.51 + 3.52 3.53 (defclass ometa-list-input-stream () ((input-list :initarg :input-list :accessor input-list) 3.54 (mark-stack :initform nil :accessor mark-stack))) 3.55 @@ -82,11 +96,11 @@ 3.56 (setf *memo-table* (make-hash-table :test #'equal))) 3.57 3.58 (defmethod ometa-apply ((o ometa-prim) fun arg) 3.59 - (save-input o) 3.60 (if (and (null arg) 3.61 (symbolp fun)) 3.62 (let* ((key (list fun (input-position (input-stream o)) arg )) 3.63 (lookup (gethash key *memo-table* :memo-lookup-failure))) 3.64 + (save-input o) 3.65 (if (eq lookup :memo-lookup-failure) 3.66 (let ((result (funcall fun o arg))) 3.67 (setf (gethash key *memo-table*) (cons result (input-position (input-stream o)))) 3.68 @@ -94,13 +108,11 @@ 3.69 result) 3.70 (progn 3.71 (if (not (eq (car lookup) o-fail)) 3.72 - (setf (input-position (input-stream o)) (cdr lookup)) 3.73 - (restore-input o)) 3.74 + (setf (input-position (input-stream o)) (cdr lookup)) 3.75 + (restore-input o)) 3.76 (discard-input o) 3.77 (car lookup)))) 3.78 - (progn 3.79 - (discard-input o) 3.80 - (funcall fun o arg) ))) 3.81 + (funcall (the (or symbol function) fun) o arg) )) 3.82 3.83 3.84 (defun inspect-memo () 3.85 @@ -178,15 +190,16 @@ 3.86 (push v answer) 3.87 (discard-input o)))))))) 3.88 3.89 -(defmethod seq ((o ometa-prim) xs) 3.90 - (save-input o) 3.91 - (loop for x in xs 3.92 +(defmethod seq ((o ometa-prim) args) 3.93 + (let ((xs (first args))) 3.94 + (save-input o) 3.95 + (loop for x in xs 3.96 when (o-fail? (ometa-apply o 'ometa::exactly (list x))) 3.97 do (progn 3.98 (restore-and-discard-input o) 3.99 (return-from seq o-fail))) 3.100 - (discard-input o) 3.101 - xs) 3.102 + (discard-input o) 3.103 + xs)) 3.104 3.105 (defmethod opred ((o ometa-prim) p) 3.106 (or p o-fail)) 3.107 @@ -260,7 +273,9 @@ 3.108 (cons result result1))))))) 3.109 3.110 (defmethod listof ((o ometa-prim) args) 3.111 - (let* ((thing (if (functionp (car args)) (pop args) (intern (string-upcase (pop args)) :ometa))) 3.112 + (let* ((thing (if (functionp (car args)) 3.113 + (pop args) 3.114 + (intern (string-upcase (pop args)) :ometa))) 3.115 (separator (pop args)) 3.116 (first-rule (ometa-apply o thing nil))) 3.117 (if (o-fail? first-rule)
