summaryrefslogtreecommitdiffstats
path: root/Parser/parsetok.c
diff options
context:
space:
mode:
Diffstat (limited to 'Parser/parsetok.c')
-rw-r--r--Parser/parsetok.c128
1 files changed, 65 insertions, 63 deletions
diff --git a/Parser/parsetok.c b/Parser/parsetok.c
index 100ca65..c75656f 100644
--- a/Parser/parsetok.c
+++ b/Parser/parsetok.c
@@ -1,74 +1,19 @@
/* 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;
-
-/* Parse input coming from the given tokenizer structure.
- Return error code. */
-
-static int
-parsetok(tok, g, start, n_ret)
- struct tok_state *tok;
- grammar *g;
- int start;
- node **n_ret;
-{
- parser_state *ps;
- int ret;
-
- if ((ps = newparser(g, start)) == NULL) {
- fprintf(stderr, "no mem for new parser\n");
- return E_NOMEM;
- }
-
- for (;;) {
- char *a, *b;
- int type;
- int len;
- char *str;
-
- type = tok_get(tok, &a, &b);
- if (type == ERRORTOKEN) {
- ret = tok->done;
- break;
- }
- len = b - a;
- str = NEW(char, len + 1);
- if (str == NULL) {
- fprintf(stderr, "no mem for next token\n");
- ret = E_NOMEM;
- break;
- }
- strncpy(str, a, len);
- str[len] = '\0';
- ret = addtoken(ps, (int)type, str);
- if (ret != E_OK) {
- if (ret == E_DONE) {
- *n_ret = ps->p_tree;
- ps->p_tree = NULL;
- }
- else if (tok->lineno <= 1 && tok->done == E_EOF)
- ret = E_EOF;
- break;
- }
- }
-
- delparser(ps);
- return ret;
-}
+/* Forward */
+static int parsetok PROTO((struct tok_state *, grammar *, int, node **));
-/* Parse input coming from a string. Return error code. */
+/* Parse input coming from a string. Return error code, print some errors. */
int
parsestring(s, g, start, n_ret)
@@ -94,11 +39,12 @@ parsestring(s, g, start, n_ret)
}
-/* Parse input coming from a file. Return error code. */
+/* Parse input coming from a file. Return error code, print some errors. */
int
-parsefile(fp, g, start, ps1, ps2, n_ret)
+parsefile(fp, filename, g, start, ps1, ps2, n_ret)
FILE *fp;
+ char *filename;
grammar *g;
int start;
char *ps1, *ps2;
@@ -114,7 +60,8 @@ parsefile(fp, g, start, ps1, ps2, n_ret)
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);
+ 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';
@@ -130,3 +77,58 @@ parsefile(fp, g, start, ps1, ps2, n_ret)
tok_free(tok);
return ret;
}
+
+
+/* Parse input coming from the given tokenizer structure.
+ Return error code. */
+
+static int
+parsetok(tok, g, start, n_ret)
+ struct tok_state *tok;
+ grammar *g;
+ int start;
+ node **n_ret;
+{
+ parser_state *ps;
+ int ret;
+
+ if ((ps = newparser(g, start)) == NULL) {
+ fprintf(stderr, "no mem for new parser\n");
+ return E_NOMEM;
+ }
+
+ for (;;) {
+ char *a, *b;
+ int type;
+ int len;
+ char *str;
+
+ type = tok_get(tok, &a, &b);
+ if (type == ERRORTOKEN) {
+ ret = tok->done;
+ break;
+ }
+ len = b - a;
+ str = NEW(char, len + 1);
+ if (str == NULL) {
+ fprintf(stderr, "no mem for next token\n");
+ ret = E_NOMEM;
+ break;
+ }
+ strncpy(str, a, len);
+ str[len] = '\0';
+ ret = addtoken(ps, (int)type, str, tok->lineno);
+ if (ret != E_OK) {
+ if (ret == E_DONE) {
+ *n_ret = ps->p_tree;
+ ps->p_tree = NULL;
+ }
+ else if (tok->lineno <= 1 && tok->done == E_EOF)
+ ret = E_EOF;
+ break;
+ }
+ }
+
+ delparser(ps);
+ return ret;
+}