|
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-1996,1998,1999
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/*
|
|
Packit |
a4aae4 |
Scanner for the Error object. It recognizes the five keywords in the
|
|
Packit |
a4aae4 |
persistent representation of the Error object plus some syntactic sugar
|
|
Packit |
a4aae4 |
(`=', `{', ...). The object's persistent representation uses a keyword =
|
|
Packit |
a4aae4 |
value notation, where the values are quoted strings or integers.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
The scanner is not reentrant, but can share name spaces with other
|
|
Packit |
a4aae4 |
scanners. It must be processed by GNU's flex scanner generator.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
%{
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "config_dap.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
static char rcsid[] not_used = {"$Id$"};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <cstdlib>
|
|
Packit |
a4aae4 |
#include <cassert>
|
|
Packit |
a4aae4 |
#include <cstring>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <string>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "parser.h"
|
|
Packit |
a4aae4 |
#include "Error.tab.hh"
|
|
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 |
//#define YY_NO_UNPUT
|
|
Packit |
a4aae4 |
#define YY_DECL int Errorlex YY_PROTO(( void ))
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#define YY_FATAL_ERROR(msg) {\
|
|
Packit |
a4aae4 |
throw(Error(string("Error scanning the error response: ") + string(msg))); \
|
|
Packit |
a4aae4 |
yy_fatal_error(msg); /* see das.lex */ \
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int error_line_num = 1;
|
|
Packit |
a4aae4 |
static int start_line; /* used in quote and comment error handlers */
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void store_integer();
|
|
Packit |
a4aae4 |
void store_string();
|
|
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="Error"
|
|
Packit |
a4aae4 |
%option outfile="lex.Error.cc"
|
|
Packit |
a4aae4 |
%x quote
|
|
Packit |
a4aae4 |
%x comment
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
SCAN_INT [0-9]+
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
SCAN_ERROR error|Error|ERROR
|
|
Packit |
a4aae4 |
SCAN_CODE code|Code|CODE
|
|
Packit |
a4aae4 |
SCAN_MSG message|Message|MESSAGE
|
|
Packit |
a4aae4 |
SCAN_PTYPE program_type|ProgramType|PROGRAM_TYPE|Program_Type
|
|
Packit |
a4aae4 |
SCAN_PROGRAM program|Program|PROGRAM
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
NEVER [^a-zA-Z0-9_/.+\-{}:;,]
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
%%
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
{SCAN_ERROR} store_string(); return SCAN_ERROR;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
{SCAN_CODE} store_string(); return SCAN_CODE;
|
|
Packit |
a4aae4 |
{SCAN_MSG} store_string(); return SCAN_MSG;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
{SCAN_INT} store_integer(); return SCAN_INT;
|
|
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]+
|
|
Packit |
a4aae4 |
\n ++error_line_num;
|
|
Packit |
a4aae4 |
<INITIAL><<EOF>> yy_init = 1; error_line_num = 1; yyterminate();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
"#" BEGIN(comment);
|
|
Packit |
a4aae4 |
<comment>[^\n]*
|
|
Packit |
a4aae4 |
<comment>\n ++error_line_num; BEGIN(INITIAL);
|
|
Packit |
a4aae4 |
<comment><<EOF>> yy_init = 1; error_line_num = 1; yyterminate();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
\" BEGIN(quote); start_line = error_line_num; yymore();
|
|
Packit |
a4aae4 |
<quote>[^"\n\\]* yymore();
|
|
Packit |
a4aae4 |
<quote>[^"\n\\]*\n yymore(); ++error_line_num;
|
|
Packit |
a4aae4 |
<quote>\\. yymore();
|
|
Packit |
a4aae4 |
<quote>\" {
|
|
Packit |
a4aae4 |
BEGIN(INITIAL);
|
|
Packit |
a4aae4 |
store_string();
|
|
Packit |
a4aae4 |
return SCAN_STR;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
<quote><<EOF>> {
|
|
Packit |
a4aae4 |
char msg[256];
|
|
Packit |
a4aae4 |
snprintf(msg, 255,
|
|
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) { /* suppress msgs about `' chars */
|
|
Packit |
a4aae4 |
fprintf(stderr, "Character `%c' is not", *yytext);
|
|
Packit |
a4aae4 |
fprintf(stderr, " allowed (except within");
|
|
Packit |
a4aae4 |
fprintf(stderr, " quotes) and has been ignored\n");
|
|
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 |
Error_buffer(FILE *fp)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
return (void *)Error_create_buffer(fp, YY_BUF_SIZE);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
Error_switch_to_buffer(void *buf)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
Error_switch_to_buffer((YY_BUFFER_STATE)buf);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
Error_delete_buffer(void *buf)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
Error_delete_buffer((YY_BUFFER_STATE)buf);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
store_integer()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
Errorlval.integer = atoi(yytext);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
store_string()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
Errorlval.string = yytext;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|