aboutsummaryrefslogtreecommitdiff
path: root/src/grecs-gram.y
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-05-15 13:51:03 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-05-15 14:05:39 +0300
commita0826b4c7cd66c4862d9b61bb7e14d73fcba28f6 (patch)
tree71762fca263967e5803ce803b0a0aa94555e125d /src/grecs-gram.y
parentfd64fa62bc68d8c2e0d693033e874fcc1f023544 (diff)
downloadgrecs-a0826b4c7cd66c4862d9b61bb7e14d73fcba28f6.tar.gz
grecs-a0826b4c7cd66c4862d9b61bb7e14d73fcba28f6.tar.bz2
Provide a framework for multiple parsers. Implement meta1 parser.
* Makefile.am (EXTRA_DIST): Add build-aux/yyrename * am/grecs.m4: New options: parser-meta1 and all-parsers * src/.gitignore: Update. * src/Make.am [GRECS_COND_META1_PARSER]: Set GRECS_PARSER_META1 and GRECS_EXTRA_META1 (GRECS_SRC): Add new files. (EXTRA_DIST): Add GRECS_EXTRA_META1. (LEXCOMPILE,YACCCOMPILE): Redefine * src/grecs-gram.y: Don't include yygrecs.h (grecs_vasprintf,grecs_asprintf): Move to a separate file. (grecs_parse): Rename to grecs_grecs_parser. Actual grecs_parse is defined in parser.c (grecs_gram_trace): Move to parser.c * src/grecs-lex.l: Don't include yygrecs.h Use line_acc functions. * src/grecs.h (grecs_trace_flags): New extern. (GRECS_TRACE_GRAM, GRECS_TRACE_LEX): New flags. (grecs_lex_begin): Change signature. (grecs_grecs_parser,grecs_meta1_parser): New protos. (grecs_line_acc_create) (grecs_line_acc_free,grecs_line_acc_grow_char) (grecs_line_acc_grow_char_unescape) (grecs_line_acc_grow) (grecs_line_acc_grow_unescape_last): New protos. (GRECS_TXTACC_BUFSIZE): New const (grecs_txtacc_create,grecs_txtacc_free) (grecs_txtacc_grow,grecs_txtacc_finish) (grecs_txtacc_free_string): New protos. (grecs_value_match): New proto. * src/wordsplit.c (quote_transtab): Translate \" * src/yygrecs.h: Remove. * src/yytrans: New file. * build-aux/yyrename: New file. * src/asprintf.c: New file. * src/lineacc.c: New file. * src/meta1-gram.y: New file. * src/meta1-lex.l: New file. * src/parser.c: New file. * src/txtacc.c: New file. * doc/grecs_parse.3: Update. * doc/GRECS_SETUP.3: Update.
Diffstat (limited to 'src/grecs-gram.y')
-rw-r--r--src/grecs-gram.y80
1 files changed, 6 insertions, 74 deletions
diff --git a/src/grecs-gram.y b/src/grecs-gram.y
index 9f8d000..3452074 100644
--- a/src/grecs-gram.y
+++ b/src/grecs-gram.y
@@ -18,7 +18,6 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
-#include "yygrecs.h"
#include <grecs.h>
#include <grecs-gram.h>
#include <stdlib.h>
@@ -26,11 +25,10 @@
#include <string.h>
#include <errno.h>
-static struct grecs_node *parse_tree;
-int grecs_error_count;
-
-int grecs_default_port = 0;
+int yylex(void);
+int yyerror(char *s);
+static struct grecs_node *parse_tree;
%}
%union {
@@ -239,74 +237,13 @@ yyerror(char *s)
return 0;
}
-int
-grecs_vasprintf(char **pbuf, size_t *psize, const char *fmt, va_list ap)
-{
- char *buf = *pbuf;
- size_t buflen = *psize;
- int rc = 0;
-
- if (!buf) {
- if (buflen == 0)
- buflen = 512; /* Initial allocation */
-
- buf = calloc(1, buflen);
- if (buf == NULL)
- return ENOMEM;
- }
-
- for (;;) {
- ssize_t n = vsnprintf(buf, buflen, fmt, ap);
- if (n < 0 || n >= buflen || !memchr(buf, '\0', n + 1)) {
- char *newbuf;
- size_t newlen = buflen * 2;
- if (newlen < buflen) {
- rc = ENOMEM;
- break;
- }
- newbuf = realloc(buf, newlen);
- if (newbuf == NULL) {
- rc = ENOMEM;
- break;
- }
- buflen = newlen;
- buf = newbuf;
- } else
- break;
- }
-
- if (rc) {
- if (!*pbuf) {
- /* We made first allocation, now free it */
- free(buf);
- buf = NULL;
- buflen = 0;
- }
- }
-
- *pbuf = buf;
- *psize = buflen;
- return rc;
-}
-
-int
-grecs_asprintf(char **pbuf, size_t *psize, const char *fmt, ...)
-{
- int rc;
- va_list ap;
-
- va_start(ap, fmt);
- rc = grecs_vasprintf(pbuf, psize, fmt, ap);
- va_end(ap);
- return rc;
-}
-
struct grecs_node *
-grecs_parse(const char *name)
+grecs_grecs_parser(const char *name, int traceflags)
{
int rc;
- if (grecs_lex_begin(name))
+ if (grecs_lex_begin(name, traceflags & GRECS_TRACE_LEX))
return NULL;
+ yydebug = traceflags & GRECS_TRACE_GRAM;
parse_tree = NULL;
rc = yyparse();
if (grecs_error_count)
@@ -319,11 +256,6 @@ grecs_parse(const char *name)
return parse_tree;
}
-void
-grecs_gram_trace(int n)
-{
- yydebug = n;
-}

Return to:

Send suggestions and report system problems to the System administrator.