Blame Error.lex

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