summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hence.c3
-rw-r--r--lex.c5
-rw-r--r--parse.c2
-rw-r--r--token.h3
4 files changed, 13 insertions, 0 deletions
diff --git a/hence.c b/hence.c
index fbcb917..1fcd835 100644
--- a/hence.c
+++ b/hence.c
@@ -24,6 +24,9 @@ int main(int argc, char **argv) {
}
struct token *tok = lex_file(argv[1], fd);
+ if (!tok) {
+ return 1;
+ }
int p = parse(argv[1], fd, tok);
// gate_set_input("a", LOGIC_LOW);
diff --git a/lex.c b/lex.c
index 6777e42..19a7716 100644
--- a/lex.c
+++ b/lex.c
@@ -232,12 +232,17 @@ lex_line(void) {
struct token *
lex_file(const char *filename_local, FILE *fd_local) {
+ struct token start;
+
filename = filename_local;
fd = fd_local;
line_number = 1;
tok_cursor = tok_start = NULL;
+ start.type = TOK_BEGIN;
+ add_token(start);
+
while (NULL != fgets(buf, sizeof(buf), fd)) {
column_number = 0;
if (lex_line()) {
diff --git a/parse.c b/parse.c
index d955bc4..fb7855e 100644
--- a/parse.c
+++ b/parse.c
@@ -131,6 +131,8 @@ parse(const char *fname, FILE *f, struct token *t) {
filename = fname;
cursor = t;
+ EXPECT_AND_DISCARD_CRITICAL(TOK_BEGIN);
+
/* Eat leading EOL tokens */
while (cursor && cursor->type == TOK_EOL) {
kerchunk();
diff --git a/token.h b/token.h
index c00c870..453b554 100644
--- a/token.h
+++ b/token.h
@@ -4,6 +4,9 @@
#define MAX_IDENT_LENGTH 128
enum TOKEN_TYPE {
+ /* Nop token to indicate lexer success */
+ TOK_BEGIN,
+
/* Keywords */
TOK_MODULE,
TOK_INPUT,