aboutsummaryrefslogtreecommitdiff
path: root/src/interp/postpar.boot
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2008-12-08 07:35:22 +0000
committerdos-reis <gdr@axiomatics.org>2008-12-08 07:35:22 +0000
commit52b3f7dee38b7a15e1b017e6a41ac63cbf6e95e8 (patch)
tree9f6023cdfd57bf982486d866ba32252d304b659e /src/interp/postpar.boot
parentdec92cd40550e8532d36502dd75d6f9d639d7f7c (diff)
downloadopen-axiom-52b3f7dee38b7a15e1b017e6a41ac63cbf6e95e8.tar.gz
2008-12-07 Gabriel Dos Reis <gdr@cs.tamu.edu>
* interp/g-opt.boot ($simpleVMoperators): New. (isSimpleVMForm): Likewise. (isFloatableVMForm): Likewise. (optLET): Likewise. Expand backend let-forms. * interp/c-util.boot (foldSpadcall): Look into LET and COND forms. (replaceSimpleFunctions): Likewise. (mutateCONDFormWithUnaryFunction): New. (mutateLETFormWithUnaryFunction): Likewise. * interp/compiler.boot (tryCourtesyCoercion): Split from coerce. (compRetractAlternative): Simplify. Now try courtesy coercions before retraction. (compRecoverAlternative): New. (compMatch): Simplify. Implement type recovery too. 2008-12-06 Gabriel Dos Reis <gdr@cs.tamu.edu> * interp/compiler.boot (compRetractAlternative): New. (compMatch): Likewise. Use it to implement pattern macthing for retractable domains. * interp/parse.boot (parseAtAt): New. * interp/postpar.boot (postAtAt): Likewise. (postAlternatives): Likewise. (postMatch): Likewise. * interp/metalex.lisp (Keywords): Remove `otherwise' as keyword. * interp/fnewmeta.lisp (|PARSE-Match|): New local parser. * interp/newaux.lisp (@@): New token. Align wih interpreter. (otherwise): Remove binding specification. (case): Now also a Nud token.
Diffstat (limited to 'src/interp/postpar.boot')
-rw-r--r--src/interp/postpar.boot29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/interp/postpar.boot b/src/interp/postpar.boot
index 7706a257..c045ffc7 100644
--- a/src/interp/postpar.boot
+++ b/src/interp/postpar.boot
@@ -35,6 +35,8 @@
import macros
namespace BOOT
+module postpar
+
++ The type of parse trees.
%ParseTree <=>
%Number or %Symbol or %String or cons
@@ -141,6 +143,11 @@ postPretend t ==
t isnt ["pretend",x,y] => systemErrorHere "postPretend"
["pretend",postTran x,:postType y]
+postAtAt: %ParseTree -> %ParseForm
+postAtAt t ==
+ t isnt ["@@",x,y] => systemErrorHere "postAtAt"
+ ["@@",postTran x,:postType y]
+
postConstruct: %ParseTree -> %ParseForm
postConstruct u ==
u is ["construct",b] =>
@@ -578,6 +585,26 @@ postBootNotEqual u ==
'"is not valid Spad. Please use",:bright '"~=",'"instead."]
["~=",:postTran rest u]
+
+--% %Match
+
+postAlternatives alts ==
+ alts is ["%Block",:cases] => ["%Block",:[tranAlt c for c in cases]]
+ tranAlt alts
+ where
+ tranAlt c ==
+ c is ["=>",pred,conseq] =>
+ ["=>",postTran pred,postTran conseq]
+ postTran c
+
+postMatch: %ParseTree -> %ParseForm
+postMatch t ==
+ t isnt ["%Match",expr,alts] => systemErrorHere "postMatch"
+ alts :=
+ alts is [";",:.] => ["%Block",:postFlattenLeft(alts,";")]
+ alts
+ ["%Match",postTran expr, postAlternatives alts]
+
--% Register special parse tree tranformers.
for x in [["with", :"postWith"],_
@@ -600,6 +627,7 @@ for x in [["with", :"postWith"],_
[":", :"postColon"],_
["@", :"postAtSign"],_
["pretend", :"postPretend"],_
+ ["@@",:"postAtAt"],_
["if", :"postIf"],_
["Join", :"postJoin"],_
["%Signature", :"postSignature"],_
@@ -608,6 +636,7 @@ for x in [["with", :"postWith"],_
["==>", :"postMDef"],_
["->", :"postMapping"],_
["=>", :"postExit"],_
+ ["%Match",:"postMatch"],_
["^=", :"postBootNotEqual"],_
["%Comma", :"post%Comma"]] repeat
MAKEPROP(first x, "postTran", rest x)