| 22 | import java.util.regex.Pattern; |
| 23 | |
| 24 | public class EdnReader{ |
| 25 | |
| 26 | static IFn[] macros = new IFn[256]; |
| 27 | static IFn[] dispatchMacros = new IFn[256]; |
| 28 | static Pattern symbolPat = Pattern.compile("[:]?([\\D&&[^/]].*/)?(/|[\\D&&[^/]][^/]*)"); |
| 29 | static Pattern intPat = |
| 30 | Pattern.compile( |
| 31 | "([-+]?)(?:(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)?"); |
| 32 | static Pattern ratioPat = Pattern.compile("([-+]?[0-9]+)/([0-9]+)"); |
| 33 | static Pattern floatPat = Pattern.compile("([-+]?[0-9]+(\\.[0-9]*)?([eE][-+]?[0-9]+)?)(M)?"); |
| 34 | |
| 35 | static IFn taggedReader = new TaggedReader(); |
| 36 | |
| 37 | static |
| 38 | { |
| 39 | macros['"'] = new StringReader(); |
| 40 | macros[';'] = new CommentReader(); |
| 41 | macros['^'] = new MetaReader(); |
| 42 | macros['('] = new ListReader(); |
| 43 | macros[')'] = new UnmatchedDelimiterReader(); |
| 44 | macros['['] = new VectorReader(); |
| 45 | macros[']'] = new UnmatchedDelimiterReader(); |
| 46 | macros['{'] = new MapReader(); |
| 47 | macros['}'] = new UnmatchedDelimiterReader(); |
| 48 | macros['\\'] = new CharacterReader(); |
| 49 | macros['#'] = new DispatchReader(); |
| 50 | |
| 51 | |
| 52 | dispatchMacros['#'] = new SymbolicValueReader(); |
| 53 | dispatchMacros['^'] = new MetaReader(); |
| 54 | //dispatchMacros['"'] = new RegexReader(); |
| 55 | dispatchMacros['{'] = new SetReader(); |
| 56 | dispatchMacros['<'] = new UnreadableReader(); |
| 57 | dispatchMacros['_'] = new DiscardReader(); |
| 58 | dispatchMacros[':'] = new NamespaceMapReader(); |
| 59 | } |
| 60 | |
| 61 | static boolean nonConstituent(int ch){ |
| 62 | return ch == '@' || ch == '`' || ch == '~'; |
| 63 | } |
| 64 | |
| 65 | static public Object readString(String s, IPersistentMap opts){ |
| 66 | PushbackReader r = new PushbackReader(new java.io.StringReader(s)); |
| 67 | return read(r, opts); |
| 68 | } |
| 69 | |
| 70 | static boolean isWhitespace(int ch){ |
| 71 | return Character.isWhitespace(ch) || ch == ','; |
| 72 | } |
| 73 | |
| 74 | static void unread(PushbackReader r, int ch) { |
| 75 | if(ch != -1) |
| 76 | try |
| 77 | { |
| 78 | r.unread(ch); |
| 79 | } |
| 80 | catch(IOException e) |
| 81 | { |