%{ #define YYMAXDEPTH 1000 #include #include extern int lineno; char *concat(); /* Added to list of terminals and nonterminals Added calls to concat and nfree to capture text Removed simple_text_plus; pcdata now refers to runs of characters without imbedded markup. Added opt_security to cltags Added DOCUMENT and endDOCUMENT to document rule Redid letters, digits etc. to solve stack overflow Removed calls to concat, since we don't need to save all the text */ %} %union { struct { char *val; } aval; } %token SUB endSUB R endR TYPE endTYPE TEST LIVE EMPTY DELAMEND CIK endCIK CCC endCCC STREET1 endSTREET1 STREET2 endSTREET2 CITY endCITY TAX_ID endTAX_ID STATE endSTATE ZIP endZIP FORM endFORM REGISTRANT endREGISTRANT FILENO endFILENO ACT endACT NEW_NAME endNEW_NAME NEW_BUS_ADDR endNEW_BUS_ADDR NEW_MAIL_ADDR endNEW_MAIL_ADDR NEW_PHONE endNEW_PHONE NEW_FYEND endNEW_FYEND NEW_STATE endNEW_STATE UNITS endUNITS UPRICE endUPRICE FEE_PAYMENT endFEE_PAYMENT PAYOR endPAYOR CONTACT_NAME endCONTACT_NAME CONTACT_PHONE endCONTACT_PHONE MODULE_NAME endMODULE_NAME PERIOD endPERIOD DESCRIP endDESCRIP INCLUDE endINCLUDE TABLE endTABLE DOCUMENT endDOCUMENT PRINT CCOPY null_endtag %token /* LETTERS DIGITS OTHERS WHITESPACE */ NEWLINE PRINTABLES %type simple_text hilites redline doc_text doc_text_plus pcdata table whitespace opt_w %start submission %% opt_w : whitespace { /* check here to make sure it is only whitespace */ int k; for (k = 0; k < strlen($1.val); k++) if ($1.val[k] != ' ' && $1.val[k] != '\n' && $1.val[k] != '\t') fprintf(stderr, "On line %6d, character %c found where whitespace expected.\n", lineno, $1.val[k]); $$.val = $1.val; } | /* empty */ { $$.val = ""; } ; whitespace : pcdata { $$.val = $1.val; } ; subm_attr : type opt_w test_or_live opt_w opt_print opt_w opt_ccopy opt_w opt_delamend ; type : TYPE pcdata end_type ; end_type : endTYPE | shortend ; test_or_live : test | live ; test : TEST /* no end tag */ ; live : LIVE /* no end tag */ ; opt_print : /* empty */ | PRINT ; opt_ccopy : /* empty */ | CCOPY ; opt_delamend : /* empty */ | DELAMEND ; submission : SUB opt_w subm_attr opt_w registrant_plus opt_w { /* C code can go here */ } optags opt_w cltags opt_w document_plus opt_w end_sub opt_w ; end_sub : endSUB | shortend ; cik : CIK pcdata { /* check the cik here */ } end_cik ; end_cik : endCIK | shortend ; ccc : CCC pcdata end_ccc ; end_ccc : endCCC | shortend ; address : street1 opt_w opt_street2 opt_w city opt_w state opt_w zip ; street1 : STREET1 pcdata end_street1 ; end_street1 : endSTREET1 | shortend ; opt_street2 : /* empty */ | street2 ; street2 : STREET2 pcdata end_street2 ; end_street2 : endSTREET2 | shortend ; city : CITY pcdata end_city ; end_city : endCITY | shortend ; state : STATE pcdata end_state ; end_state : endSTATE | shortend ; zip : ZIP pcdata end_zip ; end_zip : endZIP | shortend ; cik_ccc : opt_w cik opt_w ccc ; registrant_plus : registrant | registrant opt_w registrant_plus ; registrant : REGISTRANT opt_w cik_ccc opt_w opt_form opt_w opt_fileno opt_w opt_act opt_w opt_new_name opt_w opt_new_bus_addr opt_w opt_new_mail_addr opt_w opt_new_phone opt_w opt_new_fyend opt_w opt_new_state opt_w end_registrant ; end_registrant : endREGISTRANT | shortend ; opt_form : /* empty */ | form ; form : FORM doc_text_plus end_form ; end_form : endFORM | shortend ; opt_fileno : /* empty */ | fileno ; fileno : FILENO pcdata end_fileno ; end_fileno : endFILENO | shortend ; opt_act : /* empty */ | act ; act : ACT pcdata end_act ; end_act : endACT | shortend ; opt_new_name : /* empty */ | new_name ; new_name : NEW_NAME pcdata end_new_name ; end_new_name : endNEW_NAME | shortend ; opt_new_bus_addr: /* empty */ | new_bus_addr ; new_bus_addr : NEW_BUS_ADDR pcdata end_new_bus_addr ; end_new_bus_addr: endNEW_BUS_ADDR | shortend ; opt_new_mail_addr: /* empty */ | new_mail_addr ; new_mail_addr : NEW_MAIL_ADDR pcdata end_new_mail_addr ; end_new_mail_addr: endNEW_MAIL_ADDR | shortend ; opt_new_phone : /* empty */ | new_phone ; new_phone : NEW_PHONE pcdata end_new_phone ; end_new_phone : endNEW_PHONE | shortend ; opt_new_fyend : /* empty */ | new_fyend ; new_fyend : NEW_FYEND pcdata end_new_fyend ; end_new_fyend : endNEW_FYEND | shortend ; opt_new_state : /* empty */ | new_state ; new_state : NEW_STATE pcdata end_new_state ; end_new_state : endNEW_STATE | shortend ; opt_security : security | /* empty */ ; security : type opt_w units opt_w uprice ; /* type defined above */ units : UNITS pcdata end_units ; end_units : endUNITS | shortend ; uprice : UPRICE pcdata end_uprice ; end_uprice : endUPRICE | shortend ; fees : fee_payment opt_w opt_payor ; fee_payment : FEE_PAYMENT pcdata end_fee_payment ; end_fee_payment : endFEE_PAYMENT | shortend ; opt_payor : /* empty */ | payor ; payor : PAYOR cik_ccc end_payor ; end_payor : endPAYOR | shortend ; contact : contact_name opt_w opt_contact_phone ; contact_name : CONTACT_NAME pcdata end_contact_name ; end_contact_name: endCONTACT_NAME | shortend ; opt_contact_phone: /* empty */ | contact_phone ; contact_phone : CONTACT_PHONE pcdata end_contact_phone ; end_contact_phone: endCONTACT_PHONE | shortend ; module_id : module_name opt_w cik ; module_name : MODULE_NAME pcdata end_module_name ; end_module_name : endMODULE_NAME | shortend ; optags : contact /* contact is not optional */ /* opt_notify opt_nasaa opt_sros */ ; cltags : opt_period opt_w opt_security opt_fees ; opt_period : /* empty */ | period ; period : PERIOD pcdata end_period ; end_period : endPERIOD | shortend ; opt_fees : /* empty */ | fees ; hilites : redline | table ; table : TABLE pcdata end_table { $$.val = $2.val; } ; end_table : null_endtag | endTABLE ; shortend : null_endtag | /* empty */ ; doc_text_plus : doc_text { $$.val = $1.val; } | doc_text_plus doc_text { $$.val = $2.val; } ; doc_text : hilites { $$.val = $1.val; } | include { $$.val = ">>> included file <<<"; } | pcdata { $$.val = $1.val; } ; include : INCLUDE module_id endINCLUDE ; redline : R pcdata endR { $$.val = $2.val; } ; pcdata : simple_text { /* fprintf(stdout,"Saw simple_text: %s\n",$1.val); */ $$.val = $1.val; } | pcdata simple_text { /* fprintf(stdout,"Saw simple_text: %s\n",$2.val); */ $$.val = $2.val; } ; simple_text : PRINTABLES { $$.val = $1.val; } | NEWLINE { $$.val = "\n"; } ; document_plus : document document_plus | document ; document : DOCUMENT opt_w type opt_w opt_descrip doc_text_plus end_document opt_w ; end_document : endDOCUMENT | shortend ; opt_descrip : /* empty */ | descrip ; descrip : DESCRIP pcdata end_descrip ; end_descrip : endDESCRIP ; %%