ReaderMacro.java 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // Copyright (c) 2001 Per M.A. Bothner
  2. // This is free software; for terms and warranty disclaimer see ./COPYING.
  3. package gnu.kawa.lispexpr;
  4. import gnu.mapping.*;
  5. import gnu.text.*;
  6. /** Wrapper for user-supplied reader macro procedure. */
  7. public class ReaderMacro extends ReaderMisc
  8. {
  9. Procedure procedure;
  10. public ReaderMacro(Procedure procedure, boolean nonTerminating)
  11. {
  12. super(nonTerminating ? ReadTable.NON_TERMINATING_MACRO
  13. : ReadTable.TERMINATING_MACRO);
  14. this.procedure = procedure;
  15. }
  16. public ReaderMacro(Procedure procedure)
  17. {
  18. super(ReadTable.TERMINATING_MACRO);
  19. this.procedure = procedure;
  20. }
  21. public boolean isNonTerminating()
  22. {
  23. return kind == ReadTable.NON_TERMINATING_MACRO;
  24. }
  25. public Procedure getProcedure()
  26. {
  27. return procedure;
  28. }
  29. public Object read (Lexer in, int ch, int count)
  30. throws java.io.IOException, SyntaxException
  31. {
  32. // java.io.Reader reader = in;
  33. java.io.Reader reader = in.getPort();
  34. try
  35. {
  36. return procedure.apply2(reader, Char.make(ch));
  37. }
  38. catch (java.io.IOException ex)
  39. {
  40. throw ex;
  41. }
  42. catch (gnu.text.SyntaxException ex)
  43. {
  44. throw ex;
  45. }
  46. catch (Throwable ex)
  47. {
  48. in.fatal("reader macro '"+procedure+"' threw: "+ex);
  49. return null; // Never executed.
  50. }
  51. }
  52. }