|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/*
|
|
Packit |
a4aae4 |
-*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Copyright (c) 2002,2003 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
(c) COPYRIGHT URI/MIT 1994-2000
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/*
|
|
Packit |
a4aae4 |
Scanner for the DAS. This file works with gnu's flex scanner generator. It
|
|
Packit |
a4aae4 |
returns either ATTR, ID, VAL, TYPE or one of the single character tokens
|
|
Packit |
a4aae4 |
`{', `}', `;', `,' or `\n' as integers. In the case of an ID or VAL, the
|
|
Packit |
a4aae4 |
scanner stores a pointer to the lexeme in yylval (whose type is char *).
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
The scanner discards all comment text.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
The scanner returns quoted strings as VALs. Any characters may appear in a
|
|
Packit |
a4aae4 |
quoted string except backslash (\) and quote("). To include these escape
|
|
Packit |
a4aae4 |
them with a backslash.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
The scanner is not reentrant, but can share name spaces with other
|
|
Packit |
a4aae4 |
scanners.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
Note:
|
|
Packit |
a4aae4 |
1) The `defines' file das.tab.h is built using `bison -d'.
|
|
Packit |
a4aae4 |
2) Define YY_DECL such that the scanner is called `daslex'.
|
|
Packit |
a4aae4 |
3) When bison builds the das.tab.h file, it uses `das' instead of `yy' for
|
|
Packit |
a4aae4 |
variable name prefixes (e.g., yylval --> daslval).
|
|
Packit |
a4aae4 |
4) The quote stuff is very complicated because we want backslash (\)
|
|
Packit |
a4aae4 |
escapes to work and because we want line counts to work too. In order to
|
|
Packit |
a4aae4 |
properly scan a quoted string two C functions are used: one to remove the
|
|
Packit |
a4aae4 |
escape characters from escape sequences and one to remove the trailing
|
|
Packit |
a4aae4 |
quote on the end of the string.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
jhrg 7/12/94
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
NB: We don't remove the \'s or ending quotes any more -- that way the
|
|
Packit |
a4aae4 |
printed das can be re-parsed. 9/28/94.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
%{
|
|
Packit |
a4aae4 |
#include "config_dap.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <cstdio>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
static char rcsid[] not_used ={"$Id$"};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef _MSC_VER
|
|
Packit |
a4aae4 |
#include <string.h>
|
|
Packit |
a4aae4 |
#else
|
|
Packit |
a4aae4 |
#include <string>
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using namespace std;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "debug.h"
|
|
Packit |
a4aae4 |
#include "parser.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using namespace libdap ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#ifndef YY_PROTO
|
|
Packit |
a4aae4 |
#define YY_PROTO(proto) proto
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/* These defines must precede the das.tab.h include. */
|
|
Packit |
a4aae4 |
#define YYSTYPE char *
|
|
Packit |
a4aae4 |
#define YY_DECL int daslex YY_PROTO(( void ))
|
|
Packit |
a4aae4 |
#define YY_FATAL_ERROR(msg) {\
|
|
Packit |
a4aae4 |
throw(Error(string("Error scanning DAS object text: ") + string(msg))); \
|
|
Packit |
a4aae4 |
yy_fatal_error(msg); /* This will never be run but putting it here removes a warning that the function is never used. */ \
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "das.tab.hh"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int das_line_num = 1;
|
|
Packit |
a4aae4 |
static int start_line; /* used in quote and comment error handlers */
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
%}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
%option noyywrap
|
|
Packit |
a4aae4 |
%option nounput
|
|
Packit |
a4aae4 |
%option noinput
|
|
Packit |
a4aae4 |
%option 8bit
|
|
Packit |
a4aae4 |
%option prefix="das"
|
|
Packit |
a4aae4 |
%option outfile="lex.das.cc"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
%x quote
|
|
Packit |
a4aae4 |
%x comment
|
|
Packit |
a4aae4 |
%x xml
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
ATTR attributes|Attributes|ATTRIBUTES
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
ALIAS ALIAS|Alias|alias
|
|
Packit |
a4aae4 |
BYTE BYTE|Byte|byte
|
|
Packit |
a4aae4 |
INT16 INT16|Int16|int16
|
|
Packit |
a4aae4 |
UINT16 UINT16|UInt16|Uint16|uint16
|
|
Packit |
a4aae4 |
INT32 INT32|Int32|int32
|
|
Packit |
a4aae4 |
UINT32 UINT32|UInt32|Uint32|uint32
|
|
Packit |
a4aae4 |
FLOAT32 FLOAT32|Float32|float32
|
|
Packit |
a4aae4 |
FLOAT64 FLOAT64|Float64|float64
|
|
Packit |
a4aae4 |
STRING STRING|String|string
|
|
Packit |
a4aae4 |
URL URL|Url|url
|
|
Packit |
a4aae4 |
XML OTHERXML|OtherXML|OtherXml|otherxml
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/* Comment chars (#) are treated specially. Lets hope nobody wants to start
|
|
Packit |
a4aae4 |
A variable name with one... Note that the DAS allows Identifiers to have
|
|
Packit |
a4aae4 |
parens and colons while the DDS and expr scanners don't. It's too hard to
|
|
Packit |
a4aae4 |
disambiguate functions when IDs have parens in them and adding colons
|
|
Packit |
a4aae4 |
makes parsing the array projections hard. 10/31/2001 jhrg */
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
WORD [-+a-zA-Z0-9_/%.:\\()*][-+a-zA-Z0-9_/%.:\\()#*]*
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
NEVER [^\-+a-zA-Z0-9_/%.:\\()#{};,[\]]
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
%%
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
{ATTR} daslval = yytext; return SCAN_ATTR;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
{ALIAS} daslval = yytext; return SCAN_ALIAS;
|
|
Packit |
a4aae4 |
{BYTE} daslval = yytext; return SCAN_BYTE;
|
|
Packit |
a4aae4 |
{INT16} daslval = yytext; return SCAN_INT16;
|
|
Packit |
a4aae4 |
{UINT16} daslval = yytext; return SCAN_UINT16;
|
|
Packit |
a4aae4 |
{INT32} daslval = yytext; return SCAN_INT32;
|
|
Packit |
a4aae4 |
{UINT32} daslval = yytext; return SCAN_UINT32;
|
|
Packit |
a4aae4 |
{FLOAT32} daslval = yytext; return SCAN_FLOAT32;
|
|
Packit |
a4aae4 |
{FLOAT64} daslval = yytext; return SCAN_FLOAT64;
|
|
Packit |
a4aae4 |
{STRING} daslval = yytext; return SCAN_STRING;
|
|
Packit |
a4aae4 |
{URL} daslval = yytext; return SCAN_URL;
|
|
Packit |
a4aae4 |
{XML} daslval = yytext; return SCAN_XML;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
{WORD} {
|
|
Packit |
a4aae4 |
daslval = yytext;
|
|
Packit |
a4aae4 |
DBG(cerr << "WORD: " << yytext << endl);
|
|
Packit |
a4aae4 |
return SCAN_WORD;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
"{" return (int)*yytext;
|
|
Packit |
a4aae4 |
"}" return (int)*yytext;
|
|
Packit |
a4aae4 |
";" return (int)*yytext;
|
|
Packit |
a4aae4 |
"," return (int)*yytext;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
[ \t\r]+
|
|
Packit |
a4aae4 |
\n ++das_line_num;
|
|
Packit |
a4aae4 |
<INITIAL><<EOF>> yy_init = 1; das_line_num = 1; yyterminate();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
"#" BEGIN(comment);
|
|
Packit |
a4aae4 |
<comment>[^\r\n]*
|
|
Packit |
a4aae4 |
<comment>\n ++das_line_num; BEGIN(INITIAL);
|
|
Packit |
a4aae4 |
<comment>\r\n ++das_line_num; BEGIN(INITIAL);
|
|
Packit |
a4aae4 |
<comment><<EOF>> yy_init = 1; das_line_num = 1; yyterminate();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
\" BEGIN(quote); start_line = das_line_num; yymore();
|
|
Packit |
a4aae4 |
<quote>[^"\r\n\\]* yymore();
|
|
Packit |
a4aae4 |
<quote>[^"\r\n\\]*\n yymore(); ++das_line_num;
|
|
Packit |
a4aae4 |
<quote>[^"\r\n\\]*\r\n yymore(); ++das_line_num;
|
|
Packit |
a4aae4 |
<quote>\\. yymore();
|
|
Packit |
a4aae4 |
<quote>\" {
|
|
Packit |
a4aae4 |
BEGIN(INITIAL);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
daslval = yytext;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return SCAN_WORD;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
<quote><<EOF>> {
|
|
Packit |
a4aae4 |
char msg[256];
|
|
Packit |
a4aae4 |
sprintf(msg,
|
|
Packit |
a4aae4 |
"Unterminated quote (starts on line %d)\n",
|
|
Packit |
a4aae4 |
start_line);
|
|
Packit |
a4aae4 |
YY_FATAL_ERROR(msg);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
{NEVER} {
|
|
Packit |
a4aae4 |
if (yytext) {
|
|
Packit |
a4aae4 |
fprintf(stderr, "Character '%c' (%d) is not",
|
|
Packit |
a4aae4 |
*yytext, *yytext);
|
|
Packit |
a4aae4 |
fprintf(stderr, " allowed.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
%%
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// These three glue routines enable DDS to reclaim the memory used to parse a
|
|
Packit |
a4aae4 |
// DDS off the wire. They are here because this file can see the YY_*
|
|
Packit |
a4aae4 |
// symbols; the file DDS.cc cannot.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void *
|
|
Packit |
a4aae4 |
das_buffer(FILE *fp)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
return (void *)das_create_buffer(fp, YY_BUF_SIZE);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
das_switch_to_buffer(void *buf)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
das_switch_to_buffer((YY_BUFFER_STATE)buf);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
das_delete_buffer(void *buf)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
das_delete_buffer((YY_BUFFER_STATE)buf);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|