aboutsummaryrefslogtreecommitdiff
path: root/parser.d
diff options
context:
space:
mode:
Diffstat (limited to 'parser.d')
-rw-r--r--parser.d24
1 files changed, 21 insertions, 3 deletions
diff --git a/parser.d b/parser.d
index 978b218..80e1626 100644
--- a/parser.d
+++ b/parser.d
@@ -252,6 +252,7 @@ class Parser {
int line;
bool peekable() {
+ writefln("pos %d source %d", pos, source.length);
return (pos < source.length);
}
@@ -259,25 +260,36 @@ class Parser {
if (pos < source.length) {
return source[pos];
} else {
- //writeln("peek returns null");
+ writeln("peek returns null");
return '\0';
}
}
char advance() {
+ if (!peekable()) {
+ writeln("trying to advance() beyond the end!!!");
+ return '\0';
+ } else {
+ char ret = peek();
+ pos++;
+ return ret;
+ }
+ /*
char ret = peek();
if (ret != '\0') {
pos++;
}
return ret;
+ */
}
void skipWhitespace() {
- while (canFind([' ', '\t', '\r', '\n'], peek())) {
+ while (peekable() && canFind([' ', '\t', '\r', '\n'], peek())) {
if (peek() == '\n') {
line++;
}
- pos++;
+ //pos++;
+ advance();
}
}
@@ -353,6 +365,8 @@ class Parser {
advance(); // closing paren
+ writefln("ending DEF pos %d", pos);
+
return def;
}
@@ -406,6 +420,7 @@ class Parser {
return new ParseError("unterminated block", line);
}
+ writefln("ending block pos %d", pos);
advance(); // consume closing paren
return block;
@@ -480,6 +495,9 @@ class Parser {
default:
return parseSymbol();
}
+
+ writeln("FELL THROUGH ON PARSE FORM");
+
advance();
return new Atom(0, -1);