Blame das.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-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