/* $Id$ */ /* * FedStage DRMAA utilities library * Copyright (C) 2006-2008 FedStage Systems * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ %{ #ifdef HAVE_CONFIG_H # include #endif #include %} /* those are Bison extensions */ %glr-parser %pure-parser %name-prefix="fsd_dt_" %parse-param { fsd_dt_parser_t *parser } %parse-param { fsd_dt_lexer_t *lexer } %lex-param { fsd_dt_lexer_t *lexer } %union { fsd_datetime_t datetime; int integer; } %type datetime date time timezone %type sign %token NUM %token LEXER_ERROR %% start : datetime { parser->result = $1; } ; datetime : time timezone { $$.mask = $1.mask | $2.mask; $$.year = 0; $$.month = 0; $$.day = 0; $$.hour = $1.hour; $$.minute = $1.minute; $$.second = $1.second; $$.tz_delta = $2.tz_delta; } | date opt_sep time timezone { $$.mask = $1.mask | $3.mask | $4.mask; $$.year = $1.year; $$.month = $1.month; $$.day = $1.day; $$.hour = $3.hour; $$.minute = $3.minute; $$.second = $3.second; $$.tz_delta = $4.tz_delta; } ; opt_sep : | 'T' ; date : NUM '-' NUM '-' NUM { $$.year=$1; $$.month=$3; $$.day=$5; $$.mask=FSD_DT_YEAR|FSD_DT_MONTH|FSD_DT_DAY; } | NUM '-' NUM { $$.year=0; $$.month=$1; $$.day=$3; $$.mask=FSD_DT_MONTH|FSD_DT_DAY; } | NUM '/' NUM '/' NUM { $$.year=$1; $$.month=$3; $$.day=$5; $$.mask=FSD_DT_YEAR|FSD_DT_MONTH|FSD_DT_DAY; } | NUM '/' NUM { $$.year=0; $$.month=$1; $$.day=$3; $$.mask=FSD_DT_MONTH|FSD_DT_DAY; } | NUM { $$.year=0; $$.month=0; $$.day=$1; $$.mask=FSD_DT_DAY; } ; time : NUM ':' NUM { $$.hour=$1; $$.minute=$3; $$.second=0; $$.mask=FSD_DT_HOUR|FSD_DT_MINUTE; } | NUM ':' NUM ':' NUM { $$.hour=$1; $$.minute=$3; $$.second=$5; $$.mask=FSD_DT_HOUR|FSD_DT_MINUTE|FSD_DT_SECOND; } ; timezone : { $$.tz_delta=0; $$.mask=0; } | sign NUM { $$.tz_delta=$1*3600*$2; $$.mask=FSD_DT_TZ_DELTA; } | sign NUM ':' NUM { $$.tz_delta=$1*60*(60*$2+$4); $$.mask=FSD_DT_TZ_DELTA; } | 'Z' { $$.tz_delta=0; $$.mask=FSD_DT_TZ_DELTA; } ; sign : { $$ = +1; } | '+' { $$ = +1; } | '-' { $$ = -1; } ;