/[mailutils]/mailutils/libsieve/sieve.y
ViewVC logotype

Diff of /mailutils/libsieve/sieve.y

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by gray, Fri Nov 8 15:53:37 2002 UTC revision 1.3 by gray, Tue Nov 12 16:27:47 2002 UTC
# Line 23  Line 23 
23  #include <stdlib.h>  #include <stdlib.h>
24  #include <assert.h>  #include <assert.h>
25  #include <sieve.h>  #include <sieve.h>
26    
27    sieve_machine_t *sieve_machine;
28    int sieve_error_count;
29  %}  %}
30    
31  %union {  %union {
# Line 31  Line 34 
34    sieve_instr_t instr;    sieve_instr_t instr;
35    sieve_value_t *value;    sieve_value_t *value;
36    list_t list;    list_t list;
37      size_t pc;
38    struct {    struct {
39      char *ident;      char *ident;
40      list_t args;      list_t args;
# Line 45  Line 49 
49  %type <value> arg  %type <value> arg
50  %type <list> slist stringlist arglist maybe_arglist  %type <list> slist stringlist arglist maybe_arglist
51  %type <command> command  %type <command> command
52    %type <number> testlist
53    %type <pc> action test statement list
54    
55  %%  %%
56    
57  input        : /* empty */  input        : /* empty */
58               | list               | list
59                   { /* to placate bison */ }
60               ;               ;
61    
62  list         : statement  list         : statement
# Line 59  list         : statement Line 66  list         : statement
66  statement    : REQUIRE stringlist ';'  statement    : REQUIRE stringlist ';'
67                 {                 {
68                   sieve_require ($2);                   sieve_require ($2);
69                   sieve_slist_destroy ($2);                   sieve_slist_destroy (&$2);
70                     $$ = sieve_machine->pc;
71                 }                 }
72               | action ';'               | action ';'
73               | IF cond block maybe_elsif maybe_else               | IF cond block maybe_elsif maybe_else
74                   {
75                     /* FIXME!! */
76                     $$ = sieve_machine->pc;
77                   }
78               ;               ;
79    
80  maybe_elsif  : /* empty */  maybe_elsif  : /* empty */
# Line 82  block        : '{' list '}' Line 94  block        : '{' list '}'
94    
95    
96  testlist     : cond  testlist     : cond
97                   {
98                     if (sieve_code_instr (instr_push))
99                       YYERROR;
100                     $$ = 1;
101                   }
102               | testlist ',' cond               | testlist ',' cond
103                   {
104                     if (sieve_code_instr (instr_push))
105                       YYERROR;
106                     $$ = $1 + 1;
107                   }
108               ;               ;
109    
110  cond         : test  cond         : test
111                   { /* to placate bison */ }
112               | ANYOF '(' testlist ')'               | ANYOF '(' testlist ')'
113                   {
114                     if (sieve_code_instr (instr_anyof)
115                         || sieve_code_number ($3))
116                       YYERROR;
117                   }
118               | ALLOF '(' testlist ')'               | ALLOF '(' testlist ')'
119                   {
120                     if (sieve_code_instr (instr_allof)
121                         || sieve_code_number ($3))
122                       YYERROR;
123                   }
124               | NOT cond               | NOT cond
125                   {
126                     if (sieve_code_instr (instr_not))
127                       YYERROR;
128                   }
129               ;               ;
130    
131  test         : command  test         : command
132                 {                 {
133                   sieve_register_t *reg = sieve_test_lookup ($1.ident);                   sieve_register_t *reg = sieve_test_lookup ($1.ident);
134                     $$ = sieve_machine->pc;
135    
136                   if (!reg)                   if (!reg)
137                     sieve_error ("%s:%d: unknown test: %s",                     sieve_error ("%s:%d: unknown test: %s",
138                                  sieve_filename, sieve_line_num,                                  sieve_filename, sieve_line_num,
# Line 102  test         : command Line 141  test         : command
141                     sieve_error ("%s:%d: test `%s' has not been required",                     sieve_error ("%s:%d: test `%s' has not been required",
142                                  sieve_filename, sieve_line_num,                                  sieve_filename, sieve_line_num,
143                                  $1.ident);                                  $1.ident);
144                   /*free unneeded memory */                   if (sieve_code_test (reg, $1.args))
145                       YYERROR;
146                 }                 }
147               ;               ;
148    
# Line 116  command      : IDENT maybe_arglist Line 156  command      : IDENT maybe_arglist
156  action       : command  action       : command
157                 {                 {
158                   sieve_register_t *reg = sieve_action_lookup ($1.ident);                   sieve_register_t *reg = sieve_action_lookup ($1.ident);
159                    
160                     $$ = sieve_machine->pc;
161                   if (!reg)                   if (!reg)
162                     sieve_error ("%s:%d: unknown action: %s",                     sieve_error ("%s:%d: unknown action: %s",
163                                  sieve_filename, sieve_line_num,                                  sieve_filename, sieve_line_num,
# Line 124  action       : command Line 166  action       : command
166                     sieve_error ("%s:%d: action `%s' has not been required",                     sieve_error ("%s:%d: action `%s' has not been required",
167                                  sieve_filename, sieve_line_num,                                  sieve_filename, sieve_line_num,
168                                  $1.ident);                                  $1.ident);
169                   /*free unneeded memory */                   if (sieve_code_action (reg, $1.args))
170                       YYERROR;
171                 }                 }
172               ;               ;
173    
# Line 138  maybe_arglist: /* empty */ Line 181  maybe_arglist: /* empty */
181  arglist      : arg  arglist      : arg
182                 {                 {
183                   list_create (&$$);                   list_create (&$$);
184                   list_append ($$, &$1);                   list_append ($$, $1);
185                 }                                 }                
186               | arglist arg               | arglist arg
187                 {                 {
188                   list_append ($1, &$2);                   list_append ($1, $2);
189                   $$ = $1;                   $$ = $1;
190                 }                 }
191               ;               ;
# Line 197  yyerror (char *s) Line 240  yyerror (char *s)
240    return 0;    return 0;
241  }  }
242    
243    /* FIXME: When posix thread support is added, sieve_machine_begin() should
244       aquire the global mutex, locking the current compilation session, and
245       sieve_machine_finish() should release it */
246    void
247    sieve_machine_begin (sieve_machine_t *mach, sieve_printf_t err, void *data)
248    {
249      memset (mach, 0, sizeof (*mach));
250    
251      mach->error_printer = err ? err : _sieve_default_error_printer;
252      mach->data = data;
253      sieve_machine = mach;
254      sieve_error_count = 0;
255      sieve_code_instr (NULL);
256    }
257    
258    void
259    sieve_machine_finish (sieve_machine_t *mach)
260    {
261      sieve_code_instr (NULL);
262    }
263    
264  int  int
265  sieve_parse (const char *name)  sieve_compile (sieve_machine_t *mach, const char *name,
266                   void *extra_data, sieve_printf_t err)
267  {  {
268      int rc;
269      
270      sieve_machine_begin (mach, err, extra_data);
271    sieve_register_standard_actions ();    sieve_register_standard_actions ();
272    sieve_register_standard_tests ();    sieve_register_standard_tests ();
273    sieve_open_source (name);    sieve_lex_begin (name);
274    return yyparse ();    rc = yyparse ();
275      sieve_lex_finish ();
276      sieve_machine_finish (mach);
277      if (sieve_error_count)
278        rc = 1;
279      return rc;
280  }  }
281    

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26