12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- // Copyright (c) 2001 Per M.A. Bothner
- // This is free software; for terms and warranty disclaimer see ./COPYING.
- package gnu.kawa.lispexpr;
- import gnu.mapping.*;
- import gnu.text.*;
- /** Wrapper for user-supplied reader macro procedure. */
- public class ReaderMacro extends ReaderMisc
- {
- Procedure procedure;
- public ReaderMacro(Procedure procedure, boolean nonTerminating)
- {
- super(nonTerminating ? ReadTable.NON_TERMINATING_MACRO
- : ReadTable.TERMINATING_MACRO);
- this.procedure = procedure;
- }
- public ReaderMacro(Procedure procedure)
- {
- super(ReadTable.TERMINATING_MACRO);
- this.procedure = procedure;
- }
- public boolean isNonTerminating()
- {
- return kind == ReadTable.NON_TERMINATING_MACRO;
- }
- public Procedure getProcedure()
- {
- return procedure;
- }
- public Object read (Lexer in, int ch, int count)
- throws java.io.IOException, SyntaxException
- {
- // java.io.Reader reader = in;
- java.io.Reader reader = in.getPort();
- try
- {
- return procedure.apply2(reader, Char.make(ch));
- }
- catch (java.io.IOException ex)
- {
- throw ex;
- }
- catch (gnu.text.SyntaxException ex)
- {
- throw ex;
- }
- catch (Throwable ex)
- {
- in.fatal("reader macro '"+procedure+"' threw: "+ex);
- return null; // Never executed.
- }
- }
- }
|