source: libabac/rt2.y @ 4b8e1c9

mei_rt2mei_rt2_fix_1meiyap-rt1rt2
Last change on this file since 4b8e1c9 was 36b100a, checked in by Mei <mei@…>, 12 years ago

1) fix up fruits_rt2_typed example to test different types of strings

as oset term

2) fix the abac_pl_yap.c's _abac_yap_query so the first term if given

a literal string will use ReadBuffer? instead of MkAtomTerm?

  • Property mode set to 100644
File size: 11.8 KB
RevLine 
[718ad924]1
[b5a3da4]2/* bison grammar rules for process new rt2 statements */
[718ad924]3
4%{
5// include the GNU extension of asprintf
6#define _GNU_SOURCE
7
8/* C declarations */
9#include <stdio.h>
10#include <string.h>
11
12#include "abac_pl_yy.h"
[0d0c3a9]13#include "abac_list.h"
[718ad924]14
[da5afdf]15/* lex tie-ins flag */
[718ad924]16int yyerror (char *s);
17
18FILE *abac_yyout = NULL;
19char *abac_yyfptr = NULL;
[da5afdf]20char *abac_yyfptr_encoded = NULL;
[718ad924]21
22void panic(char *msg);
23 
24%}
25/* Bison declarations */
26%union {
27struct _abac_yy_principal_t *pstruct;
[da5afdf]28struct _abac_yy_term_principal_t *ppstruct;
29struct _abac_yy_term_data_t *pdstruct;
[718ad924]30struct _abac_yy_role_t *rstruct;
[da5afdf]31struct _abac_yy_oset_t *ostruct;
32struct _abac_yy_term_t *dstruct;
33struct _abac_yy_expression_t *estruct;
[0d0c3a9]34struct _abac_list_t *lstruct;
[718ad924]35char *string;   /* For returning char strings */
[da5afdf]36int intval; /* for returning some value */
[718ad924]37}
[da5afdf]38
39%start input
40
[718ad924]41%type <lstruct> stmt
42%type <rstruct> rolepart
[da5afdf]43%type <estruct> roleleft
44%type <estruct> roleright
[718ad924]45%type <estruct> roleterm
[da5afdf]46%type <ostruct> osetpart
47%type <estruct> osetleft
48%type <estruct> osetright
49%type <estruct> osetterm
[718ad924]50%type <pstruct> keypart
[da5afdf]51%type <dstruct> terms
52%type <dstruct> term
[718ad924]53%type <pdstruct> typedpart
[da5afdf]54%type <pdstruct> otypetail
[718ad924]55%type <ppstruct> principalpart
[da5afdf]56%type <lstruct> rangetype
57%type <lstruct> values
[718ad924]58
[36b100a]59%token <string> IDEN                /* keyname or rolename or osetname */
[da5afdf]60%token <string> CAPIDEN             /* variable name */
61%token <string> ROLE                /* the word, role */
62%token <string> OSET                /* the word, oset */
63%token <string> PRINCIPAL           /* the word, principal */
64%token <string> OTYPE               /* integer,boolean,urn,time,string,float */
65%token <string> OTYPE_CONSTANT     
66%token <string> VARIABLE_CONSTANT   /* constant for ?AAA */
67%token <string> KEYTYPE             /* keyid | or something else */
68%token <string> KEYID_CONSTANT      /* keyid | or something else */
69%token <string> VALUE               /* range value in static constraint */
[718ad924]70
71%token  <operator>  DERIVE    "<-"
72%token  <operator>  DOT       "."
73%token  <operator>  AND       "&"
74%token  <operator>  LPAREN    "("
75%token  <operator>  RPAREN    ")"
76%token  <operator>  LSQUARE   "["
77%token  <operator>  RSQUARE   "]"
78%token  <operator>  LANGLE    "<"
79%token  <operator>  RANGLE    ">"
80%token  <operator>  COLON     ":"
81%token  <operator>  COMMA     ","
82%token  <operator>  QMARK     "?"
[da5afdf]83%token  <operator>  DOTDOT    ".."
[718ad924]84
85%%
86/* Grammar rules */
87
88input:      /* empty */
89             { }
[da5afdf]90     | stmt
[718ad924]91             { 
[b5a3da4]92               abac_yy_set_rule_clauses($1);
[718ad924]93             }
[da5afdf]94     ;
[718ad924]95 
96/* generate/concate prolog credentials clauses */
[da5afdf]97stmt : roleleft DERIVE roleright
98             {
99               abac_yy_expression_t *headexpr=$1;
100               abac_yy_expression_t *tailexpr=$3;
101               abac_list_t *ret=make_role_statement(headexpr, tailexpr);
102               if(ret == NULL) {
103                   panic("unable to parse the role rule statment");
104                   YYERROR;
105                   } else {
106                       $$=ret;
107               }
108             }
109     | osetleft DERIVE osetright
[718ad924]110             {
[da5afdf]111               abac_yy_expression_t *headexpr=$1;
112               abac_yy_expression_t *tailexpr=$3;
113               abac_list_t *ret=make_oset_statement(headexpr, tailexpr);
[718ad924]114               if(ret == NULL) {
[da5afdf]115                   panic("unable to parse the oset rule statment");
[718ad924]116                   YYERROR;
117                   } else {
118                       $$=ret;
119               }
120             }
[da5afdf]121     ;
[718ad924]122/*
123   [keyid:isi].role:modifyBy([keyid:mike])
124   [keyid:acme].role:preferred
125*/
[da5afdf]126roleleft : keypart DOT rolepart
[718ad924]127             {
128               abac_yy_principal_t *keypart=$1;
129               abac_yy_role_t *rolepart=$3;
[da5afdf]130               abac_yy_expression_t *expr=
131                    make_yy_expression(e_yy_EXPR_ROLE,keypart,rolepart,NULL);
[718ad924]132               $$=expr;
133             }
[da5afdf]134     ;
[718ad924]135
136/* [keyid:mike] */
[da5afdf]137keypart : LSQUARE KEYTYPE COLON
[b5a3da4]138             { abac_push_keyid_yystate(); }
[da5afdf]139          KEYID_CONSTANT
[b5a3da4]140             { abac_pop_yystate(); }
[da5afdf]141          RSQUARE
[718ad924]142             {
[da5afdf]143               char *cn=abac_cn_with_sha($5);
[718ad924]144               int idtype=abac_verify_keyid_type($2);
145               if(cn && idtype)  {
[da5afdf]146                 $$=make_yy_principal($5, cn, idtype);
[718ad924]147                 } else {
148                   panic("encountered an invalid SHA id");
149                   YYERROR;
150               }
151             }
[da5afdf]152     ;
[718ad924]153/*
154   role:modifyBy([keyid:mike],[keyid:ted])
155   role:modifyBy([keyid:mike])
156   role:preferred
157*/
[da5afdf]158rolepart : ROLE COLON IDEN LPAREN terms RPAREN
[718ad924]159             {
160               $$=make_yy_role($3,$5);
161             }
[da5afdf]162     | ROLE COLON IDEN
[718ad924]163             {
164               $$=make_yy_role($3,NULL);
165             }
[da5afdf]166     ;
[718ad924]167
168/*
169   [keyid:mike],[keyid:ted]
170   [keyid:mike]
171   [principal:?Z]
172??   [principal:?this]
173   [int:99]
174   [int:?Z]
175   [?]
176*/
[da5afdf]177terms : term COMMA terms
[718ad924]178             {
[da5afdf]179               abac_yy_term_t *nterm=$1;
180               abac_yy_term_t *terms=$3;
181               $$=add_yy_term(nterm, terms);
[718ad924]182             }
[da5afdf]183     | term
[718ad924]184             {
185               $$=$1;
186             }
[da5afdf]187     ;
[718ad924]188
[da5afdf]189term : LSQUARE QMARK RSQUARE
190             { $$= make_yy_term_dterm_anonymous(); }
191     | keypart
192             { $$= make_yy_term_dterm_named($1); }
193     | principalpart
194             { $$= make_yy_term_dterm_principal($1); }
195     | typedpart
196             { $$= make_yy_term_dterm_data($1); }
197     ;
198
199values : VALUE COMMA values
[b5a3da4]200             { $$=add_yy_val_range($3, $1); }
[da5afdf]201       |  VALUE
202             { $$=make_yy_val_range($1); }
203       ;
204     
205
206rangetype : LSQUARE VALUE DOTDOT VALUE RSQUARE
207             { $$=make_yy_minmax_range($2,$4); }
208          |  LSQUARE DOTDOT VALUE RSQUARE
209             { $$=make_yy_max_range($3); }
210          |  LSQUARE VALUE DOTDOT RSQUARE
211             { $$=make_yy_min_range($2); }
212          |  LSQUARE values RSQUARE
213             { $$=$2; }
214          ;
215
216/* [otype:?Z:{oset-constraint}] */
217/* [int:?I:[10 .. 20] */
[c586a3c]218/* [float:?F:[0.5 .. 2.5] */
219/* [string:?S:["abc",'efg',"hij"] -only listed range */
220/* urn same as string */
221/* time like int but with quoted string values */
[0d0c3a9]222otypetail :  VARIABLE_CONSTANT COLON
[da5afdf]223             {
[b5a3da4]224               abac_pop_yystate();
225               abac_push_range_yystate();
[718ad924]226             }
[da5afdf]227            rangetype
228            {
[b5a3da4]229              abac_pop_yystate();
[da5afdf]230              abac_yy_term_data_t *ptr=make_yy_term_data($1);
231              set_yy_term_data_is_variable(ptr);
232              set_yy_term_data_cond_range(ptr,$4);
233              $$=ptr;
234            }
235     | VARIABLE_CONSTANT
[b5a3da4]236            { abac_pop_yystate(); }
[da5afdf]237            osetleft
238            {
239              abac_yy_term_data_t *ptr=make_yy_term_data($1);
240              set_yy_term_data_is_variable(ptr);
[d845403]241              set_yy_term_data_cond_head_expr(ptr,$3);
[da5afdf]242              $$=ptr;
243            }
244     | VARIABLE_CONSTANT
245            {
[b5a3da4]246              abac_pop_yystate();
[da5afdf]247              abac_yy_term_data_t *ptr=make_yy_term_data($1);
248              set_yy_term_data_is_variable(ptr);
249              $$=ptr;
250            }
251     | OTYPE_CONSTANT
252            {
[b5a3da4]253              abac_pop_yystate();
[da5afdf]254              abac_yy_term_data_t *ptr=make_yy_term_data($1);
255              $$=ptr;
256            }
257     ;
258
259typedpart  : LSQUARE OTYPE COLON
[b5a3da4]260             { abac_push_yystate($2); }
[da5afdf]261             otypetail RSQUARE
262             {
263               abac_yy_term_data_t *ptr=$5;
264               char *tail_string=get_yy_term_data_name(ptr);
265               set_yy_term_data_type(ptr,$2);
266               if(is_yy_term_data_has_constraint(ptr)) {
267                  make_yy_range_constraint(ptr,tail_string);
[e88c95b]268                  make_yy_oset_constraint(ptr,tail_string);
[718ad924]269               }
[da5afdf]270               $$=$5;
[718ad924]271             }
[da5afdf]272     ;
273
[718ad924]274
275/* [principal:?Z] */
[da5afdf]276/* [principal:?Z{role-constraint}] */
277principalpart : LSQUARE PRINCIPAL COLON QMARK IDEN roleleft RSQUARE
278                {
279                  abac_yy_expression_t *expr=$6;
280                  char *tail_string=$5;
281                  abac_yy_term_principal_t *ptr=make_yy_term_principal(tail_string);
282                  set_yy_term_principal_cond_head_expr(ptr,expr);
283                  char *string=make_yy_role_constraint(ptr,tail_string);
284                  $$=ptr;
285                }
286              | LSQUARE PRINCIPAL COLON QMARK IDEN RSQUARE
287                { $$ = make_yy_term_principal($5); }
288     ;
[718ad924]289
[da5afdf]290roleright : roleterm AND roleright
[718ad924]291             {
[da5afdf]292               abac_yy_expression_t *nexpr=$1;
293               abac_yy_expression_t *exprs=$3;
294               $$=add_yy_expression(nexpr,exprs);
[718ad924]295             }
[da5afdf]296     | roleterm
[718ad924]297             { $$=$1; }
[da5afdf]298     ;
[718ad924]299
300/* role at tail/right side
301  [keyid:usc].role:employee.role:friend
302  [keyid:usc].role:worker
303  [keyid:mike]
304*/
305roleterm : keypart DOT rolepart DOT rolepart
306             {
307               abac_yy_principal_t *keypart=$1;
308               abac_yy_role_t *linked_rolepart=$3;
309               abac_yy_role_t *rolepart=$5;
[da5afdf]310               abac_yy_expression_t *expr=
311                  make_yy_expression(e_yy_EXPR_LINKED,keypart,rolepart,linked_rolepart);
[718ad924]312               $$=expr;
313             }
[da5afdf]314     | keypart DOT rolepart
[718ad924]315             {
316               abac_yy_principal_t *keypart=$1;
317               abac_yy_role_t *rolepart=$3;
[da5afdf]318               abac_yy_expression_t *expr=
319                   make_yy_expression(e_yy_EXPR_ROLE,keypart,rolepart,NULL);
[718ad924]320               $$=expr;
321             }
[da5afdf]322     | keypart
[718ad924]323             {
324               abac_yy_principal_t *keypart=$1;
[da5afdf]325               abac_yy_expression_t *expr=
326                   make_yy_expression(e_yy_EXPR_NAMED,keypart,NULL,NULL);
[718ad924]327               $$=expr;
328             }
[da5afdf]329     ;
330
331osetterm : keypart DOT rolepart DOT osetpart
332             {
333               abac_yy_principal_t *keypart=$1;
334               abac_yy_role_t *linked_rolepart=$3;
335               abac_yy_oset_t *osetpart=$5;
336               abac_yy_expression_t *expr=
337                  make_yy_expression(e_yy_EXPR_LINKED,keypart,osetpart,linked_rolepart);
338               $$=expr;
339             }
340     | keypart DOT osetpart
341             {
342               abac_yy_principal_t *keypart=$1;
343               abac_yy_oset_t *osetpart=$3;
344               abac_yy_expression_t *expr=
345                   make_yy_expression(e_yy_EXPR_OSET,keypart,osetpart,NULL);
346               $$=expr;
347             }
348     | keypart
349             {
350               abac_yy_principal_t *keypart=$1;
351               abac_yy_expression_t *expr=
352                   make_yy_expression(e_yy_EXPR_NAMED,keypart,NULL,NULL);
353               $$=expr;
354             }
355     | typedpart
356             {
357               abac_yy_term_data_t *objpart=$1;
358               abac_yy_expression_t *expr=
359                   make_yy_expression(e_yy_EXPR_OBJECT,objpart,NULL,NULL);
360               $$=expr;
361             }
362     ;
363
364/*
365   oset:access([urn:'fileA'])
366*/
367osetpart : OSET COLON IDEN LPAREN terms RPAREN
368             {
369               $$=make_yy_oset($3,$5);
370             }
371     | OSET COLON IDEN
372             {
373               $$=make_yy_oset($3,NULL);
374             }
375     ;
376
377
378osetleft : keypart DOT osetpart
379             {
380               abac_yy_principal_t *keypart=$1;
381               abac_yy_oset_t *osetpart=$3;
382               abac_yy_expression_t *expr=
383                    make_yy_expression(e_yy_EXPR_OSET,keypart,osetpart,NULL);
384               $$=expr;
385             }
386     ;
387
388osetright : osetterm AND osetright
389             {
390               abac_yy_expression_t *nexpr=$1;
391               abac_yy_expression_t *exprs=$3;
392               $$=add_yy_expression(nexpr,exprs);
393             }
394     | osetterm
395             { $$=$1; }
396     ;
[718ad924]397%%
398
[da5afdf]399
[718ad924]400/* Additional C code */
401int yywrap()
402{
403     /* exit when done lexing the current input */
404     return 1;
405}
406
407int yyerror (char *s)
408{
409     fprintf (abac_yyout,"yyerror: %s\n", s);
410}
411
412/* setting defaults */
413void abac_yyinit()
414{
415    abac_yyout=abac_get_yyout();
416    abac_yyfptr = abac_get_yyfptr();
[da5afdf]417    abac_yyfptr_encoded = abac_get_yyfptr_encoded();
[b5a3da4]418}
[718ad924]419
420void panic(char *msg)
421{
422     yyerror(msg);
423}
424
Note: See TracBrowser for help on using the repository browser.