-- Copyright (c) 1991-2002, The Numerical Algorithms Group Ltd. -- All rights reserved. -- Copyright (C) 2007-2015, 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. -- import utility namespace BOOTTRAN module tokens ($InteractiveMode, char, subString) where char: %Symbol -> %Char ++ If true, means the system is in interactive mode. $InteractiveMode := false --% structure %Token == Record(cls: %Symbol, val: %Thing, pos: %Position) with tokenClass == (.cls) tokenValue == (.val) tokenPosition == (.pos) makeToken(lp,b,n) == mk%Token(first b,second b,[lp,:n]) --% ++ converts `x', a 1-length symbol, to a character. char x == stringChar(symbolName x, 0) shoeStartsId x == alphabetic? x or x in [char "$", char "?", char "%"] shoeIdChar x == alphanumeric? x or x in [char "'", char "?", char "%", char "!",char "&"] ++ return the sub-string of `s' starting from `f'. ++ When non-nil, `n' designates the length of the sub-string. subString(s,f,n == nil) == n = nil => subSequence(s,f) subSequence(s,f,f + n) ++ Table of Boot keywords and their token name. shoeKeyWords == [ _ ['"and","AND"] , _ ['"by", "BY" ], _ ['"case","CASE"] , _ ['"catch","CATCH"], _ ['"cross","CROSS"] , _ ['"do", "DO" ], _ ['"else", "ELSE"] , _ ['"finally", "FINALLY"], _ ['"for", "FOR"] , _ ['"forall", "FORALL"] , _ ['"function", "FUNCTION"] , _ ['"has", "HAS"] , _ ['"if", "IF"], _ ['"import", "IMPORT"], _ ['"in", "IN" ], _ ['"is", "IS"], _ ['"isnt", "ISNT"] , _ ['"leave", "LEAVE"], _ ['"macro", "MACRO"], _ ['"module", "MODULE"], _ ['"namespace", "NAMESPACE"], _ ['"of", "OF"] , _ ['"or", "OR"] , _ ['"rem", "REM"], _ ['"repeat", "REPEAT"] , _ ['"return", "RETURN"], _ ['"quo", "QUO"], _ ['"structure", "STRUCTURE"], _ ['"then", "THEN"], _ ['"throw", "THROW"], _ ['"try", "TRY"], _ ['"until", "UNTIL"], _ ['"with", "WITH" ], _ ['"where", "WHERE"], _ ['"while", "WHILE"], _ ['".", "DOT"], _ ['":", "COLON"], _ ['"::", "COLON-COLON"], _ ['"@", "AT" ], _ ['",", "COMMA"], _ ['";", "SEMICOLON"], _ ['"*", "TIMES"], _ ['"**", "POWER"], _ ['"/", "SLASH"], _ ['"+", "PLUS"], _ ['"-", "MINUS"], _ ['"<", "LT"], _ ['">", "GT"] , _ ['"<=","LE" ], _ ['">=","GE" ], _ ['"=", "SHOEEQ"], _ ['"~=","SHOENE" ], _ ['"..","SEG" ], _ ['"#", "LENGTH"], _ ['"=>","EXIT" ], _ ['"->", "ARROW"],_ ['"<-", "LARROW"], _ ['":=", "BEC"], _ ['"+->", "GIVES"], _ ['"==", "DEF"], _ ['"<=>", "TDEF"], _ ['"(", "OPAREN"], _ ['")", "CPAREN"], _ ['"[", "OBRACK"], _ ['"]", "CBRACK"], _ ['"'", "QUOTE"], _ ['"|", "BAR"] ] shoeKeyTableCons()== KeyTable := makeTable function valueEq? for st in shoeKeyWords repeat tableValue(KeyTable,first st) := second st KeyTable shoeKeyTable:=shoeKeyTableCons() keywordId t == s := or/[k for [k,:v] in entries shoeKeyTable | symbolEq?(v,t)] => makeSymbol s t shoeInsert(s,d) == l := #s h := codePoint stringChar(s,0) u := d.h n := #u k:=0 while l <= #u.k repeat k:=k+1 v := newVector(n+1) for i in 0..k-1 repeat v.i := u.i v.k := s for i in k..n-1 repeat v.(i+1) := u.i d.h := v s shoeDictCons()== d := a := newVector 256 b := newVector 1 b.0 := makeString 0 for i in 0..255 repeat a.i := b a for [s,:.] in entries shoeKeyTable repeat shoeInsert(s,d) d shoeDict:=shoeDictCons() shoePunCons()== a := makeBitVector 256 for i in 0..255 repeat bitref(a,i) := 0 for [k,:.] in entries shoeKeyTable repeat shoeStartsId stringChar(k,0) => nil bitref(a,codePoint stringChar(k,0)) := 1 a shoePun:=shoePunCons() ++ List of prefix operators. for i in [ _ "NOT", _ "LENGTH" _ ] _ repeat property(i,'SHOEPRE) := true ++ List of infix operators. for i in [ _ ["SHOEEQ" ,"="], _ ["TIMES" ,"*"], _ ["REM", "rem"],_ ["QUO", "quo"],_ ["PLUS" ,"+"], _ ["IS" ,"is"], _ ["ISNT" ,"isnt"], _ ["AND" ,"and"], _ ["OR" ,"or"], _ ["SLASH" ,"/"], _ ["POWER" ,"**"], _ ["MINUS" ,"-"], _ ["LT" ,"<"], _ ["GT" ,">"], _ ["LE" ,"<="], _ ["GE" ,">="], _ ["SHOENE" ,"~="] _ ]_ repeat property(first i,'SHOEINF) := second i ++ List of monoid operations and their neutral elements. ++ Note that `CONS' is not a monoid operations but support ++ right reduction. for i in [ _ ["+", 0] , _ ["gcd", 0] , _ ["lcm", 1] , _ ["STRCONC", '""] , _ ["strconc", '""] , _ ["CONCAT", '""] , _ ["MAX", -999999] , _ ["MIN", 999999] , _ ["*", 1] , _ ["times", 1] , _ ["CONS", nil] , _ ["append", nil] , _ ["append!", nil] , _ ["UNION", nil] , _ ["setUnion", nil] , _ ["union", nil] , _ ["and", true] , _ ["or", false] , _ ["AND", true] , _ ["OR", false] _ ] repeat property(first i,'SHOETHETA) := rest i for i in [ _ ["abs", "ABS"], _ ["abstractChar", "CODE-CHAR"], _ ["alphabetic?", "ALPHA-CHAR-P"], _ ["alphanumeric?", "ALPHANUMERICP"], _ ["and", "AND"] , _ ["array?", "ARRAYP"] , _ ["arrayRef", "AREF"] , _ ["atom", "ATOM"] , _ ["bitref", "SBIT"] , _ ["canonicalFilename", "PROBE-FILE"], _ ["charByName", "NAME-CHAR"] , _ ["charDowncase", "CHAR-DOWNCASE"], _ ["charEq?", "CHAR=" ], _ ["charUpcase", "CHAR-UPCASE"], _ ["charString", "STRING"] , _ ["char?", "CHARACTERP"] , _ ["codePoint", "CHAR-CODE"], _ ["cons?", "CONSP"] , _ ["copy", "COPY"] , _ ["copyString", "COPY-SEQ"] , _ ["copyVector", "COPY-SEQ"] , _ ["croak", "CROAK"] , _ ["digit?", "DIGIT-CHAR-P"] , _ ["exit", "EXIT"] , _ ["false", 'NIL] , _ ["fifth", "FIFTH"] , _ ["first", "CAR"] , _ ["fileNameString", "FILE-NAMESTRING" ] , _ ["filePath", "PATHNAME"] , _ ["filePath?", "PATHNAMEP"] , _ ["filePathDirectory", "PATHNAME-DIRECTORY"] , _ ["filePathName", "PATHNAME-NAME"] , _ ["filePathString", "NAMESTRING"] , _ ["filePathType", "PATHNAME-TYPE"] , _ ["float?", "FLOATP"] , _ ["flushOutput", "FORCE-OUTPUT"], _ ["fourth", "CADDDR"] , _ ["freshLine", "FRESH-LINE" ], _ ["function?","FUNCTIONP"] , _ ["functionSymbol?", "FBOUNDP"] , _ ["gensym", "GENSYM"] , _ ["genvar", "GENVAR"] , _ ["importSymbol", "IMPORT"] , _ ["inert?", "KEYWORDP"] , _ ["integer?","INTEGERP"] , _ ["LAST", "last"] , _ ["list", "LIST"] , _ ["listEq?", "EQUAL"] , _ ["lowerCase?", "LOWER-CASE-P"], _ ["makeFilePath", "MAKE-PATHNAME"] , _ ["makeSymbol", "INTERN"] , _ ["mergeFilePaths", "MERGE-PATHNAMES"] , _ ["newVector", "MAKE-ARRAY"], _ ["nil" ,NIL ] , _ ["not", "NOT"] , _ ["null", "NULL"] , _ ["odd?", "ODDP"] , _ ["or", "OR"] , _ ["otherwise", "T"] , _ ["property", "GET"] , _ ["readInteger", "PARSE-INTEGER"], _ ["readLispFromString", "READ-FROM-STRING"] , _ ["readOnly?","CONSTANTP"], _ ["removeDuplicates", "REMDUP"] , _ ["rest", "CDR"] , _ ["sameObject?", "EQ" ] , _ ["scalarEq?", "EQL" ] , _ ["scalarEqual?","EQL" ] , _ ["second", "CADR"] , _ ["setPart", "SETELT"] , _ ["strconc", "CONCAT"] , _ ["stringChar", "SCHAR"] , _ ["stringDowncase", "STRING-DOWNCASE"] , _ ["string?", "STRINGP"] ,_ ["stringEq?","STRING="] , _ ["stringUpcase", "STRING-UPCASE"] , _ ["subSequence", "SUBSEQ"] , _ ["symbolBinding", "FIND-SYMBOL"] , _ ["symbolScope", "SYMBOL-PACKAGE"] , _ ["symbolEq?", "EQ"], _ ["symbolFunction", "SYMBOL-FUNCTION"], _ ["symbolGlobal?", "BOUNDP"], _ ["symbolName", "SYMBOL-NAME"], _ ["symbolValue", "SYMBOL-VALUE"], _ ["symbol?", "SYMBOLP"] , _ ["third", "CADDR"] , _ ["toString", "WRITE-TO-STRING"], _ ["true", "T"] , _ ["upperCase?", "UPPER-CASE-P"], _ ["valueEq?", "EQUAL"] , _ ["vector?", "SIMPLE-VECTOR-P"], _ ["vectorRef", "SVREF"] , _ ["writeByte", "WRITE-BYTE"], _ ["writeChar", "WRITE-CHAR"], _ ["writeInteger", "PRINC"], _ ["writeLine", "WRITE-LINE"], _ ["writeNewline", "TERPRI"], _ ["writeString", "WRITE-STRING"], _ ["PLUS", "+"] , _ ["MINUS", "-"] , _ ["TIMES", "*"] , _ ["POWER", "EXPT"] , _ ['QUO, 'TRUNCATE],_ ["SLASH", "/"] , _ ["LT", "<"], _ ["GT", ">"] , _ ["LE", "<="], _ ["GE", ">="], _ ["SHOEEQ", "EQUAL"], _ ["SHOENE", "/="], _ ["T", "T$"] _ ] repeat property(first i,'SHOERENAME) := rest i for i in [ _ ["absKind", "CAR"] ,_ ["absParms", "CADR"] ,_ ["absBody", "CADDR"] ,_ ["loopBody", "loopBody"] ,_ ["loopExit", "last"] ,_ ["setName", 0] , _ ["setLabel", 1] , _ ["setLevel", 2] , _ ["setType", 3] , _ ["setVar", 4] , _ ["setLeaf", 5] , _ ["setDef", 6] , _ ["aGeneral", 4] , _ ["aMode", 1] , _ ["aModeSet", 3] , _ ["aTree", 0] , _ ["aValue", 2] , _ ["args", "CDR"] , _ ["attributes", "CADDR"] , _ ["cacheCount", "CADDDDR"] , _ ["cacheName", "CADR"] , _ ["cacheReset", "CADDDR"] , _ ["cacheType", "CADDR"] , _ ["env", "CADDR"] , _ ["expr", "CAR"] , _ ["CAR", "CAR"] , _ ["mmCondition", "CAADR"] , _ ["mmDC", "CAAR"] , _ ["mmImplementation","CADADR"] , _ ["mmSignature", "CDAR"] , _ ["mmTarget", "CADAR"] , _ ["mmSource", "CDDAR"] , _ ["mapOpsig", "CAR" ] , _ ["mapOperation", "CAAR" ] , _ ["mapSignature", "CADAR" ] , _ ["mapTarget", "CAADAR" ] , _ ["mapSource", "CDADAR" ] , _ ["mapPredicate", "CADR" ] , _ ["mapImpl", "CADDR" ] , _ ["mapKind", "CAADDR" ] , _ ["mode", "CADR"] , _ ["op", "CAR"] , _ ["opcode", "CADR"] , _ ["opSig", "CADR"] , _ ["CDR", "CDR"] , _ ["sig", "CDDR"] , _ ["source", "CDR"] , _ ["streamCode", "CADDDR"] , _ ["streamDef", "CADDR"] , _ ["streamName", "CADR"] , _ ["target", "CAR"] _ ] _ repeat property(first i,'SHOESELFUNCTION) := second i