xref: /openbsd-src/usr.bin/lex/FlexLexer.h (revision a58c1ecbfec1c53573f7a0223eb76603ee18f75c)
1*a58c1ecbStedu /*	$OpenBSD: FlexLexer.h,v 1.7 2015/11/19 19:43:40 tedu Exp $	*/
21258a77dSderaadt 
3*a58c1ecbStedu // $Header: /home/cvs/src/usr.bin/lex/FlexLexer.h,v 1.7 2015/11/19 19:43:40 tedu Exp $
4df930be7Sderaadt 
5*a58c1ecbStedu // -*-C++-*-
6df930be7Sderaadt // FlexLexer.h -- define interfaces for lexical analyzer classes generated
7df930be7Sderaadt // by flex
8df930be7Sderaadt 
9df930be7Sderaadt // Copyright (c) 1993 The Regents of the University of California.
10df930be7Sderaadt // All rights reserved.
11df930be7Sderaadt //
12df930be7Sderaadt // This code is derived from software contributed to Berkeley by
13df930be7Sderaadt // Kent Williams and Tom Epperly.
14df930be7Sderaadt //
153c895503Sderaadt //  Redistribution and use in source and binary forms, with or without
16174d0bf2Smillert //  modification, are permitted provided that the following conditions
17174d0bf2Smillert //  are met:
18*a58c1ecbStedu 
19174d0bf2Smillert //  1. Redistributions of source code must retain the above copyright
20174d0bf2Smillert //  notice, this list of conditions and the following disclaimer.
21174d0bf2Smillert //  2. Redistributions in binary form must reproduce the above copyright
22174d0bf2Smillert //  notice, this list of conditions and the following disclaimer in the
23174d0bf2Smillert //  documentation and/or other materials provided with the distribution.
24*a58c1ecbStedu 
25174d0bf2Smillert //  Neither the name of the University nor the names of its contributors
26174d0bf2Smillert //  may be used to endorse or promote products derived from this software
27174d0bf2Smillert //  without specific prior written permission.
28*a58c1ecbStedu 
29174d0bf2Smillert //  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
30174d0bf2Smillert //  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
31174d0bf2Smillert //  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
32174d0bf2Smillert //  PURPOSE.
33df930be7Sderaadt 
34df930be7Sderaadt // This file defines FlexLexer, an abstract class which specifies the
35df930be7Sderaadt // external interface provided to flex C++ lexer objects, and yyFlexLexer,
36df930be7Sderaadt // which defines a particular lexer class.
37df930be7Sderaadt //
38df930be7Sderaadt // If you want to create multiple lexer classes, you use the -P flag
39df930be7Sderaadt // to rename each yyFlexLexer to some other xxFlexLexer.  You then
40df930be7Sderaadt // include <FlexLexer.h> in your other sources once per lexer class:
41df930be7Sderaadt //
42df930be7Sderaadt //	#undef yyFlexLexer
43df930be7Sderaadt //	#define yyFlexLexer xxFlexLexer
44df930be7Sderaadt //	#include <FlexLexer.h>
45df930be7Sderaadt //
46df930be7Sderaadt //	#undef yyFlexLexer
47df930be7Sderaadt //	#define yyFlexLexer zzFlexLexer
48df930be7Sderaadt //	#include <FlexLexer.h>
49df930be7Sderaadt //	...
50df930be7Sderaadt 
51df930be7Sderaadt #ifndef __FLEX_LEXER_H
52df930be7Sderaadt // Never included before - need to define base class.
53df930be7Sderaadt #define __FLEX_LEXER_H
54df930be7Sderaadt 
55433f2b64Sespie #include <iostream>
56*a58c1ecbStedu #  ifndef FLEX_STD
57*a58c1ecbStedu #    define FLEX_STD std::
58*a58c1ecbStedu #  endif
59*a58c1ecbStedu 
60df930be7Sderaadt extern "C++" {
61*a58c1ecbStedu 
62df930be7Sderaadt struct yy_buffer_state;
63df930be7Sderaadt typedef int yy_state_type;
64df930be7Sderaadt 
65df930be7Sderaadt class FlexLexer {
66df930be7Sderaadt public:
~FlexLexer()67df930be7Sderaadt 	virtual ~FlexLexer()	{ }
68df930be7Sderaadt 
YYText()69*a58c1ecbStedu 	const char* YYText() const	{ return yytext; }
YYLeng()70*a58c1ecbStedu 	int YYLeng()	const	{ return yyleng; }
71df930be7Sderaadt 
72df930be7Sderaadt 	virtual void
73df930be7Sderaadt 		yy_switch_to_buffer( struct yy_buffer_state* new_buffer ) = 0;
74df930be7Sderaadt 	virtual struct yy_buffer_state*
75*a58c1ecbStedu 		yy_create_buffer( FLEX_STD istream* s, int size ) = 0;
76df930be7Sderaadt 	virtual void yy_delete_buffer( struct yy_buffer_state* b ) = 0;
77*a58c1ecbStedu 	virtual void yyrestart( FLEX_STD istream* s ) = 0;
78df930be7Sderaadt 
79df930be7Sderaadt 	virtual int yylex() = 0;
80df930be7Sderaadt 
81df930be7Sderaadt 	// Call yylex with new input/output sources.
82*a58c1ecbStedu 	int yylex( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 )
83df930be7Sderaadt 		{
84df930be7Sderaadt 		switch_streams( new_in, new_out );
85df930be7Sderaadt 		return yylex();
86df930be7Sderaadt 		}
87df930be7Sderaadt 
88df930be7Sderaadt 	// Switch to new input/output streams.  A nil stream pointer
89df930be7Sderaadt 	// indicates "keep the current one".
90*a58c1ecbStedu 	virtual void switch_streams( FLEX_STD istream* new_in = 0,
91*a58c1ecbStedu 					FLEX_STD ostream* new_out = 0 ) = 0;
92df930be7Sderaadt 
lineno()93df930be7Sderaadt 	int lineno() const		{ return yylineno; }
94df930be7Sderaadt 
debug()95df930be7Sderaadt 	int debug() const		{ return yy_flex_debug; }
set_debug(int flag)96df930be7Sderaadt 	void set_debug( int flag )	{ yy_flex_debug = flag; }
97df930be7Sderaadt 
98df930be7Sderaadt protected:
99df930be7Sderaadt 	char* yytext;
100df930be7Sderaadt 	int yyleng;
101df930be7Sderaadt 	int yylineno;		// only maintained if you use %option yylineno
102df930be7Sderaadt 	int yy_flex_debug;	// only has effect with -d or "%option debug"
103df930be7Sderaadt };
104df930be7Sderaadt 
105df930be7Sderaadt }
106*a58c1ecbStedu #endif // FLEXLEXER_H
107df930be7Sderaadt 
108df930be7Sderaadt #if defined(yyFlexLexer) || ! defined(yyFlexLexerOnce)
109df930be7Sderaadt // Either this is the first time through (yyFlexLexerOnce not defined),
110df930be7Sderaadt // or this is a repeated include to define a different flavor of
111*a58c1ecbStedu // yyFlexLexer, as discussed in the flex manual.
112df930be7Sderaadt #define yyFlexLexerOnce
113df930be7Sderaadt 
114*a58c1ecbStedu extern "C++" {
115*a58c1ecbStedu 
116df930be7Sderaadt class yyFlexLexer : public FlexLexer {
117df930be7Sderaadt public:
118df930be7Sderaadt 	// arg_yyin and arg_yyout default to the cin and cout, but we
119df930be7Sderaadt 	// only make that assignment when initializing in yylex().
120*a58c1ecbStedu 	yyFlexLexer( FLEX_STD istream* arg_yyin = 0, FLEX_STD ostream* arg_yyout = 0 );
121df930be7Sderaadt 
122df930be7Sderaadt 	virtual ~yyFlexLexer();
123df930be7Sderaadt 
124df930be7Sderaadt 	void yy_switch_to_buffer( struct yy_buffer_state* new_buffer );
125*a58c1ecbStedu 	struct yy_buffer_state* yy_create_buffer( FLEX_STD istream* s, int size );
126df930be7Sderaadt 	void yy_delete_buffer( struct yy_buffer_state* b );
127*a58c1ecbStedu 	void yyrestart( FLEX_STD istream* s );
128*a58c1ecbStedu 
129*a58c1ecbStedu 	void yypush_buffer_state( struct yy_buffer_state* new_buffer );
130*a58c1ecbStedu 	void yypop_buffer_state();
131df930be7Sderaadt 
132df930be7Sderaadt 	virtual int yylex();
133*a58c1ecbStedu 	virtual void switch_streams( FLEX_STD istream* new_in, FLEX_STD ostream* new_out = 0 );
134*a58c1ecbStedu 	virtual int yywrap();
135df930be7Sderaadt 
136df930be7Sderaadt protected:
137df930be7Sderaadt 	virtual int LexerInput( char* buf, int max_size );
138df930be7Sderaadt 	virtual void LexerOutput( const char* buf, int size );
139df930be7Sderaadt 	virtual void LexerError( const char* msg );
140df930be7Sderaadt 
141df930be7Sderaadt 	void yyunput( int c, char* buf_ptr );
142df930be7Sderaadt 	int yyinput();
143df930be7Sderaadt 
144df930be7Sderaadt 	void yy_load_buffer_state();
145*a58c1ecbStedu 	void yy_init_buffer( struct yy_buffer_state* b, FLEX_STD istream* s );
146df930be7Sderaadt 	void yy_flush_buffer( struct yy_buffer_state* b );
147df930be7Sderaadt 
148df930be7Sderaadt 	int yy_start_stack_ptr;
149df930be7Sderaadt 	int yy_start_stack_depth;
150df930be7Sderaadt 	int* yy_start_stack;
151df930be7Sderaadt 
152df930be7Sderaadt 	void yy_push_state( int new_state );
153df930be7Sderaadt 	void yy_pop_state();
154df930be7Sderaadt 	int yy_top_state();
155df930be7Sderaadt 
156df930be7Sderaadt 	yy_state_type yy_get_previous_state();
157df930be7Sderaadt 	yy_state_type yy_try_NUL_trans( yy_state_type current_state );
158df930be7Sderaadt 	int yy_get_next_buffer();
159df930be7Sderaadt 
160*a58c1ecbStedu 	FLEX_STD istream* yyin;	// input source for default LexerInput
161*a58c1ecbStedu 	FLEX_STD ostream* yyout;	// output sink for default LexerOutput
162df930be7Sderaadt 
163df930be7Sderaadt 	// yy_hold_char holds the character lost when yytext is formed.
164df930be7Sderaadt 	char yy_hold_char;
165df930be7Sderaadt 
166df930be7Sderaadt 	// Number of characters read into yy_ch_buf.
167df930be7Sderaadt 	int yy_n_chars;
168df930be7Sderaadt 
169df930be7Sderaadt 	// Points to current character in buffer.
170df930be7Sderaadt 	char* yy_c_buf_p;
171df930be7Sderaadt 
172df930be7Sderaadt 	int yy_init;		// whether we need to initialize
173df930be7Sderaadt 	int yy_start;		// start state number
174df930be7Sderaadt 
175df930be7Sderaadt 	// Flag which is used to allow yywrap()'s to do buffer switches
176df930be7Sderaadt 	// instead of setting up a fresh yyin.  A bit of a hack ...
177df930be7Sderaadt 	int yy_did_buffer_switch_on_eof;
178df930be7Sderaadt 
179*a58c1ecbStedu 
180*a58c1ecbStedu 	size_t yy_buffer_stack_top; /**< index of top of stack. */
181*a58c1ecbStedu 	size_t yy_buffer_stack_max; /**< capacity of stack. */
182*a58c1ecbStedu 	struct yy_buffer_state ** yy_buffer_stack; /**< Stack as an array. */
183*a58c1ecbStedu 	void yyensure_buffer_stack(void);
184*a58c1ecbStedu 
185df930be7Sderaadt 	// The following are not always needed, but may be depending
186df930be7Sderaadt 	// on use of certain flex features (like REJECT or yymore()).
187df930be7Sderaadt 
188df930be7Sderaadt 	yy_state_type yy_last_accepting_state;
189df930be7Sderaadt 	char* yy_last_accepting_cpos;
190df930be7Sderaadt 
191df930be7Sderaadt 	yy_state_type* yy_state_buf;
192df930be7Sderaadt 	yy_state_type* yy_state_ptr;
193df930be7Sderaadt 
194df930be7Sderaadt 	char* yy_full_match;
195df930be7Sderaadt 	int* yy_full_state;
196df930be7Sderaadt 	int yy_full_lp;
197df930be7Sderaadt 
198df930be7Sderaadt 	int yy_lp;
199df930be7Sderaadt 	int yy_looking_for_trail_begin;
200df930be7Sderaadt 
201df930be7Sderaadt 	int yy_more_flag;
202df930be7Sderaadt 	int yy_more_len;
203d7e04f83Smillert 	int yy_more_offset;
204d7e04f83Smillert 	int yy_prev_more_offset;
205df930be7Sderaadt };
206df930be7Sderaadt 
207*a58c1ecbStedu }
208*a58c1ecbStedu 
209*a58c1ecbStedu #endif // yyFlexLexer || ! yyFlexLexerOnce
210*a58c1ecbStedu 
211