1%{
2/***********************************************************************
3 *         libwsmake - Core functionality library of wsmake            *
4 *        Copyright (C) 1999,2000,2001,2002 Michael Brownlow           *
5 *                                                                     *
6 * This program is free software; you can redistribute it and/or modify*
7 * it under the terms of the GNU General Public License as published by*
8 * the Free Software Foundation; either version 2 of the License, or   *
9 * (at your option) any later version.                                 *
10 *                                                                     *
11 * This program is distributed in the hope that it will be useful,     *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
14 * GNU General Public License for more details.                        *
15 *                                                                     *
16 * You should have received a copy of the GNU General Public License   *
17 * along with this program; if not, write to the Free Software         *
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.           *
19 *                                                                     *
20 * For questions and comments, please email the author at:             *
21 * mike@wsmake.org                                                     *
22 ***********************************************************************/
23#include "wsLoader.h" /* Loader must be before parser so that data
24			 types for semantic values will be defined */
25#include "wsParser.h"
26
27#undef yywrap
28
29%}
30
31%pointer
32%x STR
33%x STRESC
34%x COMMENT COMMENTS
35%x SCR CMD
36%%
37
38<COMMENT>[^\n]*\n		{ BEGIN(INITIAL);
39				  wsmake::wsLoader_comp->newline(); }
40\#				{ BEGIN(COMMENT); }
41
42<STRESC><<EOF>>			{ BEGIN(INITIAL);
43				  YY_FLUSH_BUFFER;
44				  wsmake::wsLoader_comp->printError(
45					wsmake::e_Scan,
46					"EOF in string");
47				  return ERROR; }
48<STRESC>\n			{ BEGIN(STR); yymore();
49				  wsmake::wsLoader_comp->newline(); }
50<STRESC>.			{ BEGIN(STR); yymore(); }
51
52<STR><<EOF>>			{ BEGIN(INITIAL);
53				  YY_FLUSH_BUFFER;
54				  wsmake::wsLoader_comp->printError(
55					wsmake::e_Scan,
56					"EOF in string");
57				  return ERROR; }
58<STR>\\				{ BEGIN(STRESC); yymore(); }
59<STR>\"				{ BEGIN(INITIAL);
60				  return STRINGL; }
61<STR>\n				{ BEGIN(INITIAL);
62				  wsmake::wsLoader_comp->printError(
63					wsmake::e_Scan,
64					"newline in string");
65				  return SCANERROR; }
66<STR>.				{ yymore(); }
67
68\"				{ BEGIN(STR); yymore(); }
69
700[0-7]+				{ return OCTALL; }
71
72[0-9]+				{ return INTEGERL; }
73
74[0-9]+\.[0-9]+			|
75\.[0-9]+			{ return REALL; }
76
770x[0-9A-Fa-f]+			{ return HEXL; }
78
79[Ii]nclude			{ return INCLUDE; }
80[Rr]egex			{ return REGEX; }
81[Ss]ub[Tt]ag			{ return SUBTAG; }
82[Dd]ata				{ return DATA; }
83[Pp]art				{ return PART; }
84[Pp]rint			{ return PRINT; }
85
86\<\<				{ return LSHIFT; }
87\>\>				{ return RSHIFT; }
88
89<SCR><<EOF>>			{ BEGIN(INITIAL);
90				  YY_FLUSH_BUFFER;
91				  wsmake::wsLoader_comp->printError(
92					wsmake::e_Scan,
93					"EOF in command script section");
94				  return ERROR; }
95<SCR>\>\}			{ BEGIN(CMD); yymore();
96				  wsmake::wsLoader_comp->endblock(); }
97<SCR>\n				{ wsmake::wsLoader_comp->newline(); yymore(); }
98<SCR>.				{ yymore(); }
99<CMD><<EOF>>			{ BEGIN(INITIAL);
100				  YY_FLUSH_BUFFER;
101				  wsmake::wsLoader_comp->printError(
102					wsmake::e_Scan,
103					"EOF in command section");
104				  return ERROR; }
105<CMD>\{\<			{ BEGIN(SCR);
106				  wsmake::wsLoader_comp->newblock();
107				  yymore(); }
108<CMD>\n				{ wsmake::wsLoader_comp->newline(); yymore(); }
109<CMD>\;				{ BEGIN(INITIAL);
110				  yyless(yyleng-1);
111				  return COMMAND; }
112<CMD>.				{ yymore(); }
113\!				{ BEGIN(CMD);
114				  yymore(); }
115
116
117\$[a-zA-Z_][a-zA-Z0-9_]*	{ return ID; }
118
119[a-zA-Z_][a-zA-Z0-9_]*		{ return WORD; }
120
121m?\/[^\/]*\/i?		{ BEGIN(INITIAL); return REGEXL; }
122
123\(				{ return '('; }
124\)				{ return ')'; }
125				/* Start blocks in the scanner, but stop them
126				   in the parser. */
127\{				{ wsmake::wsLoader_comp->newblock();
128				  return '{'; }
129\}				{ return '}'; }
130\;				{ return ';'; }
131\=\=				{ return EQ;  }
132\=				{ return '='; }
133\+\+				{ return INC; }
134\+				{ return '+'; }
135\-\-				{ return DEC; }
136\-				{ return '-'; }
137\*				{ return '*'; }
138\/				{ return '/'; }
139\:				{ return ':'; }
140\,				{ return ','; }
141\<\=				{ return LE;  }
142\<				{ return '<'; }
143\>\=				{ return GE;  }
144\>				{ return '>'; }
145\!\=				{ return NE;  }
146\!				{ return '!'; }
147\%				{ return '%'; }
148\&\&				{ return AND; }
149\&				{ return '&'; }
150\|\|				{ return OR;  }
151\|				{ return '|'; }
152\^				{ return '^'; }
153
154\n				{ wsmake::wsLoader_comp->newline(); }
155[\ \t\r\f]+			;
156
157.				{ wsmake::wsLoader_comp->printError(
158					wsmake::e_Scan,
159					"invalid input `%s'", yytext);
160				  return ERROR; }
161
162%%
163
164int yywrap()
165{
166  return wsmake::wsLoader_comp->wrap();
167}
168