/* ttt-lex.l - flex-based lexical analyzer * * Copyright © 2005 Carl Worth * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Author: Carl Worth */ /* Definitions */ %option reentrant %option noyywrap %{ #include "ttt-token.h" #define YY_DECL int yylex (yyscan_t yyscanner, ttt_token_t *token) #define STRING_BUF_SIZE 8000 /* Shut off some compiler warnings due to annoying flex bugs. */ YY_DECL; int yyget_column (yyscan_t yyscanner); void yyset_column (int column_no , yyscan_t yyscanner); %} %x STRING %% char string_buf[STRING_BUF_SIZE]; char *string_buf_ptr; /* Rules */ \r\n { token->type = TTT_TOKEN_TYPE_NEWLINE; return token->type; /* This dead code is just to shut off a * compiler warning due to an annoying flex * bug. */ unput('?'); } \" { string_buf_ptr = string_buf; BEGIN (STRING); } { \\\" { *string_buf_ptr++ = '"'; } \\ { *string_buf_ptr++ = '\\'; } [^\\\"\\]+ { char *s = yytext; while (*s) *string_buf_ptr++ = *s++; } \" { BEGIN (INITIAL); *string_buf_ptr = '\0'; token->type = TTT_TOKEN_TYPE_STRING; token->u.string = xstrdup (string_buf); return token->type; } } [^ \t\r\n\"][^ \t\r\n\"]* { token->type = TTT_TOKEN_TYPE_STRING; token->u.string = xstrdup (yytext); return token->type; } [ \t\r\n] ;