| 39 | import java.util.regex.Pattern; |
| 40 | |
| 41 | public class LispReader{ |
| 42 | |
| 43 | static final Symbol QUOTE = Symbol.intern("quote"); |
| 44 | static final Symbol THE_VAR = Symbol.intern("var"); |
| 45 | //static Symbol SYNTAX_QUOTE = Symbol.intern(null, "syntax-quote"); |
| 46 | static Symbol UNQUOTE = Symbol.intern("clojure.core", "unquote"); |
| 47 | static Symbol UNQUOTE_SPLICING = Symbol.intern("clojure.core", "unquote-splicing"); |
| 48 | static Symbol CONCAT = Symbol.intern("clojure.core", "concat"); |
| 49 | static Symbol SEQ = Symbol.intern("clojure.core", "seq"); |
| 50 | static Symbol LIST = Symbol.intern("clojure.core", "list"); |
| 51 | static Symbol APPLY = Symbol.intern("clojure.core", "apply"); |
| 52 | static Symbol HASHMAP = Symbol.intern("clojure.core", "hash-map"); |
| 53 | static Symbol HASHSET = Symbol.intern("clojure.core", "hash-set"); |
| 54 | static Symbol VECTOR = Symbol.intern("clojure.core", "vector"); |
| 55 | static Symbol WITH_META = Symbol.intern("clojure.core", "with-meta"); |
| 56 | static Symbol META = Symbol.intern("clojure.core", "meta"); |
| 57 | static Symbol DEREF = Symbol.intern("clojure.core", "deref"); |
| 58 | static Symbol READ_COND = Symbol.intern("clojure.core", "read-cond"); |
| 59 | static Symbol READ_COND_SPLICING = Symbol.intern("clojure.core", "read-cond-splicing"); |
| 60 | static Keyword UNKNOWN = Keyword.intern(null, "unknown"); |
| 61 | //static Symbol DEREF_BANG = Symbol.intern("clojure.core", "deref!"); |
| 62 | |
| 63 | static IFn[] macros = new IFn[256]; |
| 64 | static IFn[] dispatchMacros = new IFn[256]; |
| 65 | //static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^:/]][^:/]*/)?[\\D&&[^:/]][^:/]*"); |
| 66 | static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^/]].*/)?(/|[\\D&&[^/]][^/]*)"); |
| 67 | static Pattern arraySymbolPat = Pattern.compile("([\\D&&[^/:]].*)/([1-9])"); |
| 68 | //static Pattern varPat = Pattern.compile("([\\D&&[^:\\.]][^:\\.]*):([\\D&&[^:\\.]][^:\\.]*)"); |
| 69 | //static Pattern intPat = Pattern.compile("[-+]?[0-9]+\\.?"); |
| 70 | static Pattern intPat = |
| 71 | Pattern.compile( |
| 72 | "([-+]?)(?:(0)|([1-9][0-9]*)|0[xX]([0-9A-Fa-f]+)|0([0-7]+)|([1-9][0-9]?)[rR]([0-9A-Za-z]+)|0[0-9]+)(N)?"); |
| 73 | static Pattern ratioPat = Pattern.compile("([-+]?[0-9]+)/([0-9]+)"); |
| 74 | static Pattern floatPat = Pattern.compile("([-+]?[0-9]+(\\.[0-9]*)?([eE][-+]?[0-9]+)?)(M)?"); |
| 75 | static Pattern argPat = Pattern.compile("%(?:(&)|([1-9][0-9]*))?"); |
| 76 | //static Pattern accessorPat = Pattern.compile("\\.[a-zA-Z_]\\w*"); |
| 77 | //static Pattern instanceMemberPat = Pattern.compile("\\.([a-zA-Z_][\\w\\.]*)\\.([a-zA-Z_]\\w*)"); |
| 78 | //static Pattern staticMemberPat = Pattern.compile("([a-zA-Z_][\\w\\.]*)\\.([a-zA-Z_]\\w*)"); |
| 79 | //static Pattern classNamePat = Pattern.compile("([a-zA-Z_][\\w\\.]*)\\."); |
| 80 | |
| 81 | //symbol->gensymbol |
| 82 | static Var GENSYM_ENV = Var.create(null).setDynamic(); |
| 83 | //sorted-map num->gensymbol |
| 84 | static Var ARG_ENV = Var.create(null).setDynamic(); |
| 85 | static IFn ctorReader = new CtorReader(); |
| 86 | |
| 87 | // Dynamic var set to true in a read-cond context |
| 88 | static Var READ_COND_ENV = Var.create(null).setDynamic(); |
| 89 | |
| 90 | static |
| 91 | { |
| 92 | macros['"'] = new StringReader(); |
| 93 | macros[';'] = new CommentReader(); |
| 94 | macros['\''] = new WrappingReader(QUOTE); |
| 95 | macros['@'] = new WrappingReader(DEREF);//new DerefReader(); |
| 96 | macros['^'] = new MetaReader(); |
| 97 | macros['`'] = new SyntaxQuoteReader(); |
| 98 | macros['~'] = new UnquoteReader(); |