From a0826b4c7cd66c4862d9b61bb7e14d73fcba28f6 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Sun, 15 May 2011 13:51:03 +0300 Subject: 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. --- src/parser.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/parser.c (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c new file mode 100644 index 0000000..6f84bd8 --- /dev/null +++ b/src/parser.c @@ -0,0 +1,60 @@ +/* grecs - Gray's Extensible Configuration System + Copyright (C) 2007-2011 Sergey Poznyakoff + + Grecs is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 3 of the License, or (at your + option) any later version. + + Grecs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Grecs. If not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif +#include +#include +#include +#include "grecs.h" + +int grecs_error_count; +int grecs_default_port = 0; + +int grecs_trace_flags = 0; + +#ifndef GRECS_DEFAULT_PARSER +# define GRECS_DEFAULT_PARSER grecs_grecs_parser +#endif + +struct grecs_node *(*grecs_parser_fun)(const char *name, int trace) = + GRECS_DEFAULT_PARSER; + +void +grecs_gram_trace(int n) +{ + if (n) + grecs_trace_flags |= GRECS_TRACE_GRAM; + else + grecs_trace_flags &= ~GRECS_TRACE_GRAM; +} + +void +grecs_lex_trace(int n) +{ + if (n) + grecs_trace_flags |= GRECS_TRACE_LEX; + else + grecs_trace_flags &= ~GRECS_TRACE_LEX; +} + +struct grecs_node * +grecs_parse(const char *name) +{ + grecs_error_count = 0; + return grecs_parser_fun(name, grecs_trace_flags); +} -- cgit v1.2.1