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