1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
|
/* codatay.y - CODATA sequence parser */
%{
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#ifdef STDC_HEADERS
# include <stdlib.h>
#endif
#include "sequence.h"
#include "sequence/parse.h"
#include "sequence/codatay.h"
void codataset_in(FILE *);
int codatalex(YYSTYPE *);
int codatalex_destroy(void);
static void yyerror(sequence_t *, const char *);
sequence_t *codatay_parse(FILE *);
int codatay_check(FILE *);
%}
%pure-parser
%parse-param { sequence_t *seq }
%union { char *str; }
%destructor { free($$); } <str>
%token CNT EOL ERR INT NUL NXT SEP SPC TXT
%token EN ENTXT
%token <str> ENNAM
%token TI
%token <str> TITXT
%token AL
%token CT
%token OR
%token DA
%token AC
%token <str> ACNUM
%token RE
%token CO
%token GE
%token FU
%token CX
%token CL
%token KE
%token FE
%token SU
%token SE
%token SN
%token SEQ
%token <str> BAS
%token END
%%
codata : annots sequence end { return 0; /*NOTREACHED*/ }
| NUL { return -1; /*NOTREACHED*/ }
;
annots : entry title altnam contain organi date access refs comms genetic
complex function classif kwords feats ;
entry : enline ;
enline : EN ennam entxt EOL ;
ennam : ENNAM { parse_namadd(seq, $1); }
;
entxt : entxt ENTXT | ;
title : tiline1 tilines | ;
tilines : tilines tiline2 | ;
tiline1 : TI titxt EOL ;
tiline2 : NXT titxt EOL ;
titxt : titxt TITXT { parse_dscadd2(seq, $2); }
| TITXT { parse_dscadd1(seq, $1); }
;
altnam : alline1 allines | ;
allines : allines alline2 | ;
alline1 : AL altxt EOL ;
alline2 : NXT altxt EOL ;
altxt : altxt TXT | TXT ;
contain : ctline1 ctlines | ;
ctlines : ctlines ctline2 | ;
ctline1 : CT cttxt EOL ;
ctline2 : NXT cttxt EOL ;
cttxt : cttxt TXT | TXT ;
organi : orline1 orlines | ;
orlines : orlines orline2 | ;
orline1 : OR ortxt EOL ;
orline2 : NXT ortxt EOL ;
ortxt : ortxt TXT | TXT ;
date : daline1 dalines | ;
dalines : dalines daline2 | daline2 ;
daline1 : DA datxt EOL ;
daline2 : NXT datxt EOL ;
datxt : datxt TXT | TXT ;
access : acline1 aclines acline3 | acline | ;
aclines : aclines acline2 | ;
acline : AC aclist EOL ;
acline1 : AC aclist CNT EOL ;
acline2 : NXT aclist CNT EOL ;
acline3 : NXT aclist EOL ;
aclist : aclist SEP ACNUM { parse_accadd(seq, $3); }
| ACNUM { parse_accadd(seq, $1); }
;
refs : refs refent | ;
refent : reline1 relines ;
relines : relines reline2 | reline2 ;
reline1 : RE retxt EOL ;
reline2 : NXT retxt EOL ;
retxt : retxt TXT | TXT ;
comms : comms coment | ;
coment : coline1 colines ;
colines : colines coline2 | ;
coline1 : CO cotxt EOL ;
coline2 : NXT cotxt EOL ;
cotxt : cotxt TXT | TXT ;
genetic : genetic genent | ;
genent : geline1 gelines ;
gelines : gelines geline2 | geline2 ;
geline1 : GE getxt EOL | GE EOL ;
geline2 : NXT getxt EOL ;
getxt : getxt TXT | TXT ;
complex : complex cmpent | ;
cmpent : cxline1 cxlines ;
cxlines : cxlines cxline2 | ;
cxline1 : CX cxtxt EOL ;
cxline2 : NXT cxtxt EOL ;
cxtxt : cxtxt TXT | TXT ;
function : function funent | ;
funent : fuline1 fulines ;
fulines : fulines fuline2 | ;
fuline1 : FU futxt EOL | FU EOL ;
fuline2 : NXT futxt EOL ;
futxt : futxt TXT | TXT ;
classif : clline1 cllines | ;
cllines : cllines clline2 | ;
clline1 : CL cltxt EOL ;
clline2 : NXT cltxt EOL ;
cltxt : cltxt TXT | TXT ;
kwords : keline1 kelines | ;
kelines : kelines keline2 | ;
keline1 : KE ketxt EOL ;
keline2 : NXT ketxt EOL ;
ketxt : ketxt TXT | TXT ;
feats : feline1 felines | ;
felines : felines feline2 | feline2 ;
feline1 : FE EOL ;
feline2 : NXT fetxt EOL ;
fetxt : fetxt TXT | TXT ;
sequence : seqhead seqdata ;
seqhead : suline seline snline ;
suline : SU sutxt EOL | ;
sutxt : sutxt TXT | TXT ;
seline : SE EOL ;
snline : SN snlist EOL ;
snlist : snlist SPC INT | INT ;
seqdata : seqdata seqline | seqline ;
seqline : SEQ INT seqlist seqsep EOL ;
seqlist : seqlist SEP BAS { parse_stradd(seq, $3); }
| SEP BAS { parse_stradd(seq, $2); }
;
seqsep : SEP | ;
end : END EOL ;
%%
/* Checks CODATA sequence */
int codatay_check(FILE *f) {
int i;
codataset_in(f);
i = yyparse(NULL);
if (i == 0) { return i; }
codatalex_destroy();
return i; }
/* Parse CODATA sequence */
sequence_t *codatay_parse(FILE *f) {
int i;
sequence_t *seq;
seq = sequence_new();
if (seq == NULL) { return seq; }
codataset_in(f);
i = yyparse((void *)seq);
if (i == 0) { return seq; }
codatalex_destroy();
sequence_free(seq);
return NULL; }
/* Helpers ... */
/*ARGSUSED*/
static void yyerror(sequence_t *seq, const char *s) { return; }
|