diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-05-15 13:51:03 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-05-15 14:05:39 +0300 |
commit | a0826b4c7cd66c4862d9b61bb7e14d73fcba28f6 (patch) | |
tree | 71762fca263967e5803ce803b0a0aa94555e125d /src/grecs-gram.y | |
parent | fd64fa62bc68d8c2e0d693033e874fcc1f023544 (diff) | |
download | grecs-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.y | 80 |
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; -} |