KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > kawa > lispexpr > ReaderMacro


1 // Copyright (c) 2001 Per M.A. Bothner
2
// This is free software; for terms and warranty disclaimer see ./COPYING.
3

4 package gnu.kawa.lispexpr;
5 import gnu.mapping.*;
6 import gnu.text.*;
7
8 /** Wrapper for user-supplied reader macro procedure. */
9
10 public class ReaderMacro extends ReaderMisc
11 {
12   Procedure procedure;
13
14   public ReaderMacro(Procedure procedure, boolean nonTerminating)
15   {
16     super(nonTerminating ? ReadTable.NON_TERMINATING_MACRO
17       : ReadTable.TERMINATING_MACRO);
18     this.procedure = procedure;
19   }
20
21   public ReaderMacro(Procedure procedure)
22   {
23     super(ReadTable.TERMINATING_MACRO);
24     this.procedure = procedure;
25   }
26
27   public boolean isNonTerminating()
28   {
29     return kind == ReadTable.NON_TERMINATING_MACRO;
30   }
31
32   public Procedure getProcedure()
33   {
34     return procedure;
35   }
36
37   public Object JavaDoc read (Lexer in, int ch, int count)
38     throws java.io.IOException JavaDoc, SyntaxException
39   {
40     // java.io.Reader reader = in;
41
java.io.Reader JavaDoc reader = in.getPort();
42     try
43       {
44     return procedure.apply2(reader, Char.make(ch));
45       }
46     catch (java.io.IOException JavaDoc ex)
47       {
48     throw ex;
49       }
50     catch (gnu.text.SyntaxException ex)
51       {
52     throw ex;
53       }
54     catch (Throwable JavaDoc ex)
55       {
56     in.fatal("reader macro '"+procedure+"' threw: "+ex);
57     return null; // Never executed.
58
}
59   }
60 }
61
Popular Tags