diff options
-rw-r--r-- | src/interp/ChangeLog | 8 | ||||
-rw-r--r-- | src/interp/Makefile.in | 3 | ||||
-rw-r--r-- | src/interp/Makefile.pamphlet | 11 | ||||
-rw-r--r-- | src/interp/parse.boot (renamed from src/interp/parse.boot.pamphlet) | 151 |
4 files changed, 50 insertions, 123 deletions
diff --git a/src/interp/ChangeLog b/src/interp/ChangeLog index 10e71f06..7651ebe6 100644 --- a/src/interp/ChangeLog +++ b/src/interp/ChangeLog @@ -1,5 +1,13 @@ 2007-09-19 Gabriel Dos Reis <gdr@cs.tamu.edu> + * Makefile.pamphlet (${DEPSYS}): Now depend on the compiled form + of parse. Load it. + (parse.$(FASLEXT)): New rule. + * parse.boot: New. Import "postpar". + * parse.boot.pamphlet: Move content to parse.boot.pamphlet. Remove. + +2007-09-19 Gabriel Dos Reis <gdr@cs.tamu.edu> + * util.lisp.pamphlet ($directory-list): Move to sys-globals.boot. ($library-directory-list): Likewise. * spad.lisp.pamphlet: Import "bootlex". diff --git a/src/interp/Makefile.in b/src/interp/Makefile.in index 14c14cbf..ab300b8b 100644 --- a/src/interp/Makefile.in +++ b/src/interp/Makefile.in @@ -465,6 +465,9 @@ $(AUTO)/%.$(FASLEXT): %.$(FASLEXT) ## The old parser component roughtly is: ## +parse.$(FASLEXT): parse.clisp postpar.$(FASLEXT) + $(BOOTSYS) -- --compile --output=$@ --load-directory=. $< + postpar.$(FASLEXT): postpar.clisp postprop.$(FASLEXT) $(BOOTSYS) -- --compile --output=$@ --load-directory=. $< diff --git a/src/interp/Makefile.pamphlet b/src/interp/Makefile.pamphlet index a3612286..d540e5b1 100644 --- a/src/interp/Makefile.pamphlet +++ b/src/interp/Makefile.pamphlet @@ -982,7 +982,7 @@ ${DEPSYS}: vmlisp.$(FASLEXT) \ bookvol5.$(FASLEXT)\ util.$(FASLEXT) \ postpar.$(FASLEXT) \ - parse.clisp \ + parse.$(FASLEXT) \ parsing.$(FASLEXT) \ metalex.$(FASLEXT) \ bootlex.$(FASLEXT) \ @@ -1011,10 +1011,9 @@ ${DEPSYS}: vmlisp.$(FASLEXT) \ @ echo '(|importModule| "util")' >> makedep.lisp @ echo '(in-package "BOOT")' >> makedep.lisp @ echo '(build-depsys (quote ($(patsubst %, "%", ${DEP}))) "${AXIOM}")' >> makedep.lisp - @ echo '(unless (probe-file "parse.$(FASLEXT)") (|compileLispFile| "parse.clisp" "parse.$(FASLEXT)"))' >> makedep.lisp @ echo '(in-package "AxiomCore")' >> makedep.lisp @ echo '(|importModule| "newaux")' >> makedep.lisp - @ echo '(load "parse")' >> makedep.lisp + @ echo '(|importModule| "parse")' >> makedep.lisp @ echo '(|importModule| "metalex")' >> makedep.lisp @ echo '(|importModule| "parsing")' >> makedep.lisp @ echo '(|importModule| "fnewmeta")' >> makedep.lisp @@ -1038,8 +1037,7 @@ ${DEPSYS}: vmlisp.$(FASLEXT) \ @ echo '(load "g-util")' >> makedep.lisp <<save depsys image>> @rm $(addsuffix .$(FASLEXT), \ - parse clam slam g-error \ - g-boot c-util g-util) + clam slam g-error g-boot c-util g-util) @ echo 4 ${DEPSYS} created @@ -1960,6 +1958,9 @@ $(AUTO)/%.$(FASLEXT): %.$(FASLEXT) ## The old parser component roughtly is: ## +parse.$(FASLEXT): parse.clisp postpar.$(FASLEXT) + $(BOOTSYS) -- --compile --output=$@ --load-directory=. $< + postpar.$(FASLEXT): postpar.clisp postprop.$(FASLEXT) $(BOOTSYS) -- --compile --output=$@ --load-directory=. $< diff --git a/src/interp/parse.boot.pamphlet b/src/interp/parse.boot index b4c72963..8328af6b 100644 --- a/src/interp/parse.boot.pamphlet +++ b/src/interp/parse.boot @@ -1,92 +1,7 @@ -\documentclass{article} -\usepackage{axiom} - -\title{\File{src/interp/parse.boot} Pamphlet} -\author{The Axiom Team} - -\begin{document} -\maketitle -\begin{abstract} -\end{abstract} -\eject -\tableofcontents -\eject - -\section{parseTransform} -This is the top-level function in this file. - -When parsing spad code we walk an source code expression such as - -[[P ==> PositiveInteger]] - -This gets translated by [[|postTransform|]]\cite{1} into - -[[(MDEF P NIL NIL (|PositiveInteger|))]] - -[[|parseTranform|]] is called with this expression. The [[%]] symbol, -which represents the current domain, is replaced with the [[$]] symbol -internally. This hack was introduced because the Aldor compiler wanted -to use [[%]] for the [[current domain]]. The Spad compiler used [[$]]. -In order not to have to change this everywhere we do a subsitution here. -<<parseTransform>>= -parseTransform x == - $defOp: local:= nil - x := substitute('$,'%,x) -- for new compiler compatibility - parseTran x - -@ - -\section{parseTran} -[[|parseTran|]] sees an expression such as - -[[(MDEF P NIL NIL (|PositiveInteger|))]] - -It walks the -expression, which is a list, item by item (note the tail recursive -call in this function). In general, we are converting certain -source-level constructs into internal constructs. Note the subtle -way that functions get called in this file. The information about -what function to call is stored on the property list of the symbol. - -For example, given the form: [[(|has| S (|OrderedSet|))]] -the symbol [[|has|]] occurs in the car of the list. [[|parseTran|]] -assigns [[$op]] to be [[|has|]] and [[argl]] to be the list -[[(S (|OrderedSet|))]]. Next, a local function [[g]], which checks -for the compile-time elts, returns [[$op]] unchanged. The variable -[[u]] is set to [[|has|]]. - -Since [[|has|]] is an atom we do -[[(GET '|has| '|parseTran|)]] which returns [[|parseHas|]] -because the symbol [[|has|]] contains the association -[[|parseTran| |parseHas|]] on it's symbol property list. -You can see this by calling [[(symbol-plist '|has|)]]. - -This ends up calling [[(|parseHas| '(S (|OrderedSet|)))]]. - -The [[|parseTran|]] function walks the entire s-expression -calling special parsers for various special forms in the input. -This does things like reverse tests so that [[(if (not x) a b)]] -becomes [[(if x b a)]], etc. - -<<parseTran>>= -parseTran x == - $op: local - atom x => parseAtom x - [$op,:argl]:= x - u := g($op) where g op == (op is ["elt",op,x] => g x; op) - u="construct" => - r:= parseConstruct argl - $op is ["elt",:.] => [parseTran $op,:rest r] - r - SYMBOLP u and (fn:= GETL(u,'parseTran)) => FUNCALL(fn,argl) - [parseTran $op,:parseTranList argl] - -@ - -\section{License} -<<license>>= -- Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. -- All rights reserved. +-- Copyright (C) 2007, 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 @@ -116,17 +31,29 @@ parseTran x == -- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -@ - -<<*>>= -<<license>> +import '"postpar" )package "BOOT" --% Transformation of Parser Output -<<parseTransform>> -<<parseTran>> +parseTransform x == + $defOp: local:= nil + x := substitute('$,'%,x) -- for new compiler compatibility + parseTran x + +parseTran x == + $op: local + atom x => parseAtom x + [$op,:argl]:= x + u := g($op) where g op == (op is ["elt",op,x] => g x; op) + u="construct" => + r:= parseConstruct argl + $op is ["elt",:.] => [parseTran $op,:rest r] + r + SYMBOLP u and (fn:= GETL(u,'parseTran)) => FUNCALL(fn,argl) + [parseTran $op,:parseTranList argl] + parseAtom x == -- next line for compatibility with new compiler @@ -406,9 +333,7 @@ parseOr u == (x:= parseTran first u) is ["not",y] => parseIf [y,parseOr rest u,"true"] true => parseIf [x,"true",parseOr rest u] -parseNot u == - $InteractiveMode => ["not",parseTran first u] - parseTran ["IF",first u,:'(false true)] +parseNot u == ['not,parseTran first u] parseEquivalence [a,b] == parseIf [a,b,parseIf [b,:'(false true)]] @@ -481,23 +406,20 @@ parseIf t == t isnt [p,a,b] => t ifTran(parseTran p,parseTran a,parseTran b) where ifTran(p,a,b) == - null($InteractiveMode) and p="true" => a - null($InteractiveMode) and p="false" => b - p is ["not",p'] => ifTran(p',b,a) - p is ["IF",p',a',b'] => ifTran(p',ifTran(a',COPY a,COPY b),ifTran(b',a,b)) - p is ["SEQ",:l,["exit",1,p']] => - ["SEQ",:l,["exit",1,ifTran(p',incExitLevel a,incExitLevel b)]] + null($InteractiveMode) and p='true => a + null($InteractiveMode) and p='false => b + p is ['not,p'] => ifTran(p',b,a) + p is ['IF,p',a',b'] => ifTran(p',ifTran(a',COPY a,COPY b),ifTran(b',a,b)) + p is ['SEQ,:l,['exit,1,p']] => + ['SEQ,:l,['exit,1,ifTran(p',incExitLevel a,incExitLevel b)]] --this assumes that l has no exits - a is ["IF", =p,a',.] => ["IF",p,a',b] - b is ["IF", =p,.,b'] => ["IF",p,a,b'] - makeSimplePredicateOrNil p is ["SEQ",:s,["exit",1,val]] => - parseTran ["SEQ",:s,["exit",1,incExitLevel ["IF",val,a,b]]] - ["IF",p,a,b] + a is ['IF, =p,a',.] => ['IF,p,a',b] + b is ['IF, =p,.,b'] => ['IF,p,a,b'] +-- makeSimplePredicateOrNil p is ['SEQ,:s,['exit,1,val]] => +-- parseTran ['SEQ,:s,['exit,1,incExitLevel ['IF,val,a,b]]] + ['IF,p,a,b] -makeSimplePredicateOrNil p == - isSimple p => nil - u:= isAlmostSimple p => u - true => wrapSEQExit [["LET",g:= GENSYM(),p],g] +makeSimplePredicateOrNil p == nil parseWhere l == ["where",:mapInto(l, function parseTran)] @@ -562,10 +484,3 @@ scriptTranRow1 x == STRCONC(",",$quadSymbol,scriptTranRow1 rest x) parseVCONS l == ["VECTOR",:parseTranList l] -@ - -\eject -\begin{thebibliography}{99} -\bibitem{1} nothing -\end{thebibliography} -\end{document} |