/* $Id$ */ /* --- START LICENSE --- */ /* -------------------------------------------------------------------------- */ /* Copyright (c) 2024 Nishi. */ /* Redistribution and use in source and binary forms, with or without modific */ /* ation, are permitted provided that the following conditions are met: */ /* 1. Redistributions of source code must retain the above copyright noti */ /* ce, this list of conditions and the following disclaimer. */ /* 2. Redistributions in binary form must reproduce the above copyright n */ /* otice, this list of conditions and the following disclaimer in the documen */ /* tation and/or other materials provided with the distribution. */ /* 3. Neither the name of the copyright holder nor the names of its contr */ /* ibutors may be used to endorse or promote products derived from this softw */ /* are without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS */ /* " AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, TH */ /* E IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPO */ /* SE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS */ /* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CON */ /* SEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITU */ /* TE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPT */ /* ION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S */ /* TRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN AN */ /* Y WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY */ /* OF SUCH DAMAGE. */ /* -------------------------------------------------------------------------- */ /* --- END LICENSE --- */ /* https://www.lysator.liu.se/c/ANSI-C-grammar-l.html */ %{ #include #include #include "lisp.tab.h" void count(); int yyparse(void); %} %% \"(\\.|[^\\"])*\" { count(); return (STRING); } \'(\\.|[^\\'])*\' { count(); return (STRING); } [0-9]+(\.[0-9]+)? { count(); return (NUMBER); } \( { count(); return ('('); } \) { count(); return (')'); } [ \t\v\n\f] { count(); return (yytext[0]); } [a-zA-Z0-9_]+ { count(); return (IDENTIFIER); } %% int column = 0; int yywrap() { return(1); } void count() { int i; for (i = 0; yytext[i] != '\0'; i++) if (yytext[i] == '\n'){ column = 0; }else if (yytext[i] == '\t') column += 8 - (column % 8); else column++; } bool set = false; YY_BUFFER_STATE buffer; void yytextscan(const char* str){ if(set) yy_delete_buffer(buffer); buffer = yy_scan_string(str); yy_switch_to_buffer(buffer); set = true; }