1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
|
/*
-*- mode: c++; c-basic-offset:4 -*-
This file is part of libdap, A C++ implementation of the OPeNDAP Data
Access Protocol.
Copyright (c) 2002,2003 OPeNDAP, Inc.
Author: James Gallagher <jgallagher@opendap.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
(c) COPYRIGHT URI/MIT 1994-1999
*/
/*
Scanner for the DDS. This file works with gnu's flex scanner generator. It
returns either DATASET, INDEPENDENT, DEPENDENT, ARRAY, MAPS, LIST,
SEQUENCE, STRUCTURE, FUNCTION, GRID, BYTE, INT32, FLOAT64, STRING, URL, ID
or one of the single character tokens `{', `}', `;', `=' or `\n' as
integers. In the case of an ID, the scanner stores a pointer to the lexeme
in yylval (whose type is char *).
The scanner discards all comment text.
The scanner is not reentrant, but can share name spaces with other
scanners.
Note:
1) The `defines' file dds.tab.h is built using `bison -d'.
2) Define YY_DECL such that the scanner is called `ddslex'.
3) When bison builds the dds.tab.h file, it uses `dds' instead of `yy' for
variable name prefixes (e.g., yylval --> ddslval).
jhrg 8/29/94
*/
%{
#include "config_dap.h"
#include <cstdio>
#include <cstring>
#include "parser.h"
#include "dds.tab.hh"
#include "escaping.h"
using namespace libdap ;
#ifndef YY_PROTO
#define YY_PROTO(proto) proto
#endif
#define YY_DECL int ddslex YY_PROTO(( void ))
#define YY_INPUT(buf,result,max_size) { \
if (fgets((buf), (max_size), (ddsin)) == NULL) { \
*buf = '\0'; \
} \
result = (feof(ddsin) || *buf == '\0' || strncmp(buf, "Data:\n", 6) == 0) \
? YY_NULL : strlen(buf); \
}
#define YY_FATAL_ERROR(msg) {\
throw(Error(string("Error scanning DDS object text: ") + string(msg))); \
yy_fatal_error(msg); /* see das.lex */ \
}
int dds_line_num = 1;
static void store_word();
%}
%option noyywrap
%option nounput
%option noinput
%option 8bit
%option prefix="dds"
%option outfile="lex.dds.cc"
%x comment
DATASET DATASET|Dataset|dataset
LIST LIST|List|list
SEQUENCE SEQUENCE|Sequence|sequence
STRUCTURE STRUCTURE|Structure|structure
GRID GRID|Grid|grid
BYTE BYTE|Byte|byte
INT16 INT16|Int16|int16
UINT16 UINT16|UInt16|uint16
INT32 INT32|Int32|int32
UINT32 UINT32|UInt32|uint32
FLOAT32 FLOAT32|Float32|float32
FLOAT64 FLOAT64|Float64|float64
STRING STRING|String|string
URL URL|Url|url
/* See das.lex for comments about the characters allowed in a WORD.
10/31/2001 jhrg */
WORD [-+a-zA-Z0-9_/%.\\*][-+a-zA-Z0-9_/%.\\#*]*
NEVER [^\-+a-zA-Z0-9_/%.\\#,(){}[\]]
%%
"{" return (int)*yytext;
"}" return (int)*yytext;
"[" return (int)*yytext;
"]" return (int)*yytext;
":" return (int)*yytext;
";" return (int)*yytext;
"=" return (int)*yytext;
{DATASET} store_word(); return SCAN_DATASET;
{LIST} store_word(); return SCAN_LIST;
{SEQUENCE} store_word(); return SCAN_SEQUENCE;
{STRUCTURE} store_word(); return SCAN_STRUCTURE;
{GRID} store_word(); return SCAN_GRID;
{BYTE} store_word(); return SCAN_BYTE;
{INT16} store_word(); return SCAN_INT16;
{UINT16} store_word(); return SCAN_UINT16;
{INT32} store_word(); return SCAN_INT32;
{UINT32} store_word(); return SCAN_UINT32;
{FLOAT32} store_word(); return SCAN_FLOAT32;
{FLOAT64} store_word(); return SCAN_FLOAT64;
{STRING} store_word(); return SCAN_STRING;
{URL} store_word(); return SCAN_URL;
{WORD} store_word(); return SCAN_WORD;
[ \t\r]+
\n ++dds_line_num;
<INITIAL><<EOF>> yy_init = 1; dds_line_num = 1; yyterminate();
"#" BEGIN(comment);
<comment>[^\n]*
<comment>\n ++dds_line_num; BEGIN(INITIAL);
<comment><<EOF>> yy_init = 1; dds_line_num = 1; yyterminate();
"Data:\n" yyterminate();
"Data:\r\n" yyterminate();
{NEVER} {
if (yytext) { /* suppress msgs about `' chars */
fprintf(stderr, "Character `%c' is not", *yytext);
fprintf(stderr, " allowed and has been ignored\n");
}
}
%%
// These three glue routines enable DDS to reclaim the memory used to parse a
// DDS off the wire. They are here because this file can see the YY_*
// symbols; the file DDS.cc cannot.
void *
dds_buffer(FILE *fp)
{
return (void *)dds_create_buffer(fp, YY_BUF_SIZE);
}
void
dds_switch_to_buffer(void *buf)
{
dds_switch_to_buffer((YY_BUFFER_STATE)buf);
}
void
dds_delete_buffer(void *buf)
{
dds_delete_buffer((YY_BUFFER_STATE)buf);
}
static void
store_word()
{
// dods2id(string(yytext)).c_str()
strncpy(ddslval.word, yytext, ID_MAX-1);
ddslval.word[ID_MAX-1] = '\0'; // for the paranoid...
}
|