netcdf-c/oc/dap.y

251 lines
7.0 KiB
Plaintext

/* 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 {DAPparsestate* parsestate}
%parse-param {DAPparsestate* parsestate}
%{#include "dapparselex.h"%}
/*DO NOT DELETE THIS LINE*/
%token SCAN_ALIAS
%token SCAN_ARRAY
%token SCAN_ATTR
%token SCAN_BYTE
%token SCAN_CODE
%token SCAN_DATASET
%token SCAN_DATA
%token SCAN_ERROR
%token SCAN_FLOAT32
%token SCAN_FLOAT64
%token SCAN_GRID
%token SCAN_INT16
%token SCAN_INT32
%token SCAN_MAPS
%token SCAN_MESSAGE
%token SCAN_SEQUENCE
%token SCAN_STRING
%token SCAN_STRUCTURE
%token SCAN_UINT16
%token SCAN_UINT32
%token SCAN_URL
%token SCAN_WORD
/* For errorbody */
%token SCAN_PTYPE
%token SCAN_PROG
%start start
%%
start:
SCAN_DATASET datasetbody
| SCAN_DATASET datasetbody SCAN_DATA
| SCAN_ATTR dassetup attributebody
| SCAN_ERROR errorbody
| error
{$$=unrecognizedresponse(parsestate);}
;
datasetbody:
'{' declarations '}' datasetname ';'
{datasetbody(parsestate,$4,$2);}
;
declarations:
/* empty */ {$$=declarations(parsestate,null,null);}
| declarations declaration {$$=declarations(parsestate,$1,$2);}
;
/* 01/21/08: James says: no dimensions for grids or sequences */
/* 05/08/09: James says: no duplicate map names */
declaration:
base_type var_name array_decls ';'
{$$=makebase(parsestate,$2,$1,$3);}
| SCAN_STRUCTURE '{' declarations '}' var_name array_decls ';'
{if(($$ = makestructure(parsestate,$5,$6,$3))==null) {YYABORT;}}
| SCAN_SEQUENCE '{' declarations '}' var_name ';'
{if(($$ = makesequence(parsestate,$5,$3))==null) {YYABORT;}}
| SCAN_GRID '{' SCAN_ARRAY ':' declaration SCAN_MAPS ':'
declarations '}' var_name ';'
{if(($$ = makegrid(parsestate,$10,$5,$8))==null) {YYABORT;}}
| error
{daperror(parsestate,"Unrecognized type"); YYABORT;}
;
base_type:
SCAN_BYTE {$$=(Object)SCAN_BYTE;}
| SCAN_INT16 {$$=(Object)SCAN_INT16;}
| SCAN_UINT16 {$$=(Object)SCAN_UINT16;}
| SCAN_INT32 {$$=(Object)SCAN_INT32;}
| SCAN_UINT32 {$$=(Object)SCAN_UINT32;}
| SCAN_FLOAT32 {$$=(Object)SCAN_FLOAT32;}
| SCAN_FLOAT64 {$$=(Object)SCAN_FLOAT64;}
| SCAN_URL {$$=(Object)SCAN_URL;}
| SCAN_STRING {$$=(Object)SCAN_STRING;}
;
array_decls:
/* empty */ {$$=arraydecls(parsestate,null,null);}
| array_decls array_decl {$$=arraydecls(parsestate,$1,$2);}
;
array_decl:
'[' SCAN_WORD ']' {$$=arraydecl(parsestate,null,$2);}
| '[' name '=' SCAN_WORD ']' {$$=arraydecl(parsestate,$2,$4);}
| error
{daperror(parsestate,"Illegal dimension declaration"); YYABORT;}
;
datasetname:
var_name {$$=$1;}
| error
{daperror(parsestate,"Illegal dataset declaration"); YYABORT;}
;
var_name: name {$$=$1;};
dassetup: {dassetup(parsestate);}
attributebody:
'{' attr_list '}' {attributebody(parsestate,$2);}
| error
{daperror(parsestate,"Illegal DAS body"); YYABORT;}
;
attr_list:
/* empty */ {$$=attrlist(parsestate,null,null);}
| attr_list attribute {$$=attrlist(parsestate,$1,$2);}
;
attribute:
alias ';' {$$=null;} /* ignored */
| SCAN_BYTE name bytes ';'
{$$=attribute(parsestate,$2,$3,(Object)SCAN_BYTE);}
| SCAN_INT16 name int16 ';'
{$$=attribute(parsestate,$2,$3,(Object)SCAN_INT16);}
| SCAN_UINT16 name uint16 ';'
{$$=attribute(parsestate,$2,$3,(Object)SCAN_UINT16);}
| SCAN_INT32 name int32 ';'
{$$=attribute(parsestate,$2,$3,(Object)SCAN_INT32);}
| SCAN_UINT32 name uint32 ';'
{$$=attribute(parsestate,$2,$3,(Object)SCAN_UINT32);}
| SCAN_FLOAT32 name float32 ';'
{$$=attribute(parsestate,$2,$3,(Object)SCAN_FLOAT32);}
| SCAN_FLOAT64 name float64 ';'
{$$=attribute(parsestate,$2,$3,(Object)SCAN_FLOAT64);}
| SCAN_STRING name strs ';'
{$$=attribute(parsestate,$2,$3,(Object)SCAN_STRING);}
| SCAN_URL name urls ';'
{$$=attribute(parsestate,$2,$3,(Object)SCAN_URL);}
| name '{' attr_list '}' {$$=attrset(parsestate,$1,$3);}
| error
{daperror(parsestate,"Illegal attribute"); YYABORT;}
;
bytes:
SCAN_WORD {$$=attrvalue(parsestate,null,$1,(Object)SCAN_BYTE);}
| bytes ',' SCAN_WORD
{$$=attrvalue(parsestate,$1,$3,(Object)SCAN_BYTE);}
;
int16:
SCAN_WORD {$$=attrvalue(parsestate,null,$1,(Object)SCAN_INT16);}
| int16 ',' SCAN_WORD
{$$=attrvalue(parsestate,$1,$3,(Object)SCAN_INT16);}
;
uint16:
SCAN_WORD {$$=attrvalue(parsestate,null,$1,(Object)SCAN_UINT16);}
| uint16 ',' SCAN_WORD
{$$=attrvalue(parsestate,$1,$3,(Object)SCAN_UINT16);}
;
int32:
SCAN_WORD {$$=attrvalue(parsestate,null,$1,(Object)SCAN_INT32);}
| int32 ',' SCAN_WORD
{$$=attrvalue(parsestate,$1,$3,(Object)SCAN_INT32);}
;
uint32:
SCAN_WORD {$$=attrvalue(parsestate,null,$1,(Object)SCAN_UINT32);}
| uint32 ',' SCAN_WORD {$$=attrvalue(parsestate,$1,$3,(Object)SCAN_UINT32);}
;
float32:
SCAN_WORD {$$=attrvalue(parsestate,null,$1,(Object)SCAN_FLOAT32);}
| float32 ',' SCAN_WORD {$$=attrvalue(parsestate,$1,$3,(Object)SCAN_FLOAT32);}
;
float64:
SCAN_WORD {$$=attrvalue(parsestate,null,$1,(Object)SCAN_FLOAT64);}
| float64 ',' SCAN_WORD {$$=attrvalue(parsestate,$1,$3,(Object)SCAN_FLOAT64);}
;
strs:
str_or_id {$$=attrvalue(parsestate,null,$1,(Object)SCAN_STRING);}
| strs ',' str_or_id {$$=attrvalue(parsestate,$1,$3,(Object)SCAN_STRING);}
;
urls:
url {$$=attrvalue(parsestate,null,$1,(Object)SCAN_URL);}
| urls ',' url {$$=attrvalue(parsestate,$1,$3,(Object)SCAN_URL);}
;
url:
SCAN_WORD {$$=$1;}
;
str_or_id:
SCAN_WORD {$$=$1;}
;
/* Not used
float_or_int:
SCAN_WORD {$$=$1;}
;
*/
alias:
SCAN_ALIAS SCAN_WORD SCAN_WORD {$$=$2; $$=$3; $$=null;} /* Alias is ignored */
;
errorbody:
'{' errorcode errormsg errorptype errorprog '}' ';'
{$$=errorbody(parsestate,$2,$3,$4,$5);}
;
errorcode: /*empty*/ {$$=null;} | SCAN_CODE '=' SCAN_WORD ';' {$$=$3;}
errormsg: /*empty*/ {$$=null;} | SCAN_MESSAGE '=' SCAN_WORD ';' {$$=$3;}
errorptype: /*empty*/ {$$=null;} | SCAN_PTYPE '=' SCAN_WORD ';' {$$=$3;}
errorprog : /*empty*/ {$$=null;} | SCAN_PROG '=' SCAN_WORD ';' {$$=$3;}
/* Note that variable names like "byte" are legal names
and are disambiguated by context
*/
name:
SCAN_WORD {$$=$1;}
| SCAN_ALIAS {$$=strdup("alias");}
| SCAN_ARRAY {$$=strdup("array");}
| SCAN_ATTR {$$=strdup("attributes");}
| SCAN_BYTE {$$=strdup("byte");}
| SCAN_DATASET {$$=strdup("dataset");}
| SCAN_DATA {$$=strdup("data");}
| SCAN_ERROR {$$=strdup("error");}
| SCAN_FLOAT32 {$$=strdup("float32");}
| SCAN_FLOAT64 {$$=strdup("float64");}
| SCAN_GRID {$$=strdup("grid");}
| SCAN_INT16 {$$=strdup("int16");}
| SCAN_INT32 {$$=strdup("int32");}
| SCAN_MAPS {$$=strdup("maps");}
| SCAN_SEQUENCE {$$=strdup("sequence");}
| SCAN_STRING {$$=strdup("string");}
| SCAN_STRUCTURE {$$=strdup("structure");}
| SCAN_UINT16 {$$=strdup("uint16");}
| SCAN_UINT32 {$$=strdup("uint32");}
| SCAN_URL {$$=strdup("url");}
| SCAN_CODE {$$=strdup("code");}
| SCAN_MESSAGE {$$=strdup("message");}
;
%%