%{ /************************************************************************** * File Name: rep.y * Short Desc.: Parser definitions for bison. * Date: 03/07/1997 * Author: Antal Nagy, Dept. of Applied Informatics, * Jozsef Attila University, Szeged, Hungary * email: nagya@inf.u-szeged.hu * WWW: http://www.inf.u-szeged.hu/~nagya * Copyright (c) 1997 **************************************************************************/ #include "report.h" #ifdef STDC_HEADERS # include #else # ifdef HAVE_STRING_H # include # endif #endif #ifdef STDC_HEADERS #include #endif #ifdef HAVE_MEM_H #include #endif ReportElement *TREE; #define YYERROR_VERBOSE %} %union { char *comment; char *id; char *class; char *attrname; char *attrvalue; char *cid; char *per; HeadElement *head; AttrElement *attr; ItemElement *item; ReportElement *tag; AttrValElement *attrval; PerAttrValElement *perattrval; } %token REPORT %token ID %token COMMENT %token ATTRNAME %token ATTRVALUE %token CID %token CIDVALUE %token FINDINGSGR %token CLASS %token OBSERV %token RELATION %token SQBEG %token SQEND %token SQSEP %token _EOF_ %token PERMITTED %type com %type rephead %type findhead %type observhead %type relhead %type report %type findings %type findinggr %type observgr %type observ %type relationships %type relationship %type attrs %type attr %type sequence %type sqitems %type sqitem %type valuetag %type values %type permitvalues %type permitvals %type permit %% input: /* empty */ { TREE = NULL; } | _EOF_ /* empty */ { TREE = NULL; } | report { } | report _EOF_ { } | '{' findings '}' { TREE = $2; } | '{' findings '}' _EOF_ { TREE = $2; } | '{' observgr '}' { TREE = $2; } | '{' observgr '}' _EOF_ { TREE = $2; } ; report: '{' rephead attrs '{' findings '}' '}' { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->parent = NULL; $$->value.head = $2; $$->attributum = $3; $$->header = $5; fillparent($$->attributum, $$); fillparent($$->header, $$); TREE = $$; } | '{' rephead attrs '{' findings '}' '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->parent = NULL; $$->value.head = $2; $$->attributum = $3; $$->header = $5; $$->comment = $8; fillparent($$->attributum, $$); fillparent($$->header, $$); TREE = $$; } | '{' rephead attrs '{' findings '}' com '}' { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->parent = NULL; $$->value.head = $2; $$->attributum = $3; $$->header = $5; fillgroupComment($$->header, $7); fillparent($$->attributum, $$); fillparent($$->header, $$); TREE = $$; } | '{' rephead attrs '{' findings '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->parent = NULL; $$->value.head = $2; $$->attributum = $3; $$->header = $5; $$->comment = $9; fillgroupComment($$->header, $7); fillparent($$->attributum, $$); fillparent($$->header, $$); TREE = $$; } | '{' rephead '{' findings '}' '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->parent = NULL; $$->value.head = $2; $$->comment = $7; $$->header = $4; fillparent($$->header, $$); TREE = $$; } | '{' rephead '{' findings '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->parent = NULL; $$->value.head = $2; $$->comment = $8; $$->header = $4; fillgroupComment($$->header, $6); fillparent($$->header, $$); TREE = $$; } | '{' rephead attrs '{' '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->parent = NULL; $$->value.head = $2; $$->comment = $8; $$->attributum = $3; $$->header = (ReportElement *)malloc(sizeof(ReportElement)); memset($$->header, 0, sizeof(ReportElement)); $$->header->groupComment = $6; $$->header->parent = $$; fillparent($$->attributum, $$); TREE = $$; } | '{' rephead '{' '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->parent = NULL; $$->value.head = $2; $$->groupComment = $7; $$->header = (ReportElement *)malloc(sizeof(ReportElement)); memset($$->header, 0, sizeof(ReportElement)); $$->header->groupComment = $5; $$->header->parent = $$; TREE = $$; } ; rephead: REPORT '-' ID ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_REPORT; $$->id = $3; } | REPORT ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_REPORT; } | REPORT '-' ID com ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_REPORT; $$->id = $3; $$->comment = $4; } | REPORT com ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_REPORT; $$->comment = $2; } ; findings: findings findinggr { $$ = $1; $$->prev->next = $2; $2->prev = $$->prev; $$->prev = $2; } | findinggr ; findinggr: '{' findhead attrs '{' observgr '}' '}' { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->attributum = $3; $$->header = $5; fillparent($$->attributum, $$); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' findhead attrs '{' observgr '}' com '}' { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->attributum = $3; $$->header = $5; fillgroupComment($$->header, $7); fillparent($$->attributum, $$); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' findhead attrs '{' observgr '}' '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->comment = $8; $$->attributum = $3; $$->header = $5; fillparent($$->attributum, $$); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' findhead attrs '{' observgr '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->comment = $9; $$->attributum = $3; $$->header = $5; fillgroupComment($$->header, $7); fillparent($$->attributum, $$); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' findhead '{' observgr '}' '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->comment = $7; $$->header = $4; fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' findhead '{' observgr '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->comment = $8; $$->header = $4; fillgroupComment($$->header, $6); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' findhead attrs '{' '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->attributum = $3; $$->comment = $8; $$->header = (ReportElement *)malloc(sizeof(ReportElement)); memset($$->header, 0, sizeof(ReportElement)); $$->header->groupComment = $6; $$->header->parent = $$; fillparent($$->attributum, $$); $$->next = NULL; $$->prev = $$; } | '{' findhead '{' '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->comment = $7; $$->value.head = $2; $$->header = (ReportElement *)malloc(sizeof(ReportElement)); memset($$->header, 0, sizeof(ReportElement)); $$->header->groupComment = $5; $$->header->parent = $$; $$->next = NULL; $$->prev = $$; } ; findhead: FINDINGSGR '-' ID ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_FINDING; $$->id = $3; } | FINDINGSGR ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_FINDING; } | FINDINGSGR '-' ID com ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_FINDING; $$->id = $3; $$->comment = $4; } | FINDINGSGR com ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_FINDING; $$->comment = $2; } ; observgr: observgr observ { $$ = $1; $$->prev->next = $2; $2->prev = $$->prev; $$->prev = $2; } | observ ; observ: '{' observhead attrs '{' relationships '}' '}' { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->attributum = $3; $$->header = $5; fillparent($$->attributum, $$); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' observhead attrs '{' relationships '}' com '}' { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->attributum = $3; $$->header = $5; fillgroupComment($$->header, $7); fillparent($$->attributum, $$); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' observhead attrs '{' relationships '}' '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->comment = $8; $$->attributum = $3; $$->header = $5; fillparent($$->attributum, $$); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' observhead attrs '{' relationships '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->comment = $9; $$->attributum = $3; $$->header = $5; fillgroupComment($$->header, $7); fillparent($$->attributum, $$); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' observhead '{' relationships '}' '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->comment = $7; $$->header = $4; fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' observhead '{' relationships '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->comment = $8; $$->header = $4; fillgroupComment($$->header, $6); fillparent($$->header, $$); $$->next = NULL; $$->prev = $$; } | '{' observhead attrs '{' '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->attributum = $3; $$->comment = $8; fillparent($$->attributum, $$); $$->header = (ReportElement *)malloc(sizeof(ReportElement)); memset($$->header, 0, sizeof(ReportElement)); $$->header->groupComment = $6; $$->header->parent = $$; $$->next = NULL; $$->prev = $$; } | '{' observhead '{' '}' com '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->comment = $7; $$->value.head = $2; $$->header = (ReportElement *)malloc(sizeof(ReportElement)); memset($$->header, 0, sizeof(ReportElement)); $$->header->groupComment = $5; $$->header->parent = $$; $$->next = NULL; $$->prev = $$; } ; observhead: CLASS OBSERV '-' ID ')' ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_OBSERV; $$->class = $1; $$->id = $4; } | CLASS OBSERV ')' ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_OBSERV; $$->class = $1; } | CLASS OBSERV '-' ID com ')' ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_OBSERV; $$->class = $1; $$->id = $4; $$->comment = $5; } | CLASS OBSERV com ')' ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_OBSERV; $$->class = $1; $$->comment = $3; } ; relationships: relationships '|' relationship { $$ = $1; $$->prev->next = $3; $3->prev = $$->prev; $$->prev = $3; } | relationship ; relationship: '{' relhead '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->comment = $4; $$->next = NULL; $$->prev = $$; } | '{' relhead attrs '}' { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->attributum = $3; fillparent($$->attributum, $$); $$->next = NULL; $$->prev = $$; } | '{' relhead attrs '}' com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.head = $2; $$->attributum = $3; $$->comment = $5; fillparent($$->attributum, $$); $$->next = NULL; $$->prev = $$; } ; relhead: RELATION '-' ID ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_RELAT; $$->id = $3; } | RELATION ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_RELAT; } | RELATION '-' ID com ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_RELAT; $$->id = $3; $$->comment = $4; } | RELATION com ':' { $$ = (HeadElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->type = HT_RELAT; $$->comment = $2; } ; attrs: attrs '|' attr { $$ = $1; $$->prev->next = $3; $3->prev = $$->prev; $$->prev = $3; } | attr ; attr: ATTRNAME '=' values { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.attr = (AttrElement *)malloc(sizeof(AttrElement)); memset($$->value.attr, 0, sizeof(AttrElement)); $$->value.attr->attrname = $1; $$->value.attr->values = $3; $$->next = NULL; $$->prev = $$; } | ATTRNAME com '=' values { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.attr = (AttrElement *)malloc(sizeof(AttrElement)); memset($$->value.attr, 0, sizeof(AttrElement)); $$->value.attr->attrname = $1; $$->value.attr->comment = $2; $$->value.attr->values = $4; $$->next = NULL; $$->prev = $$; } | ATTRNAME '=' permitvalues { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.attr = (AttrElement *)malloc(sizeof(AttrElement)); memset($$->value.attr, 0, sizeof(AttrElement)); $$->value.attr->attrname = $1; $$->value.attr->permitted = $3; $$->next = NULL; $$->prev = $$; } | ATTRNAME com '=' permitvalues { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.attr = (AttrElement *)malloc(sizeof(AttrElement)); memset($$->value.attr, 0, sizeof(AttrElement)); $$->value.attr->attrname = $1; $$->value.attr->comment = $2; $$->value.attr->permitted = $4; $$->next = NULL; $$->prev = $$; } | ATTRNAME '=' permitvalues com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.attr = (AttrElement *)malloc(sizeof(AttrElement)); memset($$->value.attr, 0, sizeof(AttrElement)); $$->value.attr->attrname = $1; $$->value.attr->permitted = $3; $$->value.attr->percomment = $4; $$->next = NULL; $$->prev = $$; } | ATTRNAME com '=' permitvalues com { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.attr = (AttrElement *)malloc(sizeof(AttrElement)); memset($$->value.attr, 0, sizeof(AttrElement)); $$->value.attr->attrname = $1; $$->value.attr->comment = $2; $$->value.attr->permitted = $4; $$->value.attr->percomment = $5; $$->next = NULL; $$->prev = $$; } | ATTRNAME '=' sequence { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.attr = (AttrElement *)malloc(sizeof(AttrElement)); memset($$->value.attr, 0, sizeof(AttrElement)); $$->value.attr->attrname = $1; $$->attributum = $3; fillsqItems($$->attributum); fillparent($$->attributum, $$); $$->next = NULL; $$->prev = $$; } | ATTRNAME com '=' sequence { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.attr = (AttrElement *)malloc(sizeof(AttrElement)); memset($$->value.attr, 0, sizeof(AttrElement)); $$->value.attr->attrname = $1; $$->value.attr->comment = $2; $$->attributum = $4; fillsqItems($$->attributum); fillparent($$->attributum, $$); $$->next = NULL; $$->prev = $$; } ; permitvalues: '[' permitvals ']' { $$ = $2; } ; permitvals: permitvals '|' permit { $$ = $1; $$->prev->next = $3; $3->prev = $$->prev; $$->prev = $3; } | permit ; permit: PERMITTED { $$ = (PerAttrValElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->pervalue = $1; $$->next = NULL; $$->prev = $$; } ; values: values valuetag { $$ = $1; $$->prev->next = $2; $2->prev = $$->prev; $$->prev = $2; } | valuetag ; valuetag: '\"' ATTRVALUE '\"' { $$ = (AttrValElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value = $2; $$->type = VT_VALUE; $$->next = NULL; $$->prev = $$; } | '\"' ATTRVALUE '\"' com { $$ = (AttrValElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value = $2; $$->comment = $4; $$->type = VT_VALUE; $$->next = NULL; $$->prev = $$; } | CID CIDVALUE { $$ = (AttrValElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value = $2; $$->type = VT_CID; $$->next = NULL; $$->prev = $$; } | CID CIDVALUE com { $$ = (AttrValElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value = $2; $$->comment = $3; $$->type = VT_CID; $$->next = NULL; $$->prev = $$; } | CID com { $$ = (AttrValElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->comment = $2; $$->type = VT_CID; $$->next = NULL; $$->prev = $$; } ; sequence: SQBEG sqitems SQEND { $$ = $2; } ; sqitems: sqitems SQSEP sqitem { $$ = $1; $$->prev->next = $3; $3->prev = $$->prev; $$->prev = $3; } | sqitem ; sqitem: attrs { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.item = (ItemElement *)malloc(sizeof(ItemElement)); memset($$->value.item, 0, sizeof(ItemElement)); $$->attributum = $1; fillparent($$->attributum, $$); $$->next = NULL; $$->prev = $$; } | /* empty */ { $$ = (ReportElement *)malloc(sizeof(*$$)); memset($$, 0, sizeof(*$$)); $$->value.item = (ItemElement *)malloc(sizeof(ItemElement)); memset($$->value.item, 0, sizeof(ItemElement)); $$->attributum = NULL; $$->next = NULL; $$->prev = $$; } ; com: '<' COMMENT '>' { $$ = $2; } ; %%