mirror of
https://github.com/Unidata/netcdf-c.git
synced 2025-01-24 16:04:40 +08:00
This commit is contained in:
parent
ac1287d00b
commit
23727f5597
@ -91,6 +91,8 @@ ${top_builddir}/libdispatch/libdispatch.la
|
||||
|
||||
CLEANFILES += t_dap
|
||||
|
||||
EXTRA_DIST = ce.y
|
||||
|
||||
endif # BUILD_DAP
|
||||
|
||||
# These rule are used if someone wants to rebuild the grammar files.
|
||||
|
195
libncdap3/ce.y
Normal file
195
libncdap3/ce.y
Normal file
@ -0,0 +1,195 @@
|
||||
/* Copyright 2009, 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 {CEparsestate* parsestate}
|
||||
%parse-param {CEparsestate* parsestate}
|
||||
%{#include "ceparselex.h"%}
|
||||
|
||||
/*DO NOT DELETE THIS LINE*/
|
||||
|
||||
%token SCAN_WORD
|
||||
%token SCAN_STRINGCONST
|
||||
%token SCAN_NUMBERCONST
|
||||
|
||||
%start constraints
|
||||
|
||||
%%
|
||||
|
||||
constraints:
|
||||
projections {projections(parsestate,$1);}
|
||||
| selections {selections(parsestate,$1);}
|
||||
| projections selections
|
||||
{projections(parsestate,$1); selections(parsestate,$2);}
|
||||
;
|
||||
|
||||
/* %type NClist<NCprojection*> */
|
||||
projections: projectionlist {$$=$1;}
|
||||
|
||||
/* %type NClist<NCselection*> */
|
||||
selections: selectionlist {$$=$1;}
|
||||
|
||||
/* %type NClist<NCprojection*> */
|
||||
projectionlist:
|
||||
projection
|
||||
{$$=projectionlist(parsestate,null,$1);}
|
||||
| projectionlist ',' projection
|
||||
{$$=projectionlist(parsestate,$1,$3);}
|
||||
;
|
||||
|
||||
/* %type NCprojection* */
|
||||
projection:
|
||||
segmentlist
|
||||
{$$=projection(parsestate,$1);}
|
||||
;
|
||||
|
||||
/* %type NClist<NCsegment> */
|
||||
segmentlist:
|
||||
segment
|
||||
{$$=segmentlist(parsestate,null,$1);}
|
||||
| segmentlist '.' segment
|
||||
{$$=segmentlist(parsestate,$1,$3);}
|
||||
;
|
||||
|
||||
/* %type NCsegment */
|
||||
segment:
|
||||
word
|
||||
{$$=segment(parsestate,$1,null);}
|
||||
| word array_indices
|
||||
{$$=segment(parsestate,$1,$2);}
|
||||
;
|
||||
|
||||
/* %type NClist<NCslice*> */
|
||||
array_indices: /* appends indices to state->segment */
|
||||
array_index
|
||||
{$$=array_indices(parsestate,null,$1);}
|
||||
| array_indices array_index
|
||||
{$$=array_indices(parsestate,$1,$2);}
|
||||
;
|
||||
|
||||
/* %type NCslice* */
|
||||
array_index:
|
||||
range {$$=$1;}
|
||||
;
|
||||
|
||||
/* %type NCslice* */
|
||||
range:
|
||||
range1
|
||||
{$$=range(parsestate,$1,null,null);}
|
||||
| '[' index ':' index ']'
|
||||
{$$=range(parsestate,$2,null,$4);}
|
||||
| '[' index ':' index ':' index ']'
|
||||
{$$=range(parsestate,$2,$4,$6);}
|
||||
;
|
||||
|
||||
range1: '[' index ']' {$$=$2;}
|
||||
|
||||
/* %type NClist<NCselection*> */
|
||||
selectionlist:
|
||||
'&' sel_clause
|
||||
{$$=selectionlist(parsestate,null,$2);}
|
||||
| selectionlist sel_clause
|
||||
{$$=selectionlist(parsestate,$1,$2);}
|
||||
;
|
||||
|
||||
/* %type NCselection* */
|
||||
sel_clause:
|
||||
selectionvar rel_op '{' value_list '}'
|
||||
{$$=sel_clause(parsestate,1,$1,$2,$4);} /*1,2 distinguish cases*/
|
||||
| selectionvar rel_op value
|
||||
{$$=sel_clause(parsestate,2,$1,$2,$3);}
|
||||
| function
|
||||
;
|
||||
|
||||
/* %type NClist<NCselection*> */
|
||||
selectionvar:
|
||||
selectionpath
|
||||
{$$=$1;}
|
||||
;
|
||||
/* %type NClist<NCselection*> */
|
||||
selectionpath:
|
||||
arrayelement
|
||||
{$1=selectionpath(parsestate,null,$1);}
|
||||
| segment '.' arrayelement
|
||||
{$$=selectionpath(parsestate,$1,$3);}
|
||||
;
|
||||
|
||||
function:
|
||||
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);}
|
||||
;
|
||||
|
||||
value_list:
|
||||
value
|
||||
{$$=value_list(parsestate,null,$1);}
|
||||
| value_list '|' value
|
||||
{$$=value_list(parsestate,$1,$3);}
|
||||
;
|
||||
|
||||
value:
|
||||
selectionpath /* can be variable or an integer */
|
||||
{$$=value(parsestate,$1,SCAN_WORD);}
|
||||
| number
|
||||
{$$=value(parsestate,$1,SCAN_NUMBERCONST);}
|
||||
| string
|
||||
{$$=value(parsestate,$1,SCAN_STRINGCONST);}
|
||||
;
|
||||
|
||||
/* %type SelectionTag */
|
||||
rel_op:
|
||||
'=' {$$=(Object)ST_EQ;}
|
||||
| '>' {$$=(Object)ST_GT;}
|
||||
| '<' {$$=(Object)ST_LT;}
|
||||
| '!' '=' {$$=(Object)ST_NEQ;}
|
||||
| '=' '~' {$$=(Object)ST_RE;}
|
||||
| '>' '=' {$$=(Object)ST_GE;}
|
||||
| '<' '=' {$$=(Object)ST_LE;}
|
||||
;
|
||||
|
||||
/* type NCsegment* */
|
||||
arrayelement:
|
||||
word
|
||||
{$$=arrayelement(parsestate,$1,null);}
|
||||
| word range1
|
||||
{$$=arrayelement(parsestate,$1,$2);}
|
||||
;
|
||||
|
||||
ident: word
|
||||
{$$ = $1;}
|
||||
;
|
||||
|
||||
index: number
|
||||
{ unsigned long tmp = 0;
|
||||
if(sscanf((char*)$1,"%lu",&tmp) != 1) {
|
||||
yyerror(parsestate,"Index is not an integer");
|
||||
}
|
||||
$$ = $1;
|
||||
}
|
||||
;
|
||||
|
||||
word: SCAN_WORD
|
||||
{$$ = $1;}
|
||||
;
|
||||
|
||||
number: SCAN_NUMBERCONST
|
||||
{$$ = $1;}
|
||||
;
|
||||
|
||||
string: SCAN_STRINGCONST
|
||||
{$$ = $1;}
|
||||
;
|
||||
|
||||
%%
|
Loading…
Reference in New Issue
Block a user