aboutsummaryrefslogtreecommitdiff
path: root/src/boot/strap/parser.clisp
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2010-12-11 18:52:23 +0000
committerdos-reis <gdr@axiomatics.org>2010-12-11 18:52:23 +0000
commit0835ad7e9a8e7f90f61b633fd74304f00b07d386 (patch)
tree8cf1d362e2edf28abb4f0c734e27d89c8505806f /src/boot/strap/parser.clisp
parentf8e7728606692cfb26816637c0622007758d9ae5 (diff)
downloadopen-axiom-0835ad7e9a8e7f90f61b633fd74304f00b07d386.tar.gz
* boot/parser.boot (bpListAndRecover): Use Lisp-level CATCH.
(bpTry): Rewrite. (bpTry): Likewise. (bpSimpleCatch): Remove. (bpPiledCatchItems): Likewise. (bpCatchItemList): Likewise. (bpExceptionHead): Likewise. (bpExceptionTail): Likewise. (bpExceptionVariable): New. (bpFinally): Likewise. * boot/ast.boot (%Ast): Add %Pretend and %Finally. %Catch now takes two arguments. (bfTry): Rewrite. (bfThrow): Likewise. (bfHandlers): New. (codeForCatchHandlers): Likewise. * boot/translator.boot (shoeOutParse): Use Lisp-level CATCH.
Diffstat (limited to 'src/boot/strap/parser.clisp')
-rw-r--r--src/boot/strap/parser.clisp87
1 files changed, 57 insertions, 30 deletions
diff --git a/src/boot/strap/parser.clisp b/src/boot/strap/parser.clisp
index 078f48a7..e009d80d 100644
--- a/src/boot/strap/parser.clisp
+++ b/src/boot/strap/parser.clisp
@@ -317,12 +317,18 @@
(DEFUN |bpMissing| (|s|)
(PROGN
(|bpSpecificErrorHere| (CONCAT (PNAME |s|) " possibly missing"))
- (THROW 'TRAPPOINT 'TRAPPED)))
+ (THROW :OPEN-AXIOM-CATCH-POINT
+ (CONS :OPEN-AXIOM-CATCH-POINT
+ (CONS '(|SystemException|) (TRAPPOINT 'TRAPPED))))))
(DEFUN |bpCompMissing| (|s|) (OR (|bpEqKey| |s|) (|bpMissing| |s|)))
(DEFUN |bpTrap| ()
- (PROGN (|bpGeneralErrorHere|) (THROW 'TRAPPOINT 'TRAPPED)))
+ (PROGN
+ (|bpGeneralErrorHere|)
+ (THROW :OPEN-AXIOM-CATCH-POINT
+ (CONS :OPEN-AXIOM-CATCH-POINT
+ (CONS '(|SystemException|) (TRAPPOINT 'TRAPPED))))))
(DEFUN |bpRecoverTrap| ()
(PROG (|pos2| |pos1|)
@@ -731,40 +737,61 @@
(DEFUN |bpAnd| () (|bpLeftAssoc| '(AND) #'|bpCompare|))
(DEFUN |bpThrow| ()
- (AND (|bpEqKey| 'THROW) (|bpApplication|)
- (|bpPush| (|bfThrow| (|bpPop1|)))))
+ (COND
+ ((AND (|bpEqKey| 'THROW) (|bpApplication|))
+ (COND
+ ((|bpEqKey| 'COLON) (OR (|bpApplication|) (|bpTrap|))
+ (|bpPush| (|%Pretend| (|bpPop2|) (|bpPop1|)))))
+ (|bpPush| (|bfThrow| (|bpPop1|))))
+ (T NIL)))
(DEFUN |bpTry| ()
- (AND (|bpEqKey| 'TRY) (|bpAssign|) (OR (|bpEqKey| 'BACKSET) T)
- (OR (|bpEqKey| 'CATCH) (|bpMissing| 'CATCH))
- (OR (|bpPiledCatchItems|) (|bpSimpleCatch|) (|bpTrap|))
- (|bpPush| (|bfTry| (|bpPop2|) (|bpPop1|)))))
-
-(DEFUN |bpSimpleCatch| ()
- (AND (|bpCatchItem|) (|bpPush| (LIST (|bpPop1|)))))
-
-(DEFUN |bpPiledCatchItems| () (|bpPileBracketed| #'|bpCatchItemList|))
-
-(DEFUN |bpCatchItemList| () (|bpListAndRecover| #'|bpCatchItem|))
+ (PROG (|cs|)
+ (RETURN
+ (COND
+ ((|bpEqKey| 'TRY) (|bpAssign|) (SETQ |cs| NIL)
+ (LOOP
+ (COND
+ ((NOT (|bpHandler| 'CATCH)) (RETURN NIL))
+ (T (PROGN
+ (|bpCatchItem|)
+ (SETQ |cs| (CONS (|bpPop1|) |cs|))))))
+ (COND
+ ((|bpHandler| 'FINALLY)
+ (AND (|bpFinally|)
+ (|bpPush|
+ (|bfTry| (|bpPop2|)
+ (NREVERSE (CONS (|bpPop1|) |cs|))))))
+ ((NULL |cs|) (|bpTrap|))
+ (T (|bpPush| (|bfTry| (|bpPop1|) (NREVERSE |cs|))))))
+ (T NIL)))))
-(DEFUN |bpExceptionHead| ()
- (OR (AND (OR (|bpName|) (|bpTrap|))
- (OR (AND (|bpParenthesized| #'|bpIdList|)
- (|bpPush| (|bfNameArgs| (|bpPop2|) (|bpPop1|))))
- (AND (|bpName|)
- (|bpPush| (|bfNameArgs| (|bpPop2|) (|bpPop1|))))))
- T))
+(DEFUN |bpCatchItem| ()
+ (AND (OR (|bpExceptionVariable|) (|bpTrap|))
+ (OR (|bpEqKey| 'EXIT) (|bpTrap|)) (OR (|bpAssign|) (|bpTrap|))
+ (|bpPush| (|%Catch| (|bpPop2|) (|bpPop1|)))))
-(DEFUN |bpExceptionTail| ()
- (AND (|bpEqKey| 'EXIT) (OR (|bpAssign|) (|bpTrap|))
- (|bpPush| (|%Exit| (|bpPop2|) (|bpPop1|)))))
+(DEFUN |bpExceptionVariable| ()
+ (PROG (|t|)
+ (DECLARE (SPECIAL |$stok|))
+ (RETURN
+ (PROGN
+ (SETQ |t| |$stok|)
+ (OR (AND (|bpEqKey| 'OPAREN) (OR (|bpSignature|) (|bpTrap|))
+ (OR (|bpEqKey| 'CPAREN) (|bpMissing| |t|)))
+ (|bpTrap|))))))
-(DEFUN |bpException| ()
- (AND (|bpExceptionHead|) (OR (|bpExceptionTail|) T)))
+(DEFUN |bpFinally| ()
+ (AND (OR (|bpAssign|) (|bpTrap|)) (|bpPush| (|%Finally| (|bpPop1|)))))
-(DEFUN |bpCatchItem| ()
- (AND (OR (|bpException|) (|bpTrap|))
- (|bpPush| (|%Catch| (|bpPop1|)))))
+(DEFUN |bpHandler| (|key|)
+ (PROG (|s|)
+ (RETURN
+ (PROGN
+ (SETQ |s| (|bpState|))
+ (COND
+ ((AND (|bpEqKey| 'BACKSET) (|bpEqKey| |key|)) T)
+ (T (|bpRestore| |s|) NIL))))))
(DEFUN |bpLeave| ()
(AND (|bpEqKey| 'LEAVE) (OR (|bpLogical|) (|bpTrap|))