{
: show
}
Where
Define (show file_name text message i)
Let {line start} (locate_token text i)
Let end i
In
Begin
(STDIO.print_line
(STRING.concat
[Right
file_name &
":" &
(Z.show line) &
": " &
message &
'nil]))
When [start < (STRING.length text)]
(show_token text start end)
End
End
Where
Define (locate_token text j)
Let {k line}
Iterate {i line k} From {0 1 0}
If [i = j]
{k line}
If [(STRING.fetch text i) = `\n`]
Continue {[i + 1] [line + 1] i}
Continue {[i + 1] line k}
In
Iterate {i} From {k}
Let start (SCAN.whitespace text i)
In
Let {i _} (SCAN.token text i)
In
If [i = j]
{line start}
Continue {i}
Define (show_token text start end)
Let n (STRING.length text)
In
Iterate {j line line_start} From {0 0 0}
Cond
| [j = n]
(OS.die "Unexpected EOF.")
| [j = start]
Let line_end
Iterate {i} From {j}
Cond
| [i = n]
(OS.die "Unexpected EOF.")
| [(STRING.fetch text i) = `\n`]
i
| True
Continue {[i + 1]}
;
In
Begin
(STDIO.print_line (STRING.clip text line_start line_end))
Iterate {i} From {line_start}
When [i != start]
(STDIO.print " ")
Continue {[i + 1]}
End
Iterate {i} From {start}
When [i != end]
(STDIO.print "^")
Continue {[i + 1]}
End
(STDIO.print_line "")
End
| [(STRING.fetch text j) = `\n`]
Continue {[j + 1] [line + 1] [j + 1]}
| True
Continue {[j + 1] line line_start}
;
Where
Let OS Package "os"
Let SCAN Package "scan"
Let STDIO Package "stdio"
Let STRING Package "string"
Let Z Package "z"