From 1b57a009e0473b03e5a66657a9a2ad444ee51c0d Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff Date: Fri, 8 Nov 2002 15:53:37 +0000 Subject: Fixed grammar. Added union, types and the basic actions. --- libsieve/sieve.y | 115 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 102 insertions(+), 13 deletions(-) (limited to 'libsieve/sieve.y') diff --git a/libsieve/sieve.y b/libsieve/sieve.y index 1341a5c0c..0fb8408d7 100644 --- a/libsieve/sieve.y +++ b/libsieve/sieve.y @@ -3,16 +3,16 @@ Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by + it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program 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. + GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ @@ -20,13 +20,32 @@ # include #endif #include +#include #include #include - %} -%token IDENT TAG NUMBER STRING MULTILINE -%token REQUIRE IF ELSIF ELSE ANYOF ALLOF TRUE FALSE NOT +%union { + char *string; + long number; + sieve_instr_t instr; + sieve_value_t *value; + list_t list; + struct { + char *ident; + list_t args; + } command; +} + +%token IDENT TAG +%token NUMBER +%token STRING MULTILINE +%token REQUIRE IF ELSIF ELSE ANYOF ALLOF NOT + +%type arg +%type slist stringlist arglist maybe_arglist +%type command + %% input : /* empty */ @@ -38,6 +57,10 @@ list : statement ; statement : REQUIRE stringlist ';' + { + sieve_require ($2); + sieve_slist_destroy ($2); + } | action ';' | IF cond block maybe_elsif maybe_else ; @@ -58,8 +81,8 @@ block : '{' list '}' ; -testlist : test - | testlist ',' test +testlist : cond + | testlist ',' cond ; cond : test @@ -68,37 +91,101 @@ cond : test | NOT cond ; -test : FALSE - | TRUE - | command +test : command + { + sieve_register_t *reg = sieve_test_lookup ($1.ident); + if (!reg) + sieve_error ("%s:%d: unknown test: %s", + sieve_filename, sieve_line_num, + $1.ident); + else if (!reg->required) + sieve_error ("%s:%d: test `%s' has not been required", + sieve_filename, sieve_line_num, + $1.ident); + /*free unneeded memory */ + } ; command : IDENT maybe_arglist + { + $$.ident = $1; + $$.args = $2; + } ; action : command + { + sieve_register_t *reg = sieve_action_lookup ($1.ident); + if (!reg) + sieve_error ("%s:%d: unknown action: %s", + sieve_filename, sieve_line_num, + $1.ident); + else if (!reg->required) + sieve_error ("%s:%d: action `%s' has not been required", + sieve_filename, sieve_line_num, + $1.ident); + /*free unneeded memory */ + } ; maybe_arglist: /* empty */ + { + $$ = NULL; + } | arglist ; arglist : arg + { + list_create (&$$); + list_append ($$, &$1); + } | arglist arg + { + list_append ($1, &$2); + $$ = $1; + } ; arg : stringlist + { + $$ = sieve_value_create (SVT_STRING_LIST, $1); + } | MULTILINE + { + $$ = sieve_value_create (SVT_STRING, $1); + } | NUMBER + { + $$ = sieve_value_create (SVT_NUMBER, &$1); + } | TAG + { + $$ = sieve_value_create (SVT_TAG, $1); + } ; stringlist : STRING + { + list_create (&$$); + list_append ($$, $1); + } | '[' slist ']' + { + $$ = $2; + } ; slist : STRING + { + list_create (&$$); + list_append ($$, $1); + } | slist ',' STRING + { + list_append ($1, $3); + $$ = $1; + } ; %% @@ -106,13 +193,15 @@ slist : STRING int yyerror (char *s) { - fprintf (stderr, "%s:%d: ", sieve_filename, sieve_line_num); - fprintf (stderr, "%s\n", s); + sieve_error ("%s:%d: %s", sieve_filename, sieve_line_num, s); + return 0; } int sieve_parse (const char *name) { + sieve_register_standard_actions (); + sieve_register_standard_tests (); sieve_open_source (name); return yyparse (); } -- cgit v1.2.1