BRLRead.java 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package gnu.kawa.brl;
  2. import gnu.kawa.io.InPort;
  3. import gnu.kawa.lispexpr.*;
  4. import gnu.text.SyntaxException;
  5. import gnu.mapping.*;
  6. import gnu.text.SourceMessages;
  7. import gnu.lists.*;
  8. /** A class to read Scheme forms (S-expressions). */
  9. public class BRLRead extends LispReader
  10. {
  11. int nesting;
  12. /** True if in literal text (even if nested inside an escaped expression). */
  13. public boolean inLiteral ()
  14. {
  15. return ((InPort) port).readState == ']';
  16. }
  17. void init()
  18. {
  19. ((InPort) port).readState = ']';
  20. }
  21. public BRLRead(InPort port)
  22. {
  23. super(port);
  24. init();
  25. }
  26. public BRLRead(InPort port, SourceMessages messages)
  27. {
  28. super(port, messages);
  29. init();
  30. }
  31. @Override
  32. public Object readCommand () throws java.io.IOException, SyntaxException {
  33. return readObject();
  34. }
  35. public Object readObject ()
  36. throws java.io.IOException, SyntaxException
  37. {
  38. int startPos = tokenBufferLength;
  39. InPort port = (InPort) getPort();
  40. int saveNesting = nesting;
  41. try
  42. {
  43. for (;;)
  44. {
  45. int ch = port.read();
  46. if (ch < 0)
  47. {
  48. if (port.readState != ']' && ! isInteractive())
  49. error('e', expressionStartFile,
  50. expressionStartLine + 1, expressionStartColumn,
  51. "an unmatched '[' was read");
  52. return Sequence.eofValue; // FIXME;
  53. }
  54. if (port.readState == ']')
  55. {
  56. port.unread();
  57. Object value = BRL.brlReader.read(this, ']', 1);
  58. if (ch == '[' && value == BRL.emptyForm)
  59. continue;
  60. return value;
  61. }
  62. else
  63. {
  64. if (ch == ']')
  65. port.readState = ']';
  66. else
  67. {
  68. nesting++;
  69. Object value = readValues(ch, ReadTable.getCurrent(), -1);
  70. if (value != Values.empty)
  71. {
  72. if (value == gnu.expr.QuoteExp.voidExp)
  73. value = Values.empty;
  74. return value;
  75. }
  76. nesting = saveNesting;
  77. }
  78. }
  79. }
  80. }
  81. finally
  82. {
  83. nesting = saveNesting;
  84. tokenBufferLength = startPos;
  85. //((InPort) port).readState = saveReadState;
  86. }
  87. }
  88. public static Object readObject(InPort port)
  89. throws java.io.IOException, SyntaxException
  90. {
  91. return (new BRLRead(port)).readObject();
  92. }
  93. boolean brlCompatible = false;
  94. public boolean isBrlCompatible() { return brlCompatible; }
  95. public void setBrlCompatible(boolean compat)
  96. {
  97. brlCompatible = compat;
  98. }
  99. /** Record '[' location for error messages. */
  100. String expressionStartFile;
  101. int expressionStartLine;
  102. int expressionStartColumn;
  103. void saveExpressionStartPosition()
  104. {
  105. expressionStartFile = port.getName();
  106. expressionStartLine = port.getLineNumber();
  107. expressionStartColumn = port.getColumnNumber();
  108. }
  109. }