⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerparens.java

📁 A framework written in Java for implementing high-level and dynamic languages, compiling them into J
💻 JAVA
字号:
// Copyright (c) 2001  Per M.A. Bothner// This is free software;  for terms and warranty disclaimer see ./COPYING.package gnu.kawa.lispexpr;import gnu.text.*;import gnu.mapping.Values;public class ReaderParens extends ReadTableEntry{  char open;  char close;  int kind;  public int getKind()  {    return kind;  }  private static ReaderParens instance;  public static ReaderParens getInstance(char open, char close)  {    return getInstance(open, close, ReadTable.TERMINATING_MACRO);  }  public static ReaderParens getInstance(char open, char close, int kind)  {    if (open == '(' && close == ')' && kind == ReadTable.TERMINATING_MACRO)      {	if (instance == null)	  instance = new ReaderParens(open, close, kind);	return instance;      }    else      {	return new ReaderParens(open, close, kind);      }  }  public ReaderParens(char open, char close, int kind)  {    this.open = open;    this.close = close;    this.kind = kind;  } /** Read a list (possibly improper) of zero or more Scheme forms.   * Assumes '(' has been read.   */  public Object read (Lexer in, int ch, int count)    throws java.io.IOException, SyntaxException  {    return readList((LispReader) in, ch, count, close);  }  public static Object readList (LispReader lexer,				 int ch, int count, int close)    throws java.io.IOException, SyntaxException  {    LineBufferedReader port = lexer.getPort();    char saveReadState = lexer.pushNesting(close == ']' ? '[' : '(');    int startLine = port.getLineNumber();    int startColumn = port.getColumnNumber();    try      {	Object last = null;	Object list = lexer.makeNil();	boolean sawDot = false;	boolean sawDotCdr = false;	ReadTable readTable = ReadTable.getCurrent();	for (;;)	  {	    int line = port.getLineNumber();	    int column = port.getColumnNumber();	    ch = port.read();	    if (ch == close)	      break;	    if (ch < 0)	       lexer.eofError("unexpected EOF in list starting here",			      startLine + 1, startColumn);	    ReadTableEntry entry;	    if (ch == '.')	      {		ch = port.peek();		entry = readTable.lookup(ch);		int kind = entry == null ? ReadTable.ILLEGAL : entry.getKind();		if (kind == ReadTable.WHITESPACE		    || kind == ReadTable.TERMINATING_MACRO		    || kind == ReadTable.ILLEGAL)		  {		    port.skip();		    column++;		    if (ch == close)		      {			lexer.error("unexpected '"				    + ((char) close) + "' after '.'");			break;		      }		    if (ch < 0)		      lexer.eofError("unexpected EOF in list starting here",				     startLine + 1, startColumn);		    if (sawDot)		      {			lexer.error("multiple '.' in list");			sawDotCdr = false;			list = lexer.makeNil();			last = null;		      }		    sawDot = true;		  }		else		  {		    // Treat '.' as start of token.		    ch = '.';		    entry = ReadTableEntry.getConstituentInstance();		  }	      }	    else	      entry = readTable.lookup(ch);	    Object value = lexer.readValues(ch, entry, readTable);	    if (value == Values.empty)	      continue;            value = lexer.handlePostfix(value, readTable, line, column);	    // ( a1 ... an . cdr) creates an n-element list ended by	    // cdr.  If n==0, a reasonable (and common) extension is to	    // interpret this as a 0-element list ended by cdr - i.e.	    // just cdr by itself.	    if (sawDotCdr)	      {		lexer.error("multiple values after '.'");		last = null;		list = lexer.makeNil();		sawDotCdr = false;		continue;	      }	    else if (sawDot)	      {		sawDotCdr = true;	      }	    else	      {		if (last == null)		  {		    line = startLine;		    column = startColumn-1;		  }		value = lexer.makePair(value, line, column);	      }	    if (last == null)	      list = value;	    else	      lexer.setCdr(last, value);	    last = value;	  }	return list;      }    finally      {	lexer.popNesting(saveReadState);      }       }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -