diff options
Diffstat (limited to 'fitsy++/parser.Y')
-rw-r--r-- | fitsy++/parser.Y | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/fitsy++/parser.Y b/fitsy++/parser.Y new file mode 100644 index 0000000..b588ee5 --- /dev/null +++ b/fitsy++/parser.Y @@ -0,0 +1,292 @@ +// Copyright (C) 1999-2018 +// Smithsonian Astrophysical Observatory, Cambridge, MA, USA +// For conditions of distribution and use, see copyright notice in "copyright" + +%pure-parser +%parse-param {FitsFile* ff} +%lex-param {ffFlexLexer* ll} +%parse-param {ffFlexLexer* ll} + +%{ +#define YYDEBUG 1 + +#define GOTOFILT(x) {yyclearin; ffFilter(x);} +#define GOTOARR(x) {yyclearin; ffArray(x);} + +#include "file.h" +#include "hpx.h" + +#undef yyFlexLexer +#define yyFlexLexer ffFlexLexer +#include <FlexLexer.h> + +extern int fflex(void*, ffFlexLexer*); +extern void fferror(FitsFile*, ffFlexLexer*, const char*); + +char ff_filter[512]; +extern void ffFilter(int); +extern void ffArray(int); + +%} + +%union { + float real; + int integer; + char str[256]; + void* ptr; +} + +%type <integer> endian + +%token <integer> INT +%token <str> STRING + +%token ARCH_ +%token ARRAY_ +%token BIG_ +%token BIGENDIAN_ +%token BIN_ +%token BINKEY_ +%token BINCOL_ +%token BITPIX_ +%token COL_ +%token DIM_ +%token DIMS_ +%token ECLIPTIC_ +%token ENDIAN_ +%token EQUATORIAL_ +%token GALACTIC_ +%token KEY_ +%token LAYOUT_ +%token LITTLE_ +%token LITTLEENDIAN_ +%token NESTED_ +%token NORTH_ +%token ORDER_ +%token QUAD_ +%token RING_ +%token SKIP_ +%token SOUTH_ +%token SYSTEM_ +%token UNKNOWN_ +%token XDIM_ +%token YDIM_ +%token ZDIM_ + +%% + + //start: {yydebug=1;} command + +// assume any error is the start of a filter +command : filename + | filename ext + | filename ext sect + | filename sect + | filename '[' extb sectb ']' + + | filename ext bin + | filename ext bin sect + | filename ext sect bin + | filename bin + | filename bin sect + | filename sect bin + | filename '[' extb binb ']' + + | filename ext hpxs + | filename ext hpxs sect + | filename ext sect hpxs + | filename hpxs + | filename hpxs sect + | filename sect hpxs + | filename '[' extb hpxs ']' + + | filename arrs + | filename arrs sect + | filename sect arrs + | filename '[' ARRAY_ {GOTOARR(0)} '(' array ')' ']' + + | error {GOTOFILT(0)} STRING + {ff->setValid(1);ff->setpFilter(ff_filter);} + ; + +filename : /* empty */ + | STRING {ff->setpName($1);} + ; + +// we must do it this way so that a bare filter will be accepted +//ext : '[' extb ']' +// ; +//extb : STRING {ff->setpExt($1);} +// | INT {ff->setpIndex($1);} +// ; + +ext : '[' STRING ']' {ff->setpExt($2);} + | '[' INT ']' {ff->setpIndex($2);} + ; + +extb : STRING ',' {ff->setpExt($1);} + | INT ',' {ff->setpIndex($1);} + ; + +sect : '[' sectb physical ']' + +sectb : rangex ',' rangey + | rangex ',' rangey ',' block + | rangex ',' rangey ',' rangez + | rangex ',' rangey ',' block ',' rangez + | rangex ',' block + | rangexy + | rangexy ',' block + | rangexy ',' rangez + | rangexy ',' block ',' rangez + ; + +physical : /* empty */ {ff->setpcoord(0);} + | 'p' {ff->setpcoord(1);} + | 'P' {ff->setpcoord(1);} + ; + +rangex : INT ':' INT + { + // this is not a mistake + // need to fool parser into processing "xy0:xy1,block" + ff->setpxmin($1); ff->setpxmax($3); ff->setpxvalid(1); + ff->setpymin($1); ff->setpymax($3); ff->setpyvalid(1); + } + | INT '@' INT + {ff->setpxmin($3-$1/2); ff->setpxmax($3+$1/2); ff->setpxvalid(1);} + | '*' + { + // this is not a mistake + // need to fool parser into processing "*,block" + ff->setpxvalid(0); ff->setpyvalid(0); + } + ; + +rangey : INT ':' INT + {ff->setpymin($1); ff->setpymax($3); ff->setpyvalid(1);} + | INT '@' INT + {ff->setpymin($3-$1/2); ff->setpymax($3+$1/2); ff->setpyvalid(1);} + | '*' {ff->setpyvalid(0);} + ; + +rangexy : INT '@' INT '@' INT + { + ff->setpxmin($3-$1/2); ff->setpxmax($3+$1/2); ff->setpxvalid(1); + ff->setpymin($5-$1/2); ff->setpymax($5+$1/2); ff->setpyvalid(1); + } + ; + +rangez : INT ':' INT + {ff->setpzmin($1); ff->setpzmax($3); ff->setpzvalid(1);} + | INT '@' INT + {ff->setpzmin($3-$1/2); ff->setpzmax($3+$1/2); ff->setpzvalid(1);} + | '*' {ff->setpzvalid(0);} + ; + +block : INT {ff->setpblock($1); ff->setpbvalid(1);} + ; + +bin : '[' binb ']' + +binb : binword '=' binkey + | binword binkey + ; + +binword : BIN_ + | BINKEY_ + | BINCOL_ + | KEY_ + ; + +binkey : '(' STRING ',' STRING ')' {ff->setpBinXY($2,$4);} + | STRING ',' STRING {ff->setpBinXY($1,$3);} + | '(' STRING ',' STRING ',' STRING ')' {ff->setpBinXYZ($2,$4,$6);} + | STRING ',' STRING ',' STRING {ff->setpBinXYZ($1,$3,$5);} + | '(' STRING ')' {ff->setpBinZ($2);} + | STRING {ff->setpBinZ($1);} + ; + +arrs : '[' arrsb ']' + ; + +arrsb : arrsb ',' arr + | arr + ; + +arr : XDIM_ '=' INT {ff->setpWidth($3);} + | YDIM_ '=' INT {ff->setpHeight($3);} + | ZDIM_ '=' INT {ff->setpDepth($3);} + | DIM_ '=' INT {ff->setpWidth($3);ff->setpHeight($3);} + | DIMS_ '=' INT {ff->setpWidth($3);ff->setpHeight($3);} + | BITPIX_ '=' INT {ff->setpBitpix($3);} + | SKIP_ '=' INT {ff->setpSkip($3);} + | ARCH_ '=' endian {ff->setpArch((FitsFile::ArchType)$3);} + | ENDIAN_ '=' endian {ff->setpArch((FitsFile::ArchType)$3);} + | endian {ff->setpArch((FitsFile::ArchType)$1);} + ; + +endian : BIG_ {$$ = FitsFile::BIG;} + | BIGENDIAN_ {$$ = FitsFile::BIG;} + | LITTLE_ {$$ = FitsFile::LITTLE;} + | LITTLEENDIAN_ {$$ = FitsFile::LITTLE;} + ; + +array : atype adims askip aendian + ; + +atype : 'b' {ff->setpBitpix(8);} + | 's' {ff->setpBitpix(16);} + | 'u' {ff->setpBitpix(-16);} + | 'i' {ff->setpBitpix(32);} + | 'l' {ff->setpBitpix(64);} + | 'r' {ff->setpBitpix(-32);} + | 'f' {ff->setpBitpix(-32);} + | 'd' {ff->setpBitpix(-64);} + ; + +adims : INT {ff->setpWidth($1);ff->setpHeight($1);} + | INT '.' INT {ff->setpWidth($1);ff->setpHeight($3);} + | INT '.' INT '.' INT + {ff->setpWidth($1);ff->setpHeight($3);ff->setpDepth($5);} + ; + +askip : /* empty */ + | ':' INT {ff->setpSkip($2);} + ; + +aendian : /* empty */ + | 'l' {ff->setpArch(FitsFile::LITTLE);} + | 'b' {ff->setpArch(FitsFile::BIG);} + ; + +hpxs : '[' hpxsb ']' + ; + +hpxsb : hpxsb ',' hpx + | hpx + ; + +hpx : SYSTEM_ '=' hpxSystem + | ORDER_ '=' hpxOrder + | LAYOUT_ '=' hpxLayout + | COL_ '=' INT {ff->setpHPXColumn($3);} + | QUAD_ '=' INT {ff->setpHPXQuad($3);} + ; + +hpxSystem : EQUATORIAL_ {ff->setpHPXSystem(FitsHPX::EQU);} + | GALACTIC_ {ff->setpHPXSystem(FitsHPX::GAL);} + | ECLIPTIC_ {ff->setpHPXSystem(FitsHPX::ECL);} + | UNKNOWN_ {ff->setpHPXSystem(FitsHPX::UNKNOWN);} + ; + +hpxOrder : RING_ {ff->setpHPXOrder(FitsHPX::RING);} + | NESTED_ {ff->setpHPXOrder(FitsHPX::NESTED);} + ; + +hpxLayout : EQUATORIAL_ {ff->setpHPXLayout(FitsHPX::EQUATOR);} + | NORTH_ {ff->setpHPXLayout(FitsHPX::NORTH);} + | SOUTH_ {ff->setpHPXLayout(FitsHPX::SOUTH);} + ; + +%% |