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