mirror of https://github.com/ecmwf/eccodes.git
902 lines
37 KiB
Plaintext
902 lines
37 KiB
Plaintext
/*
|
|
* (C) Copyright 2005- ECMWF.
|
|
*
|
|
* This software is licensed under the terms of the Apache Licence Version 2.0
|
|
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
|
|
*
|
|
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
|
|
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
|
|
*/
|
|
|
|
|
|
%{
|
|
|
|
#include "grib_api_internal.h"
|
|
/* #include "grib_parser.h" */
|
|
|
|
extern int yylex(void);
|
|
extern int yyerror(const char*);
|
|
extern int yylineno;
|
|
extern char* file_being_parsed(void);
|
|
|
|
extern grib_action* grib_parser_all_actions;
|
|
extern grib_concept_value* grib_parser_concept;
|
|
extern grib_hash_array_value* grib_parser_hash_array;
|
|
extern grib_context* grib_parser_context;
|
|
extern grib_rule* grib_parser_rules;
|
|
|
|
static grib_concept_value* reverse_concept(grib_concept_value* r);
|
|
static grib_concept_value *_reverse_concept(grib_concept_value *r,grib_concept_value *s);
|
|
static grib_hash_array_value* reverse_hash_array(grib_hash_array_value* r);
|
|
static grib_hash_array_value *_reverse_hash_array(grib_hash_array_value *r,grib_hash_array_value *s);
|
|
|
|
/* typedef int (*testp_proc)(long,long); */
|
|
/* typedef long (*grib_op_proc)(long,long); */
|
|
|
|
|
|
%}
|
|
|
|
%union {
|
|
char *str;
|
|
long lval;
|
|
double dval;
|
|
grib_darray *dvalue;
|
|
grib_sarray *svalue;
|
|
grib_iarray *ivalue;
|
|
grib_action *act;
|
|
grib_arguments *explist;
|
|
grib_expression *exp;
|
|
grib_concept_condition *concept_condition;
|
|
grib_concept_value *concept_value;
|
|
grib_hash_array_value *hash_array_value;
|
|
grib_case *case_value;
|
|
grib_rule *rules;
|
|
grib_rule_entry *rule_entry;
|
|
};
|
|
|
|
%start all
|
|
|
|
%token LOWERCASE
|
|
%token IF
|
|
%token IF_TRANSIENT
|
|
%token ELSE
|
|
%token END
|
|
%token CLOSE
|
|
%token UNSIGNED
|
|
%token TEMPLATE
|
|
%token TEMPLATE_NOFAIL
|
|
%token TRIGGER
|
|
%token ASCII
|
|
%token GROUP
|
|
%token NON_ALPHA
|
|
%token KSEC1EXPVER
|
|
%token LABEL
|
|
%token LIST
|
|
%token IS_IN_LIST
|
|
%token IS_IN_DICT
|
|
%token IS_INTEGER
|
|
%token TO_INTEGER
|
|
%token TO_STRING
|
|
%token SEX2DEC
|
|
%token WHILE
|
|
%token IBMFLOAT
|
|
%token SIGNED
|
|
|
|
%token UINT8
|
|
%token INT8
|
|
|
|
%token UINT16
|
|
%token INT16
|
|
%token UINT16_LITTLE_ENDIAN
|
|
%token INT16_LITTLE_ENDIAN
|
|
|
|
%token UINT32
|
|
%token INT32
|
|
%token UINT32_LITTLE_ENDIAN
|
|
%token INT32_LITTLE_ENDIAN
|
|
|
|
%token UINT64
|
|
%token INT64
|
|
%token UINT64_LITTLE_ENDIAN
|
|
%token INT64_LITTLE_ENDIAN
|
|
|
|
%token BLOB
|
|
|
|
%token BYTE
|
|
%token CODETABLE
|
|
%token SMART_TABLE
|
|
%token DICTIONARY
|
|
%token COMPLEX_CODETABLE
|
|
%token LOOKUP
|
|
%token ALIAS
|
|
%token UNALIAS
|
|
%token META
|
|
%token POS
|
|
%token INTCONST
|
|
%token TRANS
|
|
%token FLAGBIT
|
|
%token CONCEPT
|
|
%token GETENV
|
|
%token HASH_ARRAY
|
|
%token CONCEPT_NOFAIL
|
|
%token NIL
|
|
%token DUMMY
|
|
|
|
%token MODIFY
|
|
|
|
%token READ_ONLY
|
|
%token STRING_TYPE
|
|
%token LONG_TYPE
|
|
%token DOUBLE_TYPE
|
|
%token NO_COPY
|
|
%token DUMP
|
|
%token JSON
|
|
%token XML
|
|
%token NO_FAIL
|
|
%token EDITION_SPECIFIC
|
|
%token OVERRIDE
|
|
%token HIDDEN
|
|
%token CAN_BE_MISSING
|
|
%token MISSING
|
|
%token CONSTRAINT
|
|
%token COPY_OK
|
|
|
|
%token WHEN
|
|
%token SET
|
|
%token SET_NOFAIL
|
|
%token WRITE
|
|
%token APPEND
|
|
%token PRINT
|
|
|
|
%token EXPORT
|
|
%token REMOVE
|
|
%token RENAME
|
|
%token SKIP
|
|
|
|
%token PAD
|
|
%token SECTION_PADDING
|
|
%token MESSAGE
|
|
%token MESSAGE_COPY
|
|
%token PADTO
|
|
%token PADTOEVEN
|
|
%token PADTOMULTIPLE
|
|
%token G1_HALF_BYTE
|
|
%token G1_MESSAGE_LENGTH
|
|
%token G1_SECTION4_LENGTH
|
|
%token SECTION_LENGTH
|
|
%token LENGTH
|
|
%token FLAG
|
|
%token ITERATOR
|
|
%token NEAREST
|
|
%token BOX
|
|
%token KSEC
|
|
%token ASSERT
|
|
%token SUBSTR
|
|
|
|
%token CASE
|
|
%token SWITCH
|
|
%token DEFAULT
|
|
|
|
%token EQ
|
|
%token NE
|
|
%token GE
|
|
%token LE
|
|
%token LT
|
|
%token GT
|
|
%token BIT
|
|
%token BITOFF
|
|
|
|
%token AND
|
|
%token OR
|
|
%token NOT
|
|
|
|
%token IS
|
|
|
|
%token <str>IDENT
|
|
%token <str>STRING
|
|
|
|
%token <lval>INTEGER
|
|
%token <dval>FLOAT
|
|
|
|
%type <dvalue> dvalues
|
|
%type <svalue> svalues
|
|
%type <ivalue> integer_array
|
|
|
|
%type <act> instructions
|
|
%type <act> instruction
|
|
%type <act> simple
|
|
%type <act> if_block
|
|
%type <act> switch_block
|
|
%type <act> list_block
|
|
%type <act> while_block
|
|
%type <act> when_block
|
|
%type <act> trigger_block
|
|
%type <act> concept_block
|
|
%type <act> hash_array_block
|
|
%type <act> set
|
|
%type <act> set_list
|
|
|
|
%type <explist> argument
|
|
%type <explist> arguments
|
|
%type <explist> argument_list
|
|
%type <explist> default
|
|
|
|
|
|
%type <exp> expression
|
|
%type <exp> atom
|
|
%type <exp> condition
|
|
%type <exp> factor
|
|
%type <exp> term
|
|
%type <exp> power
|
|
%type <exp> conjunction
|
|
%type <exp> disjunction
|
|
%type <exp> string_or_ident
|
|
|
|
%type <lval> flag
|
|
%type <lval> flags
|
|
%type <lval> flag_list
|
|
|
|
%type <concept_condition> concept_condition
|
|
%type <concept_condition> concept_conditions
|
|
|
|
%type <concept_value> concept_value
|
|
%type <concept_value> concept_list
|
|
|
|
%type <hash_array_value> hash_array_value
|
|
%type <hash_array_value> hash_array_list
|
|
|
|
%type <case_value> case_value
|
|
%type <case_value> case_list
|
|
|
|
%type <rule_entry> rule_entry
|
|
%type <rule_entry> rule_entries
|
|
|
|
%type <rules> rules
|
|
%type <rules> rule
|
|
%type <rules> fact;
|
|
%type <rules> conditional_rule;
|
|
|
|
|
|
%%
|
|
|
|
all: empty { grib_parser_all_actions = 0;grib_parser_concept=0;
|
|
grib_parser_hash_array=0;grib_parser_rules=0; }
|
|
| concept_list { grib_parser_concept = reverse_concept($1); }
|
|
| hash_array_list { grib_parser_hash_array = reverse_hash_array($1); }
|
|
| instructions { grib_parser_all_actions = $1; }
|
|
| rules { grib_parser_rules = $1; }
|
|
/* memory leak here */
|
|
| error { grib_parser_all_actions = 0; grib_parser_concept=0;
|
|
grib_parser_hash_array=0; grib_parser_rules=0; }
|
|
;
|
|
|
|
empty:;
|
|
|
|
|
|
dvalues: FLOAT { $$=grib_darray_push(grib_parser_context,0,$1);}
|
|
| dvalues ',' FLOAT { $$=grib_darray_push(grib_parser_context,$1,$3);}
|
|
| INTEGER { $$=grib_darray_push(grib_parser_context,0,$1);}
|
|
| dvalues ',' INTEGER { $$=grib_darray_push(grib_parser_context,$1,$3);}
|
|
;
|
|
|
|
svalues: STRING { $$=grib_sarray_push(grib_parser_context,0,$1);}
|
|
| svalues ',' STRING { $$=grib_sarray_push(grib_parser_context,$1,$3);}
|
|
;
|
|
|
|
|
|
integer_array: INTEGER { $$=grib_iarray_push(0,$1);}
|
|
| integer_array ',' INTEGER { $$=grib_iarray_push($1,$3);}
|
|
;
|
|
|
|
instructions: instruction
|
|
| instruction instructions { $1->next = $2; $$ = $1; }
|
|
| instruction ';' instructions { $1->next = $3; $$ = $1; }
|
|
| instruction ';' { $$ = $1;}
|
|
;
|
|
|
|
instruction: simple ';'
|
|
| if_block
|
|
| list_block
|
|
| while_block
|
|
| trigger_block
|
|
| concept_block
|
|
| hash_array_block
|
|
| when_block
|
|
| switch_block
|
|
|
|
;
|
|
|
|
semi: ';'
|
|
| semi ';'
|
|
|
|
|
|
argument_list: empty { $$ = 0; }
|
|
| arguments
|
|
;
|
|
|
|
arguments: argument
|
|
| argument ',' arguments { $1->next = $3; $$ = $1; }
|
|
;
|
|
|
|
argument: expression { $$ = grib_arguments_new(grib_parser_context,$1,NULL); }
|
|
;
|
|
|
|
|
|
simple: UNSIGNED '[' INTEGER ']' IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"unsigned",$3,NULL,$6,$7,NULL,NULL); free($5); }
|
|
|
|
| UNSIGNED '[' INTEGER ']' IDENT '[' argument_list ']' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"unsigned",$3,$7,$9,$10,NULL,NULL); free($5); }
|
|
|
|
| UNSIGNED '(' INTEGER ')' IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"unsigned_bits",$3,NULL,$6,$7,NULL,NULL); free($5); }
|
|
|
|
| UNSIGNED '(' INTEGER ')' IDENT '[' argument_list ']' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"unsigned_bits",$3,$7,$9,$10,NULL,NULL); free($5); }
|
|
|
|
| ASCII '[' INTEGER ']' IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"ascii",$3,NULL,$6,$7,NULL,NULL); free($5); }
|
|
|
|
| GROUP IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"group",0,NULL,$3,$4,NULL,NULL); free($2); }
|
|
|
|
| GROUP IDENT '(' argument_list ')' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"group",0,$4,$6,$7,NULL,NULL); free($2); }
|
|
|
|
| IDENT '=' TO_INTEGER '(' argument_list ')' flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$1,"to_integer",0,$5,0,$7,NULL,NULL); free($1); }
|
|
|
|
| IDENT '=' SEX2DEC '(' argument_list ')' flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$1,"sexagesimal2decimal",0,$5,0,$7,NULL,NULL); free($1); }
|
|
|
|
| IDENT '=' TO_STRING '(' argument_list ')' flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$1,"to_string",0,$5,0,$7,NULL,NULL); free($1); }
|
|
|
|
| NON_ALPHA IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"non_alpha",0,NULL,$3,$4,NULL,NULL); free($2); }
|
|
|
|
/* Special case for '7777' */
|
|
| ASCII '[' INTEGER ']' STRING default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"ascii",$3,NULL,$6,$7,NULL,NULL); free($5); }
|
|
|
|
| BYTE '[' INTEGER ']' IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"bytes",$3,NULL,$6,$7,NULL,NULL); free($5); }
|
|
|
|
| BYTE '[' INTEGER ']' IDENT '[' argument_list ']' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"bytes",$3,$7,$9,$10,NULL,NULL); free($5); }
|
|
|
|
| KSEC1EXPVER '[' INTEGER ']' IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"ksec1expver",$3,NULL,$6,$7,NULL,NULL); free($5); }
|
|
|
|
| SIGNED '[' INTEGER ']' IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"signed",$3,NULL,$6,$7,NULL,NULL); free($5); }
|
|
|
|
| SIGNED '[' INTEGER ']' IDENT '[' argument_list ']' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"signed",$3,$7,$9,$10,NULL,NULL); free($5); }
|
|
|
|
| SIGNED '(' INTEGER ')' IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"signed_bits",$3,NULL,$6,$7,NULL,NULL); free($5); }
|
|
|
|
| SIGNED '(' INTEGER ')' IDENT '[' argument_list ']' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"signed_bits",$3,$7,$9,$10,NULL,NULL); free($5); }
|
|
|
|
| CODETABLE '[' INTEGER ']' IDENT argument default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"codetable",$3, $6,$7,$8,NULL,NULL); free($5); }
|
|
|
|
| CODETABLE '[' IDENT ']' IDENT argument default flags
|
|
{
|
|
/* ECC-485: Set length to 0 and prepend the new argument */
|
|
grib_arguments* a = grib_arguments_new(grib_parser_context, new_accessor_expression(grib_parser_context,$3,0,0),NULL);
|
|
a->next = $6;
|
|
$$ = grib_action_create_gen(grib_parser_context, $5, "codetable",
|
|
0, a, /* length=0 and additional argument */
|
|
$7, $8, NULL, NULL);
|
|
free($5);
|
|
}
|
|
|
|
| CODETABLE '[' INTEGER ']' IDENT argument default SET '(' IDENT ')' flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"codetable",$3, $6,$7,$12,NULL,$10);
|
|
free($5);free($10); }
|
|
|
|
| CODETABLE '[' INTEGER ']' IDENT '(' argument_list ')' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"codetable",$3, $7,$9,$10,NULL,NULL); free($5); }
|
|
|
|
| SMART_TABLE IDENT '(' argument_list ')' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"smart_table",0,$4,$6,$7,NULL,NULL); free($2); }
|
|
|
|
| IDENT '=' DICTIONARY '(' argument_list ')' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$1,"dictionary",0,$5,$7,$8,NULL,NULL); free($1); }
|
|
|
|
| IDENT '=' GETENV '(' argument_list ')' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$1,"getenv",0,$5,$7,$8,NULL,NULL); free($1); }
|
|
|
|
| COMPLEX_CODETABLE '[' INTEGER ']' IDENT argument default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"complex_codetable",$3, $6,$7,$8,NULL,NULL); free($5); }
|
|
|
|
| COMPLEX_CODETABLE '[' INTEGER ']' IDENT '(' argument_list ')' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"complex_codetable",$3, $7,$9,$10,NULL,NULL); free($5); }
|
|
|
|
| FLAG '[' INTEGER ']' IDENT argument default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"codeflag",$3, $6,$7,$8,NULL,NULL); free($5); }
|
|
|
|
| LOOKUP '[' INTEGER ']' IDENT '(' argument_list ')' flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"lookup",$3,$7,NULL,$9,NULL,NULL); free($5); }
|
|
|
|
| FLAGBIT IDENT '(' argument_list ')' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"bit",0,$4,$6,$7,NULL,NULL); free($2); }
|
|
|
|
| LABEL IDENT
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"label",0,NULL,NULL,0,NULL,NULL); free($2); }
|
|
|
|
| LABEL STRING
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"label",0,NULL,NULL,0,NULL,NULL); free($2); }
|
|
|
|
| IBMFLOAT IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"ibmfloat",4,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
/*---------*/
|
|
| INT8 IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"int8",1,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| UINT8 IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"uint8",1,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| INT16 IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"int16",2,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| UINT16 IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"uint16",2,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| INT16_LITTLE_ENDIAN IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"int16_little_endian",2,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| UINT16_LITTLE_ENDIAN IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"uint16_little_endian",2,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| INT32 IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"int32",4,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| UINT32 IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"uint32",4,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| INT32_LITTLE_ENDIAN IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"int32_little_endian",4,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| UINT32_LITTLE_ENDIAN IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"uint32_little_endian",4,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| INT64 IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"int64",8,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| UINT64 IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"uint64",8,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| INT64_LITTLE_ENDIAN IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"int64_little_endian",8,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| UINT64_LITTLE_ENDIAN IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"uint64_little_endian",8,NULL,$3,$4,NULL,NULL);free($2); }
|
|
|
|
| BLOB IDENT '[' argument_list ']' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"blob",0,$4,$6,$7,NULL,NULL); free($2); }
|
|
/*---------*/
|
|
|
|
| IBMFLOAT IDENT '.' IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$4,"ibmfloat",4,NULL,$5,$6,$2,NULL);free($4); free($2); }
|
|
|
|
| IBMFLOAT IDENT '[' argument ']' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"ibmfloat",4,$4,$6,$7,NULL,NULL);free($2); }
|
|
|
|
| POS IDENT
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"position",0,NULL,NULL,0,NULL,NULL); free($2); }
|
|
|
|
| INTCONST IDENT '=' argument flags
|
|
{ $$ = grib_action_create_variable(grib_parser_context,$2,"constant",0,$4,NULL,$5,NULL);free($2); }
|
|
|
|
| TRANS IDENT '=' argument flags
|
|
{ $$ = grib_action_create_variable(grib_parser_context,$2,"transient",0,$4,$4,$5,NULL); free($2); }
|
|
| TRANS IDENT '=' '{' dvalues '}' flags
|
|
{ $$ = grib_action_create_transient_darray(grib_parser_context,$2,$5,$7); free($2); }
|
|
|
|
| FLOAT IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"ieeefloat",4,NULL,$3,$4,NULL,NULL); free($2); }
|
|
|
|
| FLOAT IDENT '.' IDENT default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$4,"ieeefloat",4,NULL,$5,$6,$2,NULL); free($4);free($2);}
|
|
|
|
| FLOAT IDENT '[' argument ']' default flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"ieeefloat",4,$4,$6,$7,NULL,NULL);free($2); }
|
|
|
|
| G1_HALF_BYTE IDENT
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"g1_half_byte_codeflag",0,NULL,NULL,0,NULL,NULL);free($2); }
|
|
|
|
| SECTION_LENGTH '[' INTEGER ']' IDENT default
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"section_length",$3,NULL,$6,0,NULL,NULL);free($5); }
|
|
|
|
| G1_MESSAGE_LENGTH '[' INTEGER ']' IDENT '(' argument_list ')'
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"g1_message_length",$3,$7,NULL,0,NULL,NULL);free($5); }
|
|
|
|
| G1_SECTION4_LENGTH '[' INTEGER ']' IDENT '(' argument_list ')'
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"g1_section4_length",$3,$7,NULL,0,NULL,NULL);free($5); }
|
|
|
|
| KSEC IDENT argument
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"ksec",0,$3,NULL,0,NULL,NULL);free($2); }
|
|
|
|
| PAD IDENT '(' argument_list ')'
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"pad",0,$4,0,0,NULL,NULL); free($2); }
|
|
|
|
| PADTO IDENT '(' argument_list ')'
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"padto",0,$4,0,0,NULL,NULL); free($2); }
|
|
|
|
| PADTOEVEN IDENT '(' argument_list ')'
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"padtoeven",0,$4,0,0,NULL,NULL); free($2); }
|
|
|
|
| PADTOMULTIPLE IDENT '(' argument_list ')'
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"padtomultiple",0,$4,0,0,NULL,NULL); free($2); }
|
|
|
|
| MESSAGE '[' INTEGER ']' IDENT flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$5,"message",$3,0,0,$6,NULL,NULL); free($5); }
|
|
|
|
| MESSAGE_COPY IDENT flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"message_copy",0,0,0,$3,NULL,NULL); free($2); }
|
|
|
|
| SECTION_PADDING IDENT flags
|
|
{ $$ = grib_action_create_gen(grib_parser_context,$2,"section_padding",0,0,0,$3,NULL,NULL); free($2); }
|
|
| TEMPLATE IDENT STRING
|
|
{ $$ = grib_action_create_template(grib_parser_context,0,$2,$3); free($2); free($3);}
|
|
| TEMPLATE_NOFAIL IDENT STRING
|
|
{ $$ = grib_action_create_template(grib_parser_context,1,$2,$3); free($2); free($3);}
|
|
|
|
| ALIAS IDENT '=' IDENT flags
|
|
{ $$ = grib_action_create_alias(grib_parser_context,$2,$4,NULL,$5); free($2); free($4); }
|
|
|
|
| UNALIAS IDENT
|
|
{ $$ = grib_action_create_alias(grib_parser_context,$2,NULL,NULL,0); free($2); }
|
|
|
|
| ALIAS IDENT '.' IDENT '=' IDENT flags
|
|
{
|
|
$$ = grib_action_create_alias(grib_parser_context,$4,$6,$2,$7); free($2); free($4); free($6);
|
|
}
|
|
| UNALIAS IDENT '.' IDENT
|
|
{
|
|
$$ = grib_action_create_alias(grib_parser_context,$4,NULL,$2,0); free($2); free($4);
|
|
}
|
|
| META IDENT IDENT '(' argument_list ')' default flags
|
|
{ $$ = grib_action_create_meta(grib_parser_context,$2,$3,$5,$7,$8,NULL); free($2);free($3);}
|
|
|
|
| META IDENT '.' IDENT IDENT '(' argument_list ')' default flags
|
|
{ $$ = grib_action_create_meta(grib_parser_context,$4,$5,$7,$9,$10,$2); free($4);free($5);free($2);}
|
|
|
|
| ITERATOR IDENT '(' argument_list ')'
|
|
{
|
|
grib_arguments* a = grib_arguments_new(
|
|
grib_parser_context,
|
|
new_accessor_expression(grib_parser_context,$2,0,0),
|
|
NULL
|
|
);
|
|
a->next=$4;
|
|
$$ = grib_action_create_meta(grib_parser_context,
|
|
"ITERATOR","iterator",a,NULL,
|
|
GRIB_ACCESSOR_FLAG_HIDDEN|GRIB_ACCESSOR_FLAG_READ_ONLY,NULL); free($2);
|
|
}
|
|
| NEAREST IDENT '(' argument_list ')'
|
|
{
|
|
grib_arguments* a = grib_arguments_new(
|
|
grib_parser_context,
|
|
new_accessor_expression(grib_parser_context,$2,0,0),
|
|
NULL
|
|
);
|
|
a->next=$4;
|
|
$$ = grib_action_create_meta(grib_parser_context,
|
|
"NEAREST","nearest",a,NULL,
|
|
GRIB_ACCESSOR_FLAG_HIDDEN|GRIB_ACCESSOR_FLAG_READ_ONLY,NULL); free($2);
|
|
}
|
|
| BOX IDENT '(' argument_list ')'
|
|
{
|
|
grib_arguments* a = grib_arguments_new(
|
|
grib_parser_context,
|
|
new_accessor_expression(grib_parser_context,$2,0,0),
|
|
NULL
|
|
);
|
|
a->next=$4;
|
|
$$ = grib_action_create_meta(grib_parser_context,
|
|
"BOX","box",a,NULL,
|
|
GRIB_ACCESSOR_FLAG_HIDDEN|GRIB_ACCESSOR_FLAG_READ_ONLY,NULL); free($2);
|
|
}
|
|
| EXPORT IDENT '(' argument_list ')'
|
|
{ $$ = grib_action_create_put(grib_parser_context,$2,$4);free($2);}
|
|
|
|
| REMOVE argument_list
|
|
{ $$ = grib_action_create_remove(grib_parser_context,$2);}
|
|
|
|
| RENAME '(' IDENT ',' IDENT ')' { $$ = grib_action_create_rename(grib_parser_context,$3,$5);free($3);free($5);}
|
|
|
|
| ASSERT '(' expression ')'
|
|
{ $$ = grib_action_create_assert(grib_parser_context,$3);}
|
|
|
|
| MODIFY IDENT flags
|
|
{ $$ = grib_action_create_modify(grib_parser_context,$2,$3); free($2);}
|
|
|
|
| SET IDENT '=' MISSING { $$ = grib_action_create_set_missing(grib_parser_context,$2); free($2); }
|
|
| SET IDENT '=' expression { $$ = grib_action_create_set(grib_parser_context,$2,$4,0); free($2); }
|
|
| SET IDENT '=' '{' dvalues '}' { $$ = grib_action_create_set_darray(grib_parser_context,$2,$5); free($2); }
|
|
| SET IDENT '=' '{' svalues '}' { $$ = grib_action_create_set_sarray(grib_parser_context,$2,$5); free($2); }
|
|
|
|
| SET_NOFAIL IDENT '=' expression { $$ = grib_action_create_set(grib_parser_context,$2,$4,1); free($2); }
|
|
|
|
|
|
| WRITE STRING { $$ = grib_action_create_write(grib_parser_context,$2,0,0); free($2);}
|
|
| WRITE { $$ = grib_action_create_write(grib_parser_context,"",0,0); }
|
|
| WRITE '(' INTEGER ')' STRING { $$ = grib_action_create_write(grib_parser_context,$5,0,$3); free($5);}
|
|
| WRITE '(' INTEGER ')' { $$ = grib_action_create_write(grib_parser_context,"",0,$3); }
|
|
| APPEND STRING { $$ = grib_action_create_write(grib_parser_context,$2,1,0); free($2);}
|
|
| APPEND { $$ = grib_action_create_write(grib_parser_context,"",1,0); }
|
|
| APPEND '(' INTEGER ')' STRING { $$ = grib_action_create_write(grib_parser_context,$5,1,$3); free($5);}
|
|
| APPEND '(' INTEGER ')' { $$ = grib_action_create_write(grib_parser_context,"",1,$3); }
|
|
|
|
| CLOSE '(' IDENT ')' { $$ = grib_action_create_close(grib_parser_context,$3); free($3);}
|
|
| PRINT STRING { $$ = grib_action_create_print(grib_parser_context,$2,0); free($2); }
|
|
| PRINT '(' STRING ')' STRING { $$ = grib_action_create_print(grib_parser_context,$5,$3); free($5); free($3);}
|
|
| PRINT '(' IDENT ')' STRING { $$ = grib_action_create_print(grib_parser_context,$5,$3); free($5); free($3);}
|
|
| PRINT { $$ = grib_action_create_print(grib_parser_context,"",0); }
|
|
;
|
|
|
|
if_block:
|
|
IF '(' expression ')' '{' instructions '}' { $$ = grib_action_create_if(grib_parser_context,$3,$6,0,0,yylineno,file_being_parsed()); }
|
|
| IF '(' expression ')' '{' instructions '}' ELSE '{' instructions '}' { $$ = grib_action_create_if(grib_parser_context,$3,$6,$10,0,yylineno,file_being_parsed()); }
|
|
| IF_TRANSIENT '(' expression ')' '{' instructions '}' { $$ = grib_action_create_if(grib_parser_context,$3,$6,0,1,yylineno,file_being_parsed()); }
|
|
| IF_TRANSIENT '(' expression ')' '{' instructions '}' ELSE '{' instructions '}' { $$ = grib_action_create_if(grib_parser_context,$3,$6,$10,1,yylineno,file_being_parsed()); }
|
|
;
|
|
|
|
when_block:
|
|
WHEN '(' expression ')' set semi { $$ = grib_action_create_when(grib_parser_context,$3,$5,NULL); }
|
|
| WHEN '(' expression ')' '{' set_list '}' { $$ = grib_action_create_when(grib_parser_context,$3,$6,NULL); }
|
|
| WHEN '(' expression ')' '{' set_list '}' ELSE '{' set_list '}' { $$ = grib_action_create_when(grib_parser_context,$3,$6,$10); }
|
|
;
|
|
|
|
set: SET IDENT '=' expression { $$ = grib_action_create_set(grib_parser_context,$2,$4,0); free($2); }
|
|
| SET_NOFAIL IDENT '=' expression { $$ = grib_action_create_set(grib_parser_context,$2,$4,1); free($2); }
|
|
;
|
|
|
|
set_list: set semi
|
|
| set_list set semi { $1->next = $2; $$ = $1; }
|
|
;
|
|
|
|
|
|
default: empty { $$ = NULL ;}
|
|
| '=' argument_list { $$ = $2 ;}
|
|
;
|
|
|
|
flags: empty { $$ = 0 ; }
|
|
| ':' flag_list { $$ = $2; }
|
|
;
|
|
|
|
flag_list: flag
|
|
| flag_list ',' flag { $$ = $1 | $3; }
|
|
;
|
|
|
|
flag: READ_ONLY { $$ = GRIB_ACCESSOR_FLAG_READ_ONLY; }
|
|
| LOWERCASE { $$ = GRIB_ACCESSOR_FLAG_LOWERCASE; }
|
|
| DUMP { $$ = GRIB_ACCESSOR_FLAG_DUMP; }
|
|
| NO_COPY { $$ = GRIB_ACCESSOR_FLAG_NO_COPY; }
|
|
| NO_FAIL { $$ = GRIB_ACCESSOR_FLAG_NO_FAIL; }
|
|
| HIDDEN { $$ = GRIB_ACCESSOR_FLAG_HIDDEN; }
|
|
| EDITION_SPECIFIC { $$ = GRIB_ACCESSOR_FLAG_EDITION_SPECIFIC; }
|
|
| CAN_BE_MISSING { $$ = GRIB_ACCESSOR_FLAG_CAN_BE_MISSING; }
|
|
| CONSTRAINT { $$ = GRIB_ACCESSOR_FLAG_CONSTRAINT; }
|
|
| COPY_OK { $$ = GRIB_ACCESSOR_FLAG_COPY_OK; }
|
|
| TRANS { $$ = GRIB_ACCESSOR_FLAG_TRANSIENT; }
|
|
| STRING_TYPE { $$ = GRIB_ACCESSOR_FLAG_STRING_TYPE; }
|
|
| LONG_TYPE { $$ = GRIB_ACCESSOR_FLAG_LONG_TYPE; }
|
|
| DOUBLE_TYPE { $$ = GRIB_ACCESSOR_FLAG_DOUBLE_TYPE; }
|
|
;
|
|
|
|
list_block: IDENT LIST '(' expression ')' '{' instructions '}' { $$ = grib_action_create_list(grib_parser_context,$1,$4,$7); free($1); }
|
|
;
|
|
|
|
while_block: WHILE '(' expression ')' '{' instructions '}' { $$ = grib_action_create_while(grib_parser_context,$3,$6); }
|
|
;
|
|
|
|
trigger_block: TRIGGER '(' argument_list ')' '{' instructions '}' { $$ = grib_action_create_trigger(grib_parser_context,$3,$6); }
|
|
;
|
|
|
|
concept_block: CONCEPT IDENT '{' concept_list '}' flags { $$ = grib_action_create_concept(grib_parser_context,$2,$4,0,0,0,0,0,0,$6,0); free($2); }
|
|
| CONCEPT IDENT '(' IDENT ')' '{' concept_list '}' flags { $$ = grib_action_create_concept(grib_parser_context,$2,$7,0,0,$4,0,0,0,$9,0); free($2);free($4); }
|
|
| CONCEPT IDENT '(' IDENT ',' STRING ',' IDENT ',' IDENT ')' flags { $$ = grib_action_create_concept(grib_parser_context,$2,0,$6,0,$4,$8,$10,0,$12,0); free($2);free($6);free($4);free($8);free($10); }
|
|
| CONCEPT IDENT '(' IDENT ',' STRING ',' IDENT ',' IDENT ',' IDENT ')' flags { $$ = grib_action_create_concept(grib_parser_context,$2,0,$6,0,$4,$8,$10,$12,$14,0); free($2);free($6);free($4);free($8);free($10);free($12); }
|
|
| CONCEPT IDENT '(' IDENT ',' STRING ',' IDENT ')' flags { $$ = grib_action_create_concept(grib_parser_context,$2,0,$6,0,$4,$8,0,0,$10,0); free($2);free($6);free($4);free($8); }
|
|
| CONCEPT IDENT '.' IDENT '(' IDENT ',' STRING ',' IDENT ',' IDENT ')' flags { $$ = grib_action_create_concept(grib_parser_context,$4,0,$8,$2,$6,$10,$12,0,$14,0); free($4);free($8);free($6);free($10); free($12); free($2);}
|
|
| CONCEPT IDENT '.' IDENT '(' IDENT ',' STRING ',' IDENT ')' flags { $$ = grib_action_create_concept(grib_parser_context,$4,0,$8,$2,$6,$10,0,0,$12,0); free($4);free($8);free($6);free($10); free($2);}
|
|
| CONCEPT IDENT '.' IDENT '{' concept_list '}' flags { $$ = grib_action_create_concept(grib_parser_context,$4,$6,0,$2,0,0,0,0,$8,0); free($2);free($4); }
|
|
| CONCEPT IDENT '.' IDENT '(' IDENT ')' '{' concept_list '}' flags { $$ = grib_action_create_concept(grib_parser_context,$4,$9,0,$2,$6,0,0,0,$11,0); free($2);free($4);free($6); }
|
|
| CONCEPT_NOFAIL IDENT '{' concept_list '}' flags { $$ = grib_action_create_concept(grib_parser_context,$2,$4,0,0,0,0,0,0,$6,1); free($2); }
|
|
| CONCEPT_NOFAIL IDENT '(' IDENT ')' '{' concept_list '}' flags { $$ = grib_action_create_concept(grib_parser_context,$2,$7,0,0,$4,0,0,0,$9,1); free($2);free($4); }
|
|
| CONCEPT_NOFAIL IDENT '(' IDENT ',' STRING ',' IDENT ',' IDENT ')' flags { $$ = grib_action_create_concept(grib_parser_context,$2,0,$6,0,$4,$8,$10,0,$12,1); free($2);free($6);free($4);free($8);free($10); }
|
|
| CONCEPT_NOFAIL IDENT '(' IDENT ',' STRING ',' IDENT ')' flags { $$ = grib_action_create_concept(grib_parser_context,$2,0,$6,0,$4,$8,0,0,$10,1); free($2);free($6);free($4);free($8); }
|
|
| CONCEPT_NOFAIL IDENT '.' IDENT '(' IDENT ',' STRING ',' IDENT ',' IDENT ')' flags { $$ = grib_action_create_concept(grib_parser_context,$4,0,$8,$2,$6,$10,$12,0,$14,1); free($4);free($8);free($6);free($10);free($12); free($2);}
|
|
| CONCEPT_NOFAIL IDENT '.' IDENT '(' IDENT ',' STRING ',' IDENT ')' flags { $$ = grib_action_create_concept(grib_parser_context,$4,0,$8,$2,$6,$10,0,0,$12,1); free($4);free($8);free($6);free($10); free($2);}
|
|
| CONCEPT_NOFAIL IDENT '.' IDENT '{' concept_list '}' flags { $$ = grib_action_create_concept(grib_parser_context,$4,$6,0,$2,0,0,0,0,$8,1); free($2);free($4); }
|
|
| CONCEPT_NOFAIL IDENT '.' IDENT '(' IDENT ')' '{' concept_list '}' flags { $$ = grib_action_create_concept(grib_parser_context,$4,$9,0,$2,$6,0,0,0,$11,1); free($2);free($4);free($6); }
|
|
|
|
;
|
|
|
|
concept_list: concept_value
|
|
| concept_list concept_value { $$ = $2; $2->next = $1; }
|
|
;
|
|
|
|
hash_array_list: hash_array_value
|
|
| hash_array_list hash_array_value { $$ = $2; $2->next = $1; }
|
|
;
|
|
|
|
hash_array_block: HASH_ARRAY IDENT '{' hash_array_list '}' flags { $$ = grib_action_create_hash_array(grib_parser_context,$2,$4,0,0,0,0,0,0,$6,0); free($2); }
|
|
| HASH_ARRAY IDENT '(' IDENT ',' STRING ',' IDENT ',' IDENT ')' flags { $$ = grib_action_create_hash_array(grib_parser_context,$2,0,$6,0,$4,$8,$10,0,$12,0); free($2);free($6);free($4);free($8);free($10); }
|
|
;
|
|
|
|
case_list: case_value
|
|
| case_list case_value { $$ = $2; $2->next = $1; }
|
|
;
|
|
|
|
case_value: CASE arguments ':' instructions { $$ = grib_case_new(grib_parser_context,$2,$4); }
|
|
;
|
|
|
|
switch_block:
|
|
SWITCH '(' argument_list ')' '{' case_list DEFAULT ':' instructions '}' { $$ = grib_action_create_switch(grib_parser_context,$3,$6,$9); }
|
|
| SWITCH '(' argument_list ')' '{' case_list DEFAULT ':' '}' { $$ = grib_action_create_switch(grib_parser_context,$3,$6,grib_action_create_noop(grib_parser_context,"continue")); }
|
|
| SWITCH '(' argument_list ')' '{' case_list '}' { $$ = grib_action_create_switch(grib_parser_context,$3,$6,0); }
|
|
;
|
|
|
|
concept_value: STRING '=' '{' concept_conditions '}' {
|
|
$$ = grib_concept_value_new(grib_parser_context,$1,$4); free($1);}
|
|
| IDENT '=' '{' concept_conditions '}' {
|
|
$$ = grib_concept_value_new(grib_parser_context,$1,$4); free($1);}
|
|
| INTEGER '=' '{' concept_conditions '}' {
|
|
char buf[80]; snprintf(buf, sizeof(buf), "%ld",(long)$1); $$ = grib_concept_value_new(grib_parser_context,buf,$4);}
|
|
| FLOAT '=' '{' concept_conditions '}' {
|
|
char buf[80]; snprintf(buf, sizeof(buf), "%g", (double)$1); $$ = grib_concept_value_new(grib_parser_context,buf,$4);}
|
|
;
|
|
|
|
concept_conditions: concept_condition
|
|
| concept_condition concept_conditions { $1->next = $2; $$ = $1; }
|
|
;
|
|
|
|
concept_condition: IDENT '=' expression ';' { $$ = grib_concept_condition_new(grib_parser_context,$1,$3,0); free($1); }
|
|
| IDENT '=' '[' integer_array ']' ';' { $$ = grib_concept_condition_new(grib_parser_context,$1,0,$4); free($1); }
|
|
;
|
|
|
|
|
|
hash_array_value: STRING '=' '[' integer_array ']' {
|
|
$$ = grib_integer_hash_array_value_new(grib_parser_context,$1,$4); free($1);}
|
|
| IDENT '=' '[' integer_array ']' {
|
|
$$ = grib_integer_hash_array_value_new(grib_parser_context,$1,$4); free($1);}
|
|
;
|
|
|
|
string_or_ident: SUBSTR '(' IDENT ',' INTEGER ',' INTEGER ')' { $$ = new_accessor_expression(grib_parser_context,$3,$5,$7); free($3); }
|
|
| IDENT { $$ = new_accessor_expression(grib_parser_context,$1,0,0); free($1); }
|
|
| SUBSTR '(' STRING ',' INTEGER ',' INTEGER ')' { $$ = new_sub_string_expression(grib_parser_context,$3,$5,$7); free($3); }
|
|
| STRING { $$ = new_string_expression(grib_parser_context,$1); free($1); }
|
|
;
|
|
|
|
atom: string_or_ident
|
|
| INTEGER { $$ = new_long_expression(grib_parser_context,$1); }
|
|
| FLOAT { $$ = new_double_expression(grib_parser_context,$1); /* TODO: change to new_float_expression*/}
|
|
|
|
| NIL { $$ = NULL; }
|
|
| DUMMY { $$ = new_true_expression(grib_parser_context); }
|
|
| '(' expression ')' { $$ = $2; }
|
|
| '-' atom { $$ = new_unop_expression(grib_parser_context,&grib_op_neg,&grib_op_neg_d,$2); }
|
|
| IDENT '(' ')' { $$ = new_func_expression(grib_parser_context,$1,NULL); free($1);}
|
|
| IDENT '(' argument_list ')' { $$ = new_func_expression(grib_parser_context,$1,$3); free($1);}
|
|
;
|
|
|
|
|
|
power: atom '^' power { $$ = new_binop_expression(grib_parser_context,&grib_op_pow,NULL,$1,$3); }
|
|
| atom
|
|
;
|
|
|
|
factor: factor '*' power { $$ = new_binop_expression(grib_parser_context,&grib_op_mul,&grib_op_mul_d,$1,$3); }
|
|
| factor '/' power { $$ = new_binop_expression(grib_parser_context,&grib_op_div,&grib_op_div_d,$1,$3); }
|
|
| factor '%' power { $$ = new_binop_expression(grib_parser_context,&grib_op_modulo,NULL,$1,$3); }
|
|
| factor BIT power { $$ = new_binop_expression(grib_parser_context,&grib_op_bit,NULL,$1,$3); }
|
|
| factor BITOFF power { $$ = new_binop_expression(grib_parser_context,&grib_op_bitoff,NULL,$1,$3); }
|
|
| power
|
|
| LENGTH '(' IDENT ')' { $$ = new_length_expression(grib_parser_context,$3); free($3);}
|
|
| IS_IN_LIST '(' IDENT ',' STRING ')' { $$ = new_is_in_list_expression(grib_parser_context,$3,$5); free($3);free($5);}
|
|
| IS_IN_DICT '(' IDENT ',' STRING ')' { $$ = new_is_in_dict_expression(grib_parser_context,$3,$5); free($3);free($5);}
|
|
| IS_INTEGER '(' IDENT ',' INTEGER ')' { $$ = new_is_integer_expression(grib_parser_context,$3,$5,0); free($3);}
|
|
| IS_INTEGER '(' IDENT ',' INTEGER ',' INTEGER ')' { $$ = new_is_integer_expression(grib_parser_context,$3,$5,$7); free($3);}
|
|
| IS_INTEGER '(' IDENT ')' { $$ = new_is_integer_expression(grib_parser_context,$3,0,0); free($3);}
|
|
;
|
|
|
|
term: term '+' factor { $$ = new_binop_expression(grib_parser_context,&grib_op_add,&grib_op_add_d,$1,$3); }
|
|
| term '-' factor { $$ = new_binop_expression(grib_parser_context,&grib_op_sub,&grib_op_sub_d,$1,$3); }
|
|
| factor
|
|
;
|
|
|
|
condition: condition GT term { $$ = new_binop_expression(grib_parser_context,&grib_op_gt,&grib_op_gt_d,$1,$3); }
|
|
/* | condition '=' term { $$ = new_binop_expression(grib_parser_context,&grib_op_eq,$1,$3); } */
|
|
| condition EQ term { $$ = new_binop_expression(grib_parser_context,&grib_op_eq,&grib_op_eq_d,$1,$3); }
|
|
| condition LT term { $$ = new_binop_expression(grib_parser_context,&grib_op_lt,&grib_op_lt_d,$1,$3); }
|
|
| condition GE term { $$ = new_binop_expression(grib_parser_context,&grib_op_ge,&grib_op_ge_d,$1,$3); }
|
|
| condition LE term { $$ = new_binop_expression(grib_parser_context,&grib_op_le,&grib_op_le_d,$1,$3); }
|
|
| condition NE term { $$ = new_binop_expression(grib_parser_context,&grib_op_ne,&grib_op_ne_d,$1,$3); }
|
|
| string_or_ident IS string_or_ident { $$ = new_string_compare_expression(grib_parser_context,$1,$3); }
|
|
/*
|
|
| condition IN term { $$ = new_binop_expression(grib_parser_context,grib_op_pow,$1,$3); }
|
|
| condition MATCH term { $$ = new_binop_expression(grib_parser_context,grib_op_pow,$1,$3); }
|
|
*/
|
|
| NOT condition { $$ = new_unop_expression(grib_parser_context,&grib_op_not,NULL,$2); }
|
|
| term
|
|
;
|
|
|
|
conjunction: conjunction AND condition { $$ = new_logical_and_expression(grib_parser_context,$1,$3); }
|
|
| condition
|
|
;
|
|
|
|
disjunction: disjunction OR conjunction { $$ = new_logical_or_expression(grib_parser_context,$1,$3);}
|
|
| conjunction
|
|
;
|
|
|
|
expression: disjunction
|
|
;
|
|
|
|
|
|
/* */
|
|
|
|
rule: fact
|
|
| conditional_rule
|
|
;
|
|
|
|
rule_entry: IDENT '=' expression ';' { $$ = grib_new_rule_entry(grib_parser_context,$1,$3); free($1); }
|
|
| SKIP ';' { $$ = grib_new_rule_entry(grib_parser_context,"skip",0);}
|
|
;
|
|
|
|
rule_entries: rule_entry
|
|
| rule_entry rule_entries { $1->next = $2; $$ = $1; }
|
|
;
|
|
|
|
fact: rule_entry { $$ = grib_new_rule(grib_parser_context,NULL,$1); }
|
|
;
|
|
|
|
|
|
conditional_rule: IF '(' expression ')' '{' rule_entries '}' { $$ = grib_new_rule(grib_parser_context,$3,$6); }
|
|
;
|
|
|
|
rules: rule
|
|
| rule rules { $1->next = $2; $$ = $1; }
|
|
;
|
|
|
|
|
|
%%
|
|
|
|
static grib_concept_value *_reverse_concept(grib_concept_value *r,grib_concept_value *s)
|
|
{
|
|
grib_concept_value *v;
|
|
|
|
if(r == NULL) return s;
|
|
|
|
v = r->next;
|
|
r->next = s;
|
|
return _reverse_concept(v,r);
|
|
}
|
|
|
|
static grib_concept_value* reverse_concept(grib_concept_value* r)
|
|
{
|
|
return _reverse_concept(r,NULL);
|
|
}
|
|
|
|
static grib_hash_array_value *_reverse_hash_array(grib_hash_array_value *r,grib_hash_array_value *s)
|
|
{
|
|
grib_hash_array_value *v;
|
|
|
|
if(r == NULL) return s;
|
|
|
|
v = r->next;
|
|
r->next = s;
|
|
return _reverse_hash_array(v,r);
|
|
}
|
|
|
|
static grib_hash_array_value* reverse_hash_array(grib_hash_array_value* r)
|
|
{
|
|
return _reverse_hash_array(r,NULL);
|
|
}
|