diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index 100ca65..c75656f 100644
--- a/Parser/parsetok.c
+++ b/Parser/parsetok.c
@@ -1,16 +1,82 @@
 /* Parser-tokenizer link implementation */
 
-#include <stdio.h>
-
-#include "PROTO.h"
-#include "malloc.h"
+#include "pgenheaders.h"
 #include "tokenizer.h"
 #include "node.h"
 #include "grammar.h"
 #include "parser.h"
+#include "parsetok.h"
 #include "errcode.h"
 
-extern int debugging;
+
+/* Forward */
+static int parsetok PROTO((struct tok_state *, grammar *, int, node **));
+
+
+/* Parse input coming from a string.  Return error code, print some errors. */
+
+int
+parsestring(s, g, start, n_ret)
+	char *s;
+	grammar *g;
+	int start;
+	node **n_ret;
+{
+	struct tok_state *tok = tok_setups(s);
+	int ret;
+	
+	if (tok == NULL) {
+		fprintf(stderr, "no mem for tok_setups\n");
+		return E_NOMEM;
+	}
+	ret = parsetok(tok, g, start, n_ret);
+	if (ret == E_TOKEN || ret == E_SYNTAX) {
+		fprintf(stderr, "String parsing error at line %d\n",
+			tok->lineno);
+	}
+	tok_free(tok);
+	return ret;
+}
+
+
+/* Parse input coming from a file.  Return error code, print some errors. */
+
+int
+parsefile(fp, filename, g, start, ps1, ps2, n_ret)
+	FILE *fp;
+	char *filename;
+	grammar *g;
+	int start;
+	char *ps1, *ps2;
+	node **n_ret;
+{
+	struct tok_state *tok = tok_setupf(fp, ps1, ps2);
+	int ret;
+	
+	if (tok == NULL) {
+		fprintf(stderr, "no mem for tok_setupf\n");
+		return E_NOMEM;
+	}
+	ret = parsetok(tok, g, start, n_ret);
+	if (ret == E_TOKEN || ret == E_SYNTAX) {
+		char *p;
+		fprintf(stderr, "Parsing error: file %s, line %d:\n",
+						filename, tok->lineno);
+		*tok->inp = '\0';
+		if (tok->inp > tok->buf && tok->inp[-1] == '\n')
+			tok->inp[-1] = '\0';
+		fprintf(stderr, "%s\n", tok->buf);
+		for (p = tok->buf; p < tok->cur; p++) {
+			if (*p == '\t')
+				putc('\t', stderr);
+			else
+				putc(' ', stderr);
+		}
+		fprintf(stderr, "^\n");
+	}
+	tok_free(tok);
+	return ret;
+}
 
 
 /* Parse input coming from the given tokenizer structure.
@@ -51,7 +117,7 @@
 		}
 		strncpy(str, a, len);
 		str[len] = '\0';
-		ret = addtoken(ps, (int)type, str);
+		ret = addtoken(ps, (int)type, str, tok->lineno);
 		if (ret != E_OK) {
 			if (ret == E_DONE) {
 				*n_ret = ps->p_tree;
@@ -66,67 +132,3 @@
 	delparser(ps);
 	return ret;
 }
-
-
-/* Parse input coming from a string.  Return error code. */
-
-int
-parsestring(s, g, start, n_ret)
-	char *s;
-	grammar *g;
-	int start;
-	node **n_ret;
-{
-	struct tok_state *tok = tok_setups(s);
-	int ret;
-	
-	if (tok == NULL) {
-		fprintf(stderr, "no mem for tok_setups\n");
-		return E_NOMEM;
-	}
-	ret = parsetok(tok, g, start, n_ret);
-	if (ret == E_TOKEN || ret == E_SYNTAX) {
-		fprintf(stderr, "String parsing error at line %d\n",
-			tok->lineno);
-	}
-	tok_free(tok);
-	return ret;
-}
-
-
-/* Parse input coming from a file.  Return error code. */
-
-int
-parsefile(fp, g, start, ps1, ps2, n_ret)
-	FILE *fp;
-	grammar *g;
-	int start;
-	char *ps1, *ps2;
-	node **n_ret;
-{
-	struct tok_state *tok = tok_setupf(fp, ps1, ps2);
-	int ret;
-	
-	if (tok == NULL) {
-		fprintf(stderr, "no mem for tok_setupf\n");
-		return E_NOMEM;
-	}
-	ret = parsetok(tok, g, start, n_ret);
-	if (ret == E_TOKEN || ret == E_SYNTAX) {
-		char *p;
-		fprintf(stderr, "Parsing error at line %d:\n", tok->lineno);
-		*tok->inp = '\0';
-		if (tok->inp > tok->buf && tok->inp[-1] == '\n')
-			tok->inp[-1] = '\0';
-		fprintf(stderr, "%s\n", tok->buf);
-		for (p = tok->buf; p < tok->cur; p++) {
-			if (*p == '\t')
-				putc('\t', stderr);
-			else
-				putc(' ', stderr);
-		}
-		fprintf(stderr, "^\n");
-	}
-	tok_free(tok);
-	return ret;
-}
