aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog7
-rw-r--r--src/interp/debug.lisp27
-rw-r--r--src/interp/io.boot77
-rw-r--r--src/interp/lexing.boot54
-rw-r--r--src/interp/spad-parser.boot2
-rw-r--r--src/interp/spad.lisp2
6 files changed, 101 insertions, 68 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index c955eb68..8a32132b 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,4 +1,9 @@
-2012-06-06 Gabriel Dos Reis <gdr@cse.tamu.edu>
+2012-06-06 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * interp/lexing.boot: Move %Line to io.boot.
+ * interp/debug.lisp (SPAD_LONG_ERROR): Take a reader parameter. Tidy.
+
+2012-06-06 Gabriel Dos Reis <gdr@cs.tamu.edu>
* interp/io.boot (readePendingLines): Rename from readerLines.
Adjust callers.
diff --git a/src/interp/debug.lisp b/src/interp/debug.lisp
index e0231e65..2b3205ab 100644
--- a/src/interp/debug.lisp
+++ b/src/interp/debug.lisp
@@ -1130,19 +1130,36 @@ EXAMINE (SETQ RECNO (NOTE |$InputStream|))
"Print syntax error indication, underline character, scrub line."
(BUMPERRORCOUNT '|syntax|)
(COND ((AND (EQ DEBUGMODE 'YES) (NOT(CONSOLEINPUTP IN-STREAM)))
- (SPAD_LONG_ERROR))
- ((SPAD_SHORT_ERROR)))
+ (SPAD_LONG_ERROR rd))
+ ((SPAD_SHORT_ERROR rd)))
(|ioClear!| rd)
(throw |$SpadReaderTag| nil))
-(defun SPAD_LONG_ERROR ()
+(defun SPAD_LONG_ERROR (rd)
(SPAD_ERROR_LOC SPADERRORSTREAM)
- (iostat)
+ (|readerPrintCurrentLine| rd)
+ (and |$lineStack| (format t "Currently preparsed lines are:~%~%"))
+ (mapcar #'(lambda (line)
+ (format t "~&~5D> ~A~%" (car line) (cdr Line)))
+ |$lineStack|)
+ (if (= |$validTokens| 0)
+ (format t "~%There are no valid tokens.~%")
+ (format t "~%The number of valid tokens is ~S.~%" |$validTokens|))
+ (if (> |$validTokens| 0)
+ (progn (format t "The current token is~%")
+ (describe |$currentToken|)))
+ (if (> |$validTokens| 1)
+ (progn (format t "The next token is~%")
+ (describe |$nextToken|)))
+ (if (|tokenType| |$priorToken|)
+ (progn (format t "The prior token was~%")
+ (describe |$priorToken|)))
(unless (EQUAL OUT-STREAM SPADERRORSTREAM)
(SPAD_ERROR_LOC OUT-STREAM)
(TERPRI OUT-STREAM)))
-(defun SPAD_SHORT_ERROR () (current-line-show))
+(defun SPAD_SHORT_ERROR (rd)
+ (|readerPrintCurrentLine| rd))
(defun SPAD_ERROR_LOC (STR)
(format str "******** Spad Syntax Error detected ********"))
diff --git a/src/interp/io.boot b/src/interp/io.boot
index 13c26679..006781ac 100644
--- a/src/interp/io.boot
+++ b/src/interp/io.boot
@@ -101,17 +101,82 @@ findString(s1,s2,k == 0) ==
and/[stringChar(s1,j) = stringChar(s2,i+j) for j in 0..(n1-1)]]
--%
+--% Line abstract datatype
+--%
+structure %Line ==
+ Record(buf: %String, cchar: %Char, cidx: %Short,
+ lidx: %Short, no: %Short) with
+ lineBuffer == (.buf) -- input string buffer
+ lineCurrentChar == (.cchar) -- current character
+ lineCurrentIndex == (.cidx) -- current index
+ lineLastIndex == (.lidx) -- last valid index
+ lineNumber == (.no) -- line number
+
+makeLine(buf == makeString 0, ch == charByName "Return",
+ curIdx == 1, lstIdx == 0, no == 0) ==
+ mk%Line(buf,ch,curIdx,lstIdx,no)
+
+lineClear! l ==
+ lineBuffer(l) := makeString 0
+ lineCurrentChar(l) := charByName "Return"
+ lineCurrentIndex(l) := 1
+ lineLastIndex(l) := 0
+ lineNumber(l) := 0
+
+++ Sets string to be the next line stored in line
+lineNewLine!(s,l,no == nil) ==
+ sz := #s
+ lineLastIndex(l) := sz - 1
+ lineCurrentIndex(l) := 0
+ lineCurrentChar(l) := sz > 0 and s.0 or charByName '"Return"
+ lineBuffer(l) := s
+ lineNumber(l) := no or (lineNumber l + 1)
+
+++ Tests if line is empty or positioned past the last character
+lineAtEnd? l ==
+ lineCurrentIndex l >= lineLastIndex l
+
+++ Tests if line is empty or positioned past the last character
+linePastEnd? l ==
+ lineCurrentIndex l > lineLastIndex l
+
+++ Buffer from current index to last index
+lineCurrentSegment l ==
+ lineAtEnd? l => makeString 0
+ subSequence(lineBuffer l,lineCurrentIndex l,lineLastIndex l)
+
+lineNextChar l ==
+ lineBuffer(l).(1 + lineCurrentIndex l)
+
+lineAdvanceChar! l ==
+ n := lineCurrentIndex l + 1
+ lineCurrentIndex(l) := n
+ lineCurrentChar(l) := lineBuffer(l).n
+
+--%
--% Reader
--%
structure %Reader ==
- Record(ins: %InputStream, lines: %List %String,sline: %Line) with
- readerInput == (.ins)
- readerPendingLines == (.lines)
- readerSourceLine == (.sline) -- current input line
+ Record(ins: %InputStream,est: %OutputStream,
+ lines: %List %String,sline: %Line) with
+ readerInput == (.ins)
+ readerError == (.ost) -- error output stream
+ readerPendingLines == (.lines)
+ readerSourceLine == (.sline) -- current input line
-makeReader ist ==
- mk%Reader(ist,nil,makeLine())
+makeReader(ist,ost == 'T) ==
+ mk%Reader(ist,ost,nil,makeLine())
++ Add line `l' to the stack of pending lines.
readerDeferLine(rd,l) ==
readerPendingLines(rd) := [l,:readerPendingLines rd]
+
+++ Print current line into to the reader's error stream.
+readerPrintCurrentLine rd ==
+ l := readerSourceLine rd
+ if linePastEnd? l then
+ formatToStream(readerError rd,'"~&The current line is empty.~%")
+ else
+ formatToStream(readerError rd,'"~&The current line is:~%~%")
+ formatToStream(readerError rd,'"~&~5D> ~A~%",lineNumber l,lineBuffer l)
+ formatToStream(readerError rd,'"~v@T^~%",lineCurrentIndex l + 7)
diff --git a/src/interp/lexing.boot b/src/interp/lexing.boot
index a5d71f15..d5917620 100644
--- a/src/interp/lexing.boot
+++ b/src/interp/lexing.boot
@@ -42,60 +42,6 @@ namespace BOOT
module lexing
---%
---% Line abstract datatype
---%
-structure %Line ==
- Record(buf: %String, cchar: %Char, cidx: %Short,
- lidx: %Short, no: %Short) with
- lineBuffer == (.buf) -- input string buffer
- lineCurrentChar == (.cchar) -- current character
- lineCurrentIndex == (.cidx) -- current index
- lineLastIndex == (.lidx) -- last valid index
- lineNumber == (.no) -- line number
-
-
-makeLine(buf == makeString 0, ch == charByName "Return",
- curIdx == 1, lstIdx == 0, no == 0) ==
- mk%Line(buf,ch,curIdx,lstIdx,no)
-
-lineClear! l ==
- lineBuffer(l) := makeString 0
- lineCurrentChar(l) := charByName "Return"
- lineCurrentIndex(l) := 1
- lineLastIndex(l) := 0
- lineNumber(l) := 0
-
-++ Sets string to be the next line stored in line
-lineNewLine!(s,l,no == nil) ==
- sz := #s
- lineLastIndex(l) := sz - 1
- lineCurrentIndex(l) := 0
- lineCurrentChar(l) := sz > 0 and s.0 or charByName '"Return"
- lineBuffer(l) := s
- lineNumber(l) := no or (lineNumber l + 1)
-
-++ Tests if line is empty or positioned past the last character
-lineAtEnd? l ==
- lineCurrentIndex l >= lineLastIndex l
-
-++ Tests if line is empty or positioned past the last character
-linePastEnd? l ==
- lineCurrentIndex l > lineLastIndex l
-
-++ Buffer from current index to last index
-lineCurrentSegment l ==
- lineAtEnd? l => makeString 0
- subSequence(lineBuffer l,lineCurrentIndex l,lineLastIndex l)
-
-lineNextChar l ==
- lineBuffer(l).(1 + lineCurrentIndex l)
-
-lineAdvanceChar! l ==
- n := lineCurrentIndex l + 1
- lineCurrentIndex(l) := n
- lineCurrentChar(l) := lineBuffer(l).n
-
++ List of lines returned from preparse
$lineStack := nil
diff --git a/src/interp/spad-parser.boot b/src/interp/spad-parser.boot
index 88d37080..42cee897 100644
--- a/src/interp/spad-parser.boot
+++ b/src/interp/spad-parser.boot
@@ -975,7 +975,7 @@ parseSpadFile sourceFile ==
-- we need to restore the global input stream state after we
-- finished messing with it.
IN_-STREAM: local := MAKE_-INSTREAM sourceFile
- rd := makeReader IN_-STREAM
+ rd := makeReader(IN_-STREAM,$OutputStream)
INIT_-BOOT_/SPAD_-READER rd
-- If soureFile cannot be processed for whatever reasons
diff --git a/src/interp/spad.lisp b/src/interp/spad.lisp
index 13e21e27..804a6f3f 100644
--- a/src/interp/spad.lisp
+++ b/src/interp/spad.lisp
@@ -86,7 +86,7 @@
(unwind-protect
(progn
(setq in-stream (open ifile :direction :input))
- (setq rd (|makeReader| in-stream))
+ (setq rd (|makeReader| in-stream |$OutputStream|))
(init-boot/spad-reader rd)
(initialize-preparse rd)
(setq out-stream |$OutputStream|)