diff options
| author | Ben Winston | 2023-05-21 13:57:41 -0400 |
|---|---|---|
| committer | Ben Winston | 2023-05-21 13:57:41 -0400 |
| commit | b1183af95f45ba0162a91f7a308a4846418f03be (patch) | |
| tree | 0b01bbb21d733014b01ff8afc99f986c478822a7 /parser.d | |
| parent | 2ad2be250a68e907b308b120b934edcbfc99ae6e (diff) | |
move to using 2 stacks
Diffstat (limited to 'parser.d')
| -rw-r--r-- | parser.d | 24 |
1 files changed, 21 insertions, 3 deletions
@@ -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); |
