Revision Log
Revision: 1.3 - (view) (download) (as text)
| 1 : | ktanaka | 1.1 | import java.io.*; |
| 2 : | |||
| 3 : | |||
| 4 : | public class LispInputStream { | ||
| 5 : | Reader reader; | ||
| 6 : | StreamTokenizer st; | ||
| 7 : | public LispInputStream(Reader reader){ | ||
| 8 : | this.reader=reader; | ||
| 9 : | st=new StreamTokenizer(reader); | ||
| 10 : | st.resetSyntax(); | ||
| 11 : | st.whitespaceChars('\u0000',' '); | ||
| 12 : | st.wordChars('!','\u00ff'); | ||
| 13 : | st.ordinaryChar('\''); | ||
| 14 : | st.ordinaryChar('('); | ||
| 15 : | st.ordinaryChar(')'); | ||
| 16 : | st.quoteChar('\"'); | ||
| 17 : | } | ||
| 18 : | public int nextToken() throws IOException{ | ||
| 19 : | int token=st.nextToken(); | ||
| 20 : | switch(token){ | ||
| 21 : | case StreamTokenizer.TT_NUMBER: | ||
| 22 : | ktanaka | 1.3 | // System.out.println("Number: "+st.nval+"String:"+st.sval); |
| 23 : | ktanaka | 1.1 | break; |
| 24 : | case StreamTokenizer.TT_WORD: | ||
| 25 : | ktanaka | 1.3 | // System.out.println("WORD: "+st.sval); |
| 26 : | ktanaka | 1.1 | break; |
| 27 : | default: | ||
| 28 : | ktanaka | 1.3 | // System.out.println("CHARACTER: "+token); |
| 29 : | ktanaka | 1.1 | break; |
| 30 : | } | ||
| 31 : | return token; | ||
| 32 : | } | ||
| 33 : | public LispObject readList() throws IOException{ | ||
| 34 : | LispObject a=nextObject(); | ||
| 35 : | int token=nextToken(); | ||
| 36 : | if(token==')') return new Cons(a,Symbol.nil); | ||
| 37 : | else if(token=='.') return new Cons(a,nextObject()); | ||
| 38 : | else{ | ||
| 39 : | st.pushBack(); | ||
| 40 : | return new Cons(a,readList()); | ||
| 41 : | } | ||
| 42 : | } | ||
| 43 : | public LispObject nextObject() throws IOException{ | ||
| 44 : | ktanaka | 1.3 | // System.out.println("nextObject"); |
| 45 : | ktanaka | 1.1 | int token=nextToken(); |
| 46 : | ktanaka | 1.3 | // System.out.println("token="+token); |
| 47 : | ktanaka | 1.1 | switch(token){ |
| 48 : | case '(': { | ||
| 49 : | ktanaka | 1.3 | // System.out.println("readList"); |
| 50 : | ktanaka | 1.1 | return readList(); |
| 51 : | } | ||
| 52 : | case '\'': { | ||
| 53 : | ktanaka | 1.3 | // System.out.println("quote"); |
| 54 : | ktanaka | 1.1 | LispObject ret=nextObject(); |
| 55 : | return new Cons(Symbol.quote,new Cons(ret,Symbol.nil)); | ||
| 56 : | } | ||
| 57 : | case '"': { | ||
| 58 : | return new LispString(st.sval); | ||
| 59 : | } | ||
| 60 : | case StreamTokenizer.TT_EOF: return null; | ||
| 61 : | case StreamTokenizer.TT_WORD: { | ||
| 62 : | if(Fixnum.isFixnumString(st.sval)) return new Fixnum(st.sval); | ||
| 63 : | if(Flonum.isFlonumString(st.sval)) return new Flonum(st.sval); | ||
| 64 : | return new Symbol(st.sval); | ||
| 65 : | } | ||
| 66 : | default: | ||
| 67 : | System.out.println("token="+token); | ||
| 68 : | } | ||
| 69 : | return null; | ||
| 70 : | } | ||
| 71 : | public static void main(String args[]) throws IOException{ | ||
| 72 : | LispInputStream lis; | ||
| 73 : | if(args.length>0) | ||
| 74 : | lis=new LispInputStream(new FileReader(args[0])); | ||
| 75 : | else | ||
| 76 : | lis=new LispInputStream(new InputStreamReader(System.in)); | ||
| 77 : | LispObject lo=null; | ||
| 78 : | while((lo=lis.nextObject())!=null){ | ||
| 79 : | System.out.println(lo); | ||
| 80 : | } | ||
| 81 : | } | ||
| 82 : | } |
|
ktanaka Powered by ViewCVS 1.0-dev |
ViewCVS and CVS Help |