%{ /* #define YYDEBUG 1 */ #define DEBUG_DEBUG #include #include #define YYPARSE_RETURN_TYPE int YYPARSE_RETURN_TYPE yyparse(void*); int yyerror(char*); #define yylex ((ParserInterface*)obj)->yylex /* #define YYLEX_PARAM &yylval */ %} /* BISON Declarations */ %pure_parser %union { int number; UFlexerReference ref; } %token tTOKEN_FIELD %token tBCC %token tBOUNDARY %token tCC %token tCOMMENTS %token tCONTENT_DISPOSITION %token tCONTENT_TYPE %token tCONTENT_TRANSFER_ENCODING %token tCRLF %token tDATE %token tENCRYPTED %token tEND_HEADER %token tFIELD_NAME %token tFILENAME %token tFROM %token tIN_REPLY_TO %token tKEYWORDS %token tMESSAGE_ID %token tQUOTED_STRING %token tRECEIVED %token tREFERENCES %token tREPLY_TO %token tRESENT_BCC %token tRESENT_CC %token tRESENT_DATE %token tRESENT_FROM %token tRESENT_MESSAGE_ID %token tRESENT_REPLY_TO %token tRESENT_SENDER %token tRESENT_TO %token tRETURN %token tSENDER %token tSTART_BODY %token tSTART_MULTIPART %token tSUBJECT %token tTEXT tMIMEVERSION %token tTO %token tEND_BODY %type fields message %type multipart_message_list multipart_message_item texts %type message_body message_body_item_list mandatory_message_body_item_list %type field fields_item field_body token_field content_item_list content_item user_defined_field field_name /* Grammar follows */ %% message: fields tEND_HEADER { U_INTERNAL_TRACE("yyparse() "); ((ParserInterface*)obj)->setHeaderBoundary($1.offset, $1.offset + $1.length); ((ParserInterface*)obj)->setBodyBoundary($2.offset + $2.length); /* Return immediately from yyparse(), indicating success. */ YYACCEPT; } | fields tSTART_BODY { U_INTERNAL_TRACE("yyparse() "); ((ParserInterface*)obj)->buildMultipart(); } message_body tEND_BODY { U_INTERNAL_TRACE("yyparse() "); ((ParserInterface*)obj)->setHeaderBoundary($1.offset, $1.offset + $1.length); ((ParserInterface*)obj)->setBodyBoundary($4.offset, $4.offset + $4.length); /* Return immediately from yyparse(), indicating success. */ YYACCEPT; } ; fields: fields_item { U_INTERNAL_TRACE("yyparse() "); $$ = $1; } | fields tCRLF fields_item { U_INTERNAL_TRACE("yyparse() "); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } ; fields_item: field ':' field_body { U_INTERNAL_TRACE("yyparse() %.*s", $1.length, $1.ptr); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | tDATE ':' field_body { U_INTERNAL_TRACE("yyparse() %.*s", $1.length, $1.ptr); ((ParserInterface*)obj)->setStartDate($3.offset, $3.length); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | tFROM ':' field_body { U_INTERNAL_TRACE("yyparse() %.*s", $1.length, $1.ptr); ((ParserInterface*)obj)->setFrom($3.offset, $3.length); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | tSUBJECT ':' field_body { U_INTERNAL_TRACE("yyparse() %.*s", $1.length, $1.ptr); ((ParserInterface*)obj)->setSubject($3.offset, $3.length); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | tMIMEVERSION ':' field_body { U_INTERNAL_TRACE("yyparse() %.*s", $1.length, $1.ptr); ((ParserInterface*)obj)->setMimeVersion($3.offset, $3.length); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | tCONTENT_TRANSFER_ENCODING ':' field_body { U_INTERNAL_TRACE("yyparse() %.*s", $1.length, $1.ptr); ((ParserInterface*)obj)->setContentTransferEncoding($3.offset, $3.length); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | tCONTENT_DISPOSITION ':' content_item_list { U_INTERNAL_TRACE("yyparse() %.*s", $1.length, $1.ptr); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | tCONTENT_TYPE ':' content_item_list { U_INTERNAL_TRACE("yyparse() %.*s", $1.length, $1.ptr); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } ; field: tRETURN { $$ = $1; } | tRECEIVED { $$ = $1; } | tSENDER { $$ = $1; } | tREPLY_TO { $$ = $1; } | tRESENT_REPLY_TO { $$ = $1; } | tRESENT_FROM { $$ = $1; } | tRESENT_SENDER { $$ = $1; } | tRESENT_DATE { $$ = $1; } | tTO { $$ = $1; } | tRESENT_TO { $$ = $1; } | tCC { $$ = $1; } | tRESENT_CC { $$ = $1; } | tBCC { $$ = $1; } | tRESENT_BCC { $$ = $1; } | tCOMMENTS { $$ = $1; } | tMESSAGE_ID { $$ = $1; } | tRESENT_MESSAGE_ID { $$ = $1; } | tIN_REPLY_TO { $$ = $1; } | tREFERENCES { $$ = $1; } | tKEYWORDS { $$ = $1; } | tENCRYPTED { $$ = $1; } | user_defined_field { $$ = $1; } ; field_body: tTEXT { $$ = $1; } ; user_defined_field: field_name { $$ = $1; } ; texts: tTEXT { $$ = $1; } ; content_item_list: content_item { $$ = $1; } | content_item_list ';' content_item { $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } ; content_item: token_field '/' token_field { ((ParserInterface*) obj)->setContentType($1.offset, $1.length, $3.offset, $3.length); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | token_field '=' tQUOTED_STRING { $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | token_field { $$ = $1; } | token_field '=' token_field { $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | tFILENAME '=' tQUOTED_STRING { ((ParserInterface*) obj)->setName($3.offset, $3.length); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } | tBOUNDARY '=' tQUOTED_STRING { ((ParserInterface*) obj)->boundary($3.offset, $3.length); $$.offset = $1.offset; $$.length = $3.offset - $1.offset + $3.length; } ; token_field: tTOKEN_FIELD { $$ = $1; } ; field_name: tFIELD_NAME { $$ = $1; } ; message_body: message_body_item_list multipart_message_list { $$.offset = $1.offset; $$.length = $2.offset - $1.offset + $2.length; } ; message_body_item_list: { $$.offset = 0; $$.length = 0; } | mandatory_message_body_item_list { $$ = $1; } ; mandatory_message_body_item_list: texts { $$ = $1; } | mandatory_message_body_item_list texts { $$.offset = $1.offset; $$.length = $2.offset - $1.offset + $2.length; } ; multipart_message_list: multipart_message_item { $$ = $1; } | multipart_message_list multipart_message_item { $$.offset = $1.offset; $$.length = $2.offset - $1.offset + $2.length; } ; multipart_message_item: tSTART_MULTIPART message_body_item_list { ((ParserInterface*) obj)->parse($2.offset, $2.length); $$.offset = $1.offset; $$.length = $2.offset - $1.offset + $2.length; } ; %% int yyerror(char* s) { U_INTERNAL_TRACE("yyerror(\"%s\")", s); /* extern int yylineno; U_INTERNAL_TRACE("yylineno=%d", yylineno) */ return -1; }