%option stack %x BOOLEAN_S %x INTEGER_S %x FLOAT_S %x TIME_S %x URN_S %x STRING_S %x KEYID_S %x RANGE_S %top{ #include #include /* lex generated one */ #include "rt2.h" #include "abac_m64.h" static int debug=0; /* when using canned test string */ char INPUT_LINE[] = "usc.playground <- usc.employee.friend"; char *yyfptr = INPUT_LINE; /* assigned with default */ char *yyfptr_encoded=NULL; /* with yacc */ extern YYSTYPE yylval; #undef YY_INPUT #define YY_INPUT(buf,result,max_size) \ { \ if(yyfptr != NULL) { \ if(debug) printf("YY_INPUT, input max size is %d\n",max_size); \ char* c = strncpy(buf,yyfptr,max_size); \ if (max_size > 0) buf[max_size-1] = '\0'; \ if(strlen(yyfptr) > max_size) yyfptr = yyfptr + max_size-1; \ else yyfptr=NULL; \ result = (c == NULL ) ? YY_NULL : strlen(buf); \ if(debug) printf("YY_INPUT, buf size is %d\n",result); \ } else { \ buf[0] = '\0'; \ result = YY_NULL; \ } \ } } DIGIT [0-9] %% \. { if(debug) fprintf(yyout, " DOT " ); return DOT; } keyid { yylval.string=strdup(yytext); if(debug) fprintf(yyout," KEYTYPE "); return KEYTYPE; } [a-zA-Z0-9]+ { yylval.string=strdup(yytext); if(debug) fprintf(yyout," KEYID_CONSTANT "); return KEYID_CONSTANT; } oset { if(debug) fprintf(yyout," OSET "); return OSET; } role { if(debug) fprintf(yyout," ROLE "); return ROLE; } principal { if(debug) fprintf(yyout," PRINCIPAL "); return PRINCIPAL; } this { if(debug) fprintf(yyout," THIS "); return THIS; } This { if(debug) fprintf(yyout," THIS "); return THIS; } integer { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE(INTEGER) "); return OTYPE; } {DIGIT}+ { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE_CONSTANT(INTEGER) "); return OTYPE_CONSTANT; } [-]{DIGIT}+ { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE_CONSTANT(INTEGER) "); return OTYPE_CONSTANT; } boolean { yylval.string =strdup(yytext); if(debug) fprintf(yyout," OTYPE(BOOLEAN) "); return OTYPE; } true|false { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE_CONSTANT(BOOLEAN) "); return OTYPE_CONSTANT; } [?][A-Z][\-_a-zA-Z0-9]* { yylval.string=strdup(yytext+1); if(debug) fprintf(yyout," VARIABLE_CONSTANT(%s) ",yylval.string); return VARIABLE_CONSTANT; } [?] { yylval.string=strdup(yytext+1); if(debug) fprintf(yyout," QMARK "); return QMARK; } \[ { if(debug) fprintf(yyout," LSQUARE "); return LSQUARE; } \] { if(debug) fprintf(yyout," RSQUARE "); return RSQUARE; } \: { if(debug) fprintf(yyout," COLON "); return COLON; } float { yylval.string =strdup(yytext); if(debug) fprintf(yyout," OTYPE(FLOAT) "); return OTYPE; } -{DIGIT}+"."{DIGIT}+ | {DIGIT}+"."{DIGIT}+ | {DIGIT}+ | -{DIGIT}+ { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE_CONSTANT(FLOAT) "); return OTYPE_CONSTANT; } time { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE(TIME) "); return OTYPE; } {DIGIT}{DIGIT}*"T"{DIGIT}* { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE_CONSTANT(TIME) "); return OTYPE_CONSTANT; } urn { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE(URN) "); return OTYPE; } [']([^']|\\')*['] | ["]([^"]|\")*["] { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE_CONSTANT(URN)(%s) ",yylval.string); return OTYPE_CONSTANT; } string { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE(STRING) "); return OTYPE; } [']([^']|\\')*['] | ["]([^"]|\")*["] { yylval.string=strdup(yytext); if(debug) fprintf(yyout," OTYPE_CONSTANT(STRING)(%s) ", yylval.string); return OTYPE_CONSTANT; } \[ { if(debug) fprintf(yyout," LSQUARE "); return LSQUARE; } \] { if(debug) fprintf(yyout," RSQUARE "); return RSQUARE; } \.\. { if(debug) fprintf(yyout," DOTDOT "); return DOTDOT; } , { if(debug) fprintf(yyout," COMMA "); return COMMA; } true|false { yylval.string=strdup(yytext); if(debug) fprintf(yyout," VALUE(BOOLEAN)(%s) ", yylval.string); return VALUE; } [']([^']|\\')*['] | ["]([^"]|\")*["] { yylval.string=strdup(yytext); if(debug) fprintf(yyout," VALUE(STRING)(%s) ", yylval.string); return VALUE; } {DIGIT}+ | -{DIGIT}+ | -{DIGIT}.{DIGIT}+ | {DIGIT}.{DIGIT}+ | {DIGIT}+T{DIGIT}+ { yylval.string=strdup(yytext); if(debug) fprintf(yyout," VALUE(%s) ",yylval.string); return VALUE; } [a-zA-Z0-9][\-_a-zA-Z0-9]* { yylval.string=strdup(yytext); if(debug) fprintf(yyout," IDEN(%s) ", yylval.string); return IDEN; } \<- { if(debug) fprintf(yyout," DERIVE "); return DERIVE; } & { if(debug) fprintf(yyout, " AND " ); return AND; } , { if(debug) fprintf(yyout, " COMMA "); return COMMA; } \( { if(debug) fprintf(yyout, " LPAREN "); return LPAREN; } \) { if(debug) fprintf(yyout, " RPAREN "); return RPAREN; } \[ { if(debug) fprintf(yyout, " LSQUARE "); return LSQUARE; } \] { if(debug) fprintf(yyout, " RSQUARE "); return RSQUARE; } \: { if(debug) fprintf(yyout, " COLON "); return COLON; } \? { if(debug) fprintf(yyout, " QMARK "); return QMARK; } \n { /* ignore end-of-line */; } [ \t]+ { /* ignore whitespace */; } %% void abac_ll_reset_yyfptr(char *str) { yyfptr=str; yyfptr_encoded=abac_encode_string(str); } char* abac_ll_get_yyfptr() { return yyfptr; } char *abac_ll_get_yyfptr_encoded() { return yyfptr_encoded; } /* if using external file input, output */ void abac_ll_reset_yyin(FILE *new_yyin) { yyin=new_yyin; } void abac_ll_reset_yyout(FILE *new_yyout) { if(yyout) { fflush(yyout); fclose(yyout); } yyout=new_yyout; } void abac_ll_flush_yyout() { if(yyout) fflush(yyout); } FILE *abac_ll_get_yyin() { if(yyin) return yyin; else return stdin; } FILE *abac_ll_get_yyout() { if(yyout) return yyout; else return stdout; } void abac_ll_push_keyid_yystate() { if(debug) fprintf(yyout, "\n push keyid state\n"); yy_push_state(KEYID_S); } void abac_ll_push_range_yystate() { if(debug) fprintf(yyout, "\n push range state\n"); yy_push_state(RANGE_S); } void abac_ll_push_yystate(char *str) { if(strcmp(str,"boolean")==0) { if(debug) fprintf(yyout, "\n push boolean state\n"); yy_push_state(BOOLEAN_S); return; } if(strcmp(str,"integer")==0) { if(debug) fprintf(yyout, "\n push integer state\n"); yy_push_state(INTEGER_S); return; } if(strcmp(str,"float")==0) { if(debug) fprintf(yyout, "\n push float state\n"); yy_push_state(FLOAT_S); return; } if(strcmp(str,"time")==0) { if(debug) fprintf(yyout, "\n push time state\n"); yy_push_state(TIME_S); return; } if(strcmp(str,"urn")==0) { if(debug) fprintf(yyout, "\n push urn state\n"); yy_push_state(URN_S); return; } if(strcmp(str,"string")==0) { if(debug) fprintf(yyout, "\n push string state\n"); yy_push_state(STRING_S); return; } if(debug) fprintf(yyout, "eek.. lost in push_state\n"); } void abac_ll_pop_yystate() { if(debug) fprintf(yyout, " pop a state\n"); yy_pop_state(); }