Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/ntuple/qp_parser_y.y is written in an unsupported language. File is not indexed.

0001 /*
0002  *  parser.y  -  yacc parser for selfun
0003  *
0004  *  Original: 15-Jun-1994 15:20
0005  *
0006  *  Author:   Maarten Ballintijn <Maarten.Ballintijn@cern.ch>
0007  *
0008  *  $Id$
0009  *
0010  *  $Log$
0011  *  Revision 1.10  1996/05/14 12:23:29  maartenb
0012  *  - Fix prototypes.
0013  *
0014  *  - Fix static bool conversions
0015  *
0016  *  Revision 1.9  1996/04/23 18:38:51  maartenb
0017  *  - Add RCS keywords
0018  *
0019  *
0020  */
0021 
0022 %{
0023 
0024 #include        <string.h>
0025 
0026 #include        "qp_lexyacc.h"
0027 #include        "mstr.h"
0028 #include        "qp_tree.h"
0029 #include        "qp_report.h"
0030 #include        "str.h"
0031 
0032 pTree   qp_the_parse_tree;      /* return the parse tree */
0033 
0034 %}
0035 
0036 %union {
0037 /* Derived from $Id$ */
0038         int     num;
0039         double  real;
0040         char    * str;
0041         pTree   expr;
0042         pTree   expr_list;
0043 #define yylval  qp_parser_lval
0044 }
0045 
0046 %token          T_UNKNOWN
0047 %token  <num>   T_CUT
0048 %token  <str>   T_IDENT
0049 %token  <num>   T_BOOL
0050 %token  <num>   T_UNSIGNED
0051 %token  <num>   T_INT
0052 %token  <real>  T_FLOAT
0053 %token  <real>  T_DOUBLE
0054 %token  <str>   T_STRING
0055 %token          T_PUT_MASK
0056 %token          T_IN
0057 
0058 %left           T_OR
0059 %left           T_AND
0060 %right          T_NOT
0061 %nonassoc <num> T_EQ T_NE T_CT T_LT T_LE T_GT T_GE
0062 %left           '+' '-'
0063 %left           '*' '/'
0064 %left           UMINUS
0065 %right          T_POWER
0066 
0067 %type   <num>   lte_op gte_op
0068 
0069 %type   <expr>  bool_expr bool_term bool_fact
0070 %type   <expr>  comparison
0071 %type   <expr>  expression function_array argument
0072 %type   <expr>  range
0073 
0074 %type   <expr_list>     arg_list one_or_more_args
0075 
0076 %type   <str>   name simple_file
0077 /*
0078 %type   <str>   unix_file unix_path
0079 %type   <str>   vms_file vms_dir vms_path vmcms_file vms_disk
0080 */
0081 
0082 %%
0083 
0084 line            :
0085                         bool_expr
0086                         {
0087                                 qp_the_parse_tree =  $1;
0088                         }
0089                 |
0090                         bool_expr T_PUT_MASK T_IDENT "(" expression ")"
0091                         {
0092                                 qp_the_parse_tree = new_mask_node( $1, $3, $5 );
0093                         }
0094                 ;
0095 
0096 
0097 bool_expr:
0098                         bool_term
0099                 |       bool_expr T_OR bool_term
0100                         { $$ = new_op_node( O_OR, $1, $3, 0 ); }
0101                 ;
0102 
0103 bool_term:
0104                         bool_fact
0105                 |       bool_term T_AND bool_fact
0106                         { $$ = new_op_node( O_AND, $1, $3, 0 ); }
0107                 ;
0108 
0109 bool_fact:
0110                         comparison
0111                 |       T_NOT bool_fact
0112                         { $$ = new_op_node( O_NOT, $2, 0, 0 ); }
0113                 ;
0114 
0115 lte_op          :
0116                         T_LT
0117                         { $$ = O_LT; }
0118                 |       T_LE
0119                         { $$ = O_LE; }
0120                 ;
0121                         
0122 gte_op          :
0123                         T_GT
0124                         { $$ = O_GT; }
0125                 |       T_GE
0126                         { $$ = O_GE; }
0127                 ;
0128                         
0129 comparison      :
0130                         expression
0131                 |       expression lte_op expression
0132                         { $$ = new_op_node( $2 , $1, $3, 0 ); }
0133                 |       expression lte_op expression lte_op expression
0134                         {
0135                                 pTree   c1, c2;
0136                                 OpType  op;
0137 
0138                                 if ( $2 == O_LT ) {
0139                                         if ( $4 == O_LT )       op = O_LTLT;
0140                                         else                    op = O_LTLE;
0141                                 } else {
0142                                         if ( $4 == O_LT )       op = O_LELT;
0143                                         else                    op = O_LELE;
0144                                 }
0145 
0146 
0147                                 $$ = new_op_node( op, $1, $3, $5 );
0148                         }
0149                 |       expression gte_op expression
0150                         { $$ = new_op_node( $2, $1, $3, 0 ); }
0151                 |       expression gte_op expression gte_op expression
0152                         {
0153                                 pTree   c1, c2;
0154                                 OpType  op;
0155 
0156                                 if ( $2 == O_GT ) {
0157                                         if ( $4 == O_GT )       op = O_GTGT;
0158                                         else                    op = O_GTGE;
0159                                 } else {
0160                                         if ( $4 == O_GT )       op = O_GEGT;
0161                                         else                    op = O_GEGE;
0162                                 }
0163 
0164 
0165                                 $$ = new_op_node( op, $1, $3, $5 );
0166                         }
0167                 |       expression T_EQ expression
0168                         { $$ = new_op_node( O_EQ, $1, $3, 0 ); }
0169                 |       expression T_NE expression
0170                         { $$ = new_op_node( O_NE, $1, $3, 0 ); }
0171                 |       expression T_CT expression
0172                         { $$ = new_op_node( O_CT, $1, $3, 0 ); }
0173                 ;
0174 
0175 expression      :
0176                         T_BOOL
0177                         { $$ = new_con_bool_node( $1 ); }
0178                 |       T_UNSIGNED
0179                         { $$ = new_con_uint_node( $1 ); }
0180                 |       T_INT
0181                         { $$ = new_con_int_node( $1 ); }
0182                 |       T_FLOAT
0183                         { $$ = new_con_float_node( $1 ); }
0184                 |       T_DOUBLE
0185                         { $$ = new_con_double_node( $1 ); }
0186                 |       T_STRING
0187                         {
0188                                 $$ = new_con_str_node( $1 );
0189                                 mstr_del( $1 );
0190                         }
0191                 |       T_CUT
0192                         { $$ = new_cut_node( $1 ); }
0193                 |       function_array
0194 
0195                 |       expression '+' expression
0196                         { $$ = new_op_node( O_PLUS, $1, $3, 0 ); }
0197                 |       expression '-' expression
0198                         { $$ = new_op_node( O_MINUS, $1, $3, 0 ); }
0199                 |       expression '*' expression
0200                         { $$ = new_op_node( O_TIMES, $1, $3, 0 ); }
0201                 |       expression '/' expression
0202                         { $$ = new_op_node( O_DIV, $1, $3, 0 ); }
0203                 |       '-' expression %prec UMINUS
0204                         { $$ = new_op_node( O_UMINUS, $2, 0, 0 ); }
0205                 |       '+' expression %prec UMINUS
0206                         { $$ = $2; }
0207                 |       expression T_POWER expression
0208                         { $$ = new_op_node( O_POW, $1, $3, 0 ); }
0209                 |       '(' bool_expr ')'
0210                         { $$ = $2; }
0211                 ;
0212 
0213 function_array  :
0214                         name    /* I am not so happy about this */
0215                         { 
0216                                 mstr_release( $1 );
0217                                 $$ = new_name_node( $1, 0, 0 );
0218                         }
0219                 |       name "(" arg_list ")"
0220                         {
0221                                 mstr_release( $1 );
0222                                 $$ = new_name_node( $1, $3, 0 );
0223                         }
0224                 |       name "(" arg_list ")" "(" argument ")"
0225                         {
0226                                 mstr_release( $1 );
0227                                 $$ = new_name_node( $1, $3, $6 );
0228                         }
0229                 ;
0230 
0231 arg_list
0232                 :       /* empty */
0233                         { $$ = 0; }
0234                 |       one_or_more_args
0235                 ;
0236 
0237 one_or_more_args
0238                 :       argument
0239                         { $1->next = 0; $$ = $1; }
0240                 |       one_or_more_args "," argument
0241                         { $3->next = $1; $$ = $3; }
0242                 ;
0243 
0244 argument
0245                 :       range
0246                 |       bool_expr
0247                 ;
0248                         
0249 
0250 name
0251                 :       T_IDENT
0252                 |       simple_file
0253 /*
0254                 |       unix_file
0255                 |       vms_file
0256                 |       vmcms_file
0257 */
0258                 ;
0259 
0260 simple_file
0261                 :       T_IDENT "." T_IDENT
0262                         { $$ = mstr_merge( $1, mstr_new("."), $3, (char*) 0 ); }
0263                 ;
0264 
0265 /*
0266 unix_file
0267                 :       unix_path "/" simple_file
0268                         { $$ = mstr_merge( $1, mstr_new("/"), $3, (char*) 0 ); }
0269                 |       "~" unix_path "/" simple_file
0270                         { $$ = mstr_merge( mstr_new("~"), $2, mstr_new("/"), $4,
0271                                         (char*) 0 ); }
0272                 |       "~" T_IDENT unix_path "/" simple_file
0273                         { $$ = mstr_merge( mstr_new("~"), $2, $3, mstr_new("/"),
0274                                         $5, (char*) 0 ); }
0275                 ;
0276 
0277 unix_path
0278                 :       /* empty */ /*
0279                         { $$ = mstr_new(""); }
0280                 |       unix_path "/"
0281                         { $$ = mstr_merge($1, mstr_new("/"), (char*) 0 ); }
0282                 |       unix_path "/" T_IDENT 
0283                         { $$ = mstr_merge( $1, mstr_new("/"), $3, (char*) 0 ); }
0284                 ;
0285 */
0286 
0287 /*
0288 vms_file
0289                 :       vms_dir simple_file
0290                         { $$ = mstr_merge( $1, $2, (char*) 0 ); }
0291 
0292 vms_dir
0293                 :       vms_disk "[" vms_path "]"
0294                         { $$ = mstr_merge( $1, mstr_new(":["), $3, mstr_new("]"),
0295                                         (char*) 0 ); }
0296                 |       "[" vms_path "]"
0297                         { $$ = mstr_merge( mstr_new("["), $2, mstr_new("]"),
0298                                         (char*) 0 ); }
0299                 ;
0300 
0301 vms_disk
0302                 :       T_IDENT ":"
0303                         { $$ = $1; }
0304                 ;
0305 
0306 vms_path
0307                 :       T_IDENT
0308                         { $$ = $1; }
0309                 |       "." T_IDENT
0310                         { $$ = mstr_merge( mstr_new("."), $2, (char*) 0 );}
0311                 |       vms_path "." T_IDENT
0312                         { $$ = mstr_merge($1, mstr_new("."), $3, (char*) 0);}
0313                 ;
0314 */
0315 
0316 /*
0317 vmcms_file
0318                 :       simple_file "." T_IDENT
0319                         { $$ = mstr_merge( $1, mstr_new("."), $3, (char*) 0);}
0320                 ;
0321 */
0322 
0323 range
0324                 :       expression ":" expression
0325                         { $$ = new_range_node( $1, $3 ); }
0326                 |       expression ":"
0327                         { $$ = new_range_node( $1, (pTree) 0 ); }
0328                 |       ":" expression
0329                         { $$ = new_range_node( (pTree) 0, $2 ); }
0330                 |       ":"
0331                         { $$ = new_range_node( (pTree) 0, (pTree) 0 ); }
0332 /*
0333                 |       vms_disk
0334                         {
0335                                 mstr_release( $1 );
0336                                 $$ = new_range_node(
0337                                         new_name_node( $1, (pTree) 0, (pTree) 0 ), (pTree) 0 );
0338                         }
0339                 |       vms_disk expression
0340                         {
0341                                 mstr_release( $1 );
0342                                 $$ = new_range_node(
0343                                         new_name_node( $1, (pTree) 0, (pTree) 0 ), $2 );
0344                         }
0345 */
0346                 ;
0347 %%
0348 
0349 int
0350 qp_scanner_wrap( void )
0351 {
0352         return 1;
0353 }
0354 
0355 void
0356 qp_parser_error( char *message )
0357 {
0358         char    *s;
0359         int     index;
0360 
0361         sf_report( " %s\n", message );
0362         qp_scanner_get_pos( &s, &index );
0363         if ( index != -1) {
0364                 sf_report( " %s\n", s );
0365                 s = str_new( s );
0366                 memset( s, ' ', strlen( s ) );
0367                 s[index>0 ? index-1 : 0] = '^';
0368                 sf_report( " %s\n", s );
0369                 str_del( s );
0370         }
0371 }