summaryrefslogtreecommitdiff
path: root/tests/glean/lex.h
blob: 87e24dfc627c918c617c65281716280ce55c5b97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// BEGIN_COPYRIGHT
// 
// Copyright (C) 1999  Allen Akin   All Rights Reserved.
// 
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the
// Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL ALLEN AKIN BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// 
// END_COPYRIGHT




// lex.h:  Simple lexical analysis utilities

// Given a string containing C-style tokens, returns information about
// successive tokens.  Doesn't support all C tokens; just the few that
// GLEAN needs.


#ifndef __lex_h__
#define __lex_h__

#include <string>

#ifdef __WIN__
// ERROR is already defined in some windows header file
#undef ERROR
#endif

namespace GLEAN {

class Lex {
    protected:

	// State information:
	const char* input;
	const char* p;
	bool ignoringCase;

    public:

    	// Constructors:

	Lex(const char* s, bool ignoreCase = false);
		// Creates a lexer which will draw input from the given string.

	// Exceptions:

	struct Error { };			// Base class for errors.
	struct Lexical: public Error {		// Lexical error in string.
		const char* err;
		int position;
		Lexical(const char* e, int p) {
			err = e;
			position = p;
		}
	};
	struct InternalError: public Error {	// Shouldn't happen.
	};

	// Tokens:

	typedef enum {
		ERROR = 0,	// erroneous token; must be zero
		END,		// end of input

		AND,		// &
		AND_AND,	// &&
		ASSIGN,		// =
		BANG,		// !
		COMMA,		// ,
		DOT,		// .
		EQ,		// ==
		GE,		// >=
		GT,		// >
		LE,		// <=
		LPAREN,		// (
		LT,		// <
		MINUS,		// -
		NE,		// !=
		OR,		// |
		OR_OR,		// ||
		PERCENT,	// %
		PLUS,		// +
		RPAREN,		// )
		SLASH,		// /
		STAR,		// *

		ICONST,		// signed integer constant

		ID		// identifier
	} Token;

	// Utilities:

	void next();		// fetch next token

	Token token;		// current token
	std::string id;		// most recent identifier
	int iValue;		// most recent signed integer value

	inline int position() {	// current position in input string
		return p - input;
	}
}; // class Lex

} // namespace GLEAN

#endif // __lex_h__