"Compiling" version
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;
-}