mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-12-21 08:39:46 +08:00
212 lines
3.9 KiB
Plaintext
212 lines
3.9 KiB
Plaintext
/* Copyright 2018, UCAR/Unidata and OPeNDAP, Inc.
|
|
See the COPYRIGHT file for more information. */
|
|
|
|
/*The lines down to DO NOT DELETE ... comment are specific to the C Parser.
|
|
They will be commennted out when building a java parser.
|
|
*/
|
|
|
|
%pure-parser
|
|
%lex-param {DCEparsestate* parsestate}
|
|
%parse-param {DCEparsestate* parsestate}
|
|
%{
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
#include <stdlib.h>
|
|
#include "netcdf.h"
|
|
#include "ncbytes.h"
|
|
#include "nclist.h"
|
|
#include "dceconstraints.h"
|
|
#include "dceparselex.h"
|
|
%}
|
|
|
|
/*DO NOT DELETE THIS LINE*/
|
|
|
|
%token SCAN_WORD
|
|
%token SCAN_STRINGCONST
|
|
%token SCAN_NUMBERCONST
|
|
|
|
%start constraints
|
|
|
|
%%
|
|
|
|
constraints:
|
|
optquestionmark projections
|
|
| optquestionmark selections
|
|
| optquestionmark projections selections
|
|
| /*empty*/
|
|
;
|
|
|
|
optquestionmark: '?' | /*empty*/ ;
|
|
|
|
projections:
|
|
projectionlist {projections(parsestate,$1);}
|
|
;
|
|
|
|
selections:
|
|
clauselist {selections(parsestate,$1);}
|
|
;
|
|
|
|
projectionlist:
|
|
projection
|
|
{$$=projectionlist(parsestate,(Object)null,$1);}
|
|
| projectionlist ',' projection
|
|
{$$=projectionlist(parsestate,$1,$3);}
|
|
;
|
|
|
|
projection:
|
|
segmentlist
|
|
{$$=projection(parsestate,$1);}
|
|
| function
|
|
{$$=projection(parsestate,$1);}
|
|
;
|
|
|
|
function:
|
|
ident '(' ')'
|
|
{$$=function(parsestate,$1,null);}
|
|
| ident '(' arg_list ')'
|
|
{$$=function(parsestate,$1,$3);}
|
|
;
|
|
|
|
segmentlist:
|
|
segment
|
|
{$$=segmentlist(parsestate,null,$1);}
|
|
| segmentlist '.' segment
|
|
{$$=segmentlist(parsestate,$1,$3);}
|
|
;
|
|
|
|
segment:
|
|
word
|
|
{$$=segment(parsestate,$1,null);}
|
|
| word rangelist
|
|
{$$=segment(parsestate,$1,$2);}
|
|
;
|
|
|
|
rangelist:
|
|
range
|
|
{$$=rangelist(parsestate,null,$1);}
|
|
| rangelist range
|
|
{$$=rangelist(parsestate,$1,$2);}
|
|
;
|
|
|
|
range:
|
|
'[' number ']'
|
|
{$$=range(parsestate,$2,null,null);}
|
|
| '[' number ':' number ']'
|
|
{$$=range(parsestate,$2,null,$4);}
|
|
| '[' number ':' number ':' number ']'
|
|
{$$=range(parsestate,$2,$4,$6);}
|
|
;
|
|
|
|
range1: '[' number ']'
|
|
{$$ = range1(parsestate,$2);}
|
|
;
|
|
|
|
|
|
clauselist:
|
|
sel_clause
|
|
{$$=clauselist(parsestate,null,$1);}
|
|
| clauselist sel_clause
|
|
{$$=clauselist(parsestate,$1,$2);}
|
|
;
|
|
|
|
sel_clause:
|
|
'&' value rel_op '{' value_list '}'
|
|
{$$=sel_clause(parsestate,1,$2,$3,$5);} /*1,2 distinguish cases*/
|
|
| '&' value rel_op value
|
|
{$$=sel_clause(parsestate,2,$2,$3,$4);}
|
|
| '&' boolfunction
|
|
{$$=$1;}
|
|
;
|
|
|
|
value_list:
|
|
value
|
|
{$$=value_list(parsestate,null,$1);}
|
|
| value_list ',' value
|
|
{$$=value_list(parsestate,$1,$3);}
|
|
;
|
|
|
|
value:
|
|
var
|
|
{$$=value(parsestate,$1);}
|
|
| function
|
|
{$$=value(parsestate,$1);}
|
|
| constant
|
|
{$$=value(parsestate,$1);}
|
|
;
|
|
|
|
constant:
|
|
number
|
|
{$$=constant(parsestate,$1,SCAN_NUMBERCONST);}
|
|
| string
|
|
{$$=constant(parsestate,$1,SCAN_STRINGCONST);}
|
|
;
|
|
|
|
var:
|
|
indexpath
|
|
{$$=var(parsestate,$1);}
|
|
;
|
|
|
|
indexpath:
|
|
index
|
|
{$$=indexpath(parsestate,null,$1);}
|
|
| indexpath '.' index
|
|
{$$=indexpath(parsestate,$1,$3);}
|
|
;
|
|
|
|
index:
|
|
word
|
|
{$$=indexer(parsestate,$1,null);}
|
|
| word array_indices
|
|
{$$=indexer(parsestate,$1,$2);}
|
|
;
|
|
|
|
array_indices:
|
|
range1
|
|
{$$=array_indices(parsestate,null,$1);}
|
|
| array_indices range1
|
|
{$$=array_indices(parsestate,$1,$2);}
|
|
;
|
|
|
|
boolfunction:
|
|
ident '(' ')'
|
|
{$$=function(parsestate,$1,null);}
|
|
| ident '(' arg_list ')'
|
|
{$$=function(parsestate,$1,$3);}
|
|
;
|
|
|
|
arg_list:
|
|
value
|
|
{$$=arg_list(parsestate,null,$1);}
|
|
| value_list ',' value
|
|
{$$=arg_list(parsestate,$1,$3);}
|
|
;
|
|
|
|
rel_op:
|
|
'=' {$$=makeselectiontag(CEO_EQ);}
|
|
| '>' {$$=makeselectiontag(CEO_GT);}
|
|
| '<' {$$=makeselectiontag(CEO_LT);}
|
|
| '!' '=' {$$=makeselectiontag(CEO_NEQ);}
|
|
| '>' '=' {$$=makeselectiontag(CEO_GE);}
|
|
| '<' '=' {$$=makeselectiontag(CEO_LE);}
|
|
| '=' '~' {$$=makeselectiontag(CEO_RE);}
|
|
;
|
|
|
|
ident: word
|
|
{$$ = $1;}
|
|
;
|
|
|
|
word: SCAN_WORD
|
|
{$$ = checkobject($1);}
|
|
;
|
|
|
|
number: SCAN_NUMBERCONST
|
|
{$$ = checkobject($1);}
|
|
;
|
|
|
|
string: SCAN_STRINGCONST
|
|
{$$ = checkobject($1);}
|
|
;
|
|
|
|
%%
|