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 }