diff --git a/cmake/FindFLEX.cmake b/cmake/FindFLEX.cmake deleted file mode 100644 index c56e8eda..00000000 --- a/cmake/FindFLEX.cmake +++ /dev/null @@ -1,179 +0,0 @@ -# - Find flex executable and provides a macro to generate custom build rules -# -# The module defines the following variables: -# FLEX_FOUND - true is flex executable is found -# FLEX_EXECUTABLE - the path to the flex executable -# FLEX_VERSION - the version of flex -# FLEX_LIBRARIES - The flex libraries -# -# The minimum required version of flex can be specified using the -# standard syntax, e.g. FIND_PACKAGE(FLEX 2.5.13) -# -# -# If flex is found on the system, the module provides the macro: -# FLEX_TARGET(Name FlexInput FlexOutput [COMPILE_FLAGS ]) -# which creates a custom command to generate the file from -# the file. If COMPILE_FLAGS option is specified, the next -# parameter is added to the flex command line. Name is an alias used to -# get details of this custom command. Indeed the macro defines the -# following variables: -# FLEX_${Name}_DEFINED - true is the macro ran successfully -# FLEX_${Name}_OUTPUTS - the source file generated by the custom rule, an -# alias for FlexOutput -# FLEX_${Name}_INPUT - the flex source file, an alias for ${FlexInput} -# -# Flex scanners oftenly use tokens defined by Bison: the code generated -# by Flex depends of the header generated by Bison. This module also -# defines a macro: -# ADD_FLEX_BISON_DEPENDENCY(FlexTarget BisonTarget) -# which adds the required dependency between a scanner and a parser -# where and are the first parameters of -# respectively FLEX_TARGET and BISON_TARGET macros. -# -# ==================================================================== -# Example: -# -# find_package(BISON) -# find_package(FLEX) -# -# BISON_TARGET(MyParser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.cpp -# FLEX_TARGET(MyScanner lexer.l ${CMAKE_CURRENT_BIANRY_DIR}/lexer.cpp) -# ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser) -# -# include_directories(${CMAKE_CURRENT_BINARY_DIR}) -# add_executable(Foo -# Foo.cc -# ${BISON_MyParser_OUTPUTS} -# ${FLEX_MyScanner_OUTPUTS} -# ) -# ==================================================================== - -#============================================================================= -# Copyright 2009 Kitware, Inc. -# Copyright 2006 Tristan Carel -# Modified 2010 by Jon Siwek, backporting for CMake 2.6 compat -# -# Distributed under the OSI-approved BSD License (the "License"): -# CMake - Cross Platform Makefile Generator -# Copyright 2000-2009 Kitware, Inc., Insight Software Consortium -# All rights reserved. - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# * Neither the names of Kitware, Inc., the Insight Software Consortium, -# nor the names of their contributors may be used to endorse or promote -# products derived from this software 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, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= - -FIND_PROGRAM(FLEX_EXECUTABLE flex DOC "path to the flex executable") -MARK_AS_ADVANCED(FLEX_EXECUTABLE) - -FIND_LIBRARY(FL_LIBRARY NAMES fl - DOC "path to the fl library") -MARK_AS_ADVANCED(FL_LIBRARY) -SET(FLEX_LIBRARIES ${FL_LIBRARY}) - -IF(FLEX_EXECUTABLE) - - EXECUTE_PROCESS(COMMAND ${FLEX_EXECUTABLE} --version - OUTPUT_VARIABLE FLEX_version_output - ERROR_VARIABLE FLEX_version_error - RESULT_VARIABLE FLEX_version_result - OUTPUT_STRIP_TRAILING_WHITESPACE) - IF(NOT ${FLEX_version_result} EQUAL 0) - IF(FLEX_FIND_REQUIRED) - MESSAGE(SEND_ERROR "Command \"${FLEX_EXECUTABLE} --version\" failed with output:\n${FLEX_version_output}\n${FLEX_version_error}") - ELSE() - MESSAGE("Command \"${FLEX_EXECUTABLE} --version\" failed with output:\n${FLEX_version_output}\n${FLEX_version_error}\nFLEX_VERSION will not be available") - ENDIF() - ELSE() - STRING(REGEX REPLACE "^flex (.*)$" "\\1" - FLEX_VERSION "${FLEX_version_output}") - ENDIF() - - #============================================================ - # FLEX_TARGET (public macro) - #============================================================ - # - MACRO(FLEX_TARGET Name Input Output) - SET(FLEX_TARGET_usage "FLEX_TARGET( [COMPILE_FLAGS ]") - IF(${ARGC} GREATER 3) - IF(${ARGC} EQUAL 5) - IF("${ARGV3}" STREQUAL "COMPILE_FLAGS") - SET(FLEX_EXECUTABLE_opts "${ARGV4}") - SEPARATE_ARGUMENTS(FLEX_EXECUTABLE_opts) - ELSE() - MESSAGE(SEND_ERROR ${FLEX_TARGET_usage}) - ENDIF() - ELSE() - MESSAGE(SEND_ERROR ${FLEX_TARGET_usage}) - ENDIF() - ENDIF() - - ADD_CUSTOM_COMMAND(OUTPUT ${Output} - COMMAND ${FLEX_EXECUTABLE} - ARGS ${FLEX_EXECUTABLE_opts} -o${Output} ${Input} - DEPENDS ${Input} - COMMENT "[FLEX][${Name}] Building scanner with flex ${FLEX_VERSION}" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - - SET(FLEX_${Name}_DEFINED TRUE) - SET(FLEX_${Name}_OUTPUTS ${Output}) - SET(FLEX_${Name}_INPUT ${Input}) - SET(FLEX_${Name}_COMPILE_FLAGS ${FLEX_EXECUTABLE_opts}) - ENDMACRO(FLEX_TARGET) - #============================================================ - - - #============================================================ - # ADD_FLEX_BISON_DEPENDENCY (public macro) - #============================================================ - # - MACRO(ADD_FLEX_BISON_DEPENDENCY FlexTarget BisonTarget) - - IF(NOT FLEX_${FlexTarget}_OUTPUTS) - MESSAGE(SEND_ERROR "Flex target `${FlexTarget}' does not exists.") - ENDIF() - - IF(NOT BISON_${BisonTarget}_OUTPUT_HEADER) - MESSAGE(SEND_ERROR "Bison target `${BisonTarget}' does not exists.") - ENDIF() - - SET_SOURCE_FILES_PROPERTIES(${FLEX_${FlexTarget}_OUTPUTS} - PROPERTIES OBJECT_DEPENDS ${BISON_${BisonTarget}_OUTPUT_HEADER}) - ENDMACRO(ADD_FLEX_BISON_DEPENDENCY) - #============================================================ - -ENDIF(FLEX_EXECUTABLE) - -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(FLEX FLEX_EXECUTABLE - FLEX_VERSION) - -# FindFLEX.cmake ends here diff --git a/include/picrin/parse.h b/include/picrin/parse.h deleted file mode 100644 index 0451d201..00000000 --- a/include/picrin/parse.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * See Copyright Notice in picrin.h - */ - -#ifndef PICRIN_PARSE_H__ -#define PICRIN_PARSE_H__ - -#if defined(__cplusplus) -extern "C" { -#endif - -enum { - tEOF = 0, - tLABEL_SET, tLABEL_REF, tDATUM_COMMENT, - tLPAREN, tRPAREN, tLBRACKET, tRBRACKET, tDOT, tVPAREN, - tQUOTE, tQUASIQUOTE, tUNQUOTE, tUNQUOTE_SPLICING, - tINT, tBOOLEAN, - tFLOAT, - tSYMBOL, tSTRING, - tCHAR, - tBYTEVECTOR, -}; - -typedef union YYSTYPE { - int i; - double f; - struct { - char *dat; - size_t len; - } buf; - char c; -} YYSTYPE; - -struct parser_control { - pic_state *pic; - YYSTYPE yylval; - xhash labels; - jmp_buf jmp; - const char *msg; -}; - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7a727e9b..9318f442 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,8 +1,3 @@ -# flex -find_package(FLEX REQUIRED) -flex_target(scan src/scan.l ${PROJECT_SOURCE_DIR}/src/lex.yy.c COMPILE_FLAGS --header-file="src/lex.yy.h") -set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${PROJECT_SOURCE_DIR}/src/lex.yy.h) - # xfile set(XFILE_SOURCES extlib/xfile/xfile.c) @@ -18,7 +13,7 @@ add_custom_command( # build! file(GLOB PICRIN_SOURCES ${PROJECT_SOURCE_DIR}/src/*.c) -add_library(picrin SHARED ${PICRIN_SOURCES} ${PICLIB_SOURCE} ${FLEX_scan_OUTPUTS} ${XFILE_SOURCES} ${PICRIN_CONTRIB_SOURCES}) +add_library(picrin SHARED ${PICRIN_SOURCES} ${PICLIB_SOURCE} ${XFILE_SOURCES} ${PICRIN_CONTRIB_SOURCES}) target_link_libraries(picrin m ${PICRIN_CONTRIB_LIBRARIES}) # install diff --git a/src/scan.l b/src/scan.l deleted file mode 100644 index 747f31a7..00000000 --- a/src/scan.l +++ /dev/null @@ -1,230 +0,0 @@ -/** - * See Copyright Notice in picrin.h - */ - -%{ -#include "picrin.h" -#include "picrin/parse.h" - -#define yylval (yyextra->yylval) - -#define YY_NO_UNISTD_H - -/* NOTE: - * An internal function `yy_fatal_error` takes yyscanner for its second - * argument but doesn't use it. This invokes a `unused variable` compiler - * warning and it became super unusable if `-Werror` is turned on the system. - * Since there's no flag to switch `yy_fatal_error` off and replace it with - * a user-defined function, we modify this macro constant to use yyscanner - * at least once avoiding get flex affected in any condition. - */ -#define YY_EXIT_FAILURE ( (void)yyscanner, 2 ) -%} - -%option reentrant - -%option noyyalloc -%option noyyrealloc -%option noyyfree -%option noinput -%option nounput -%option noyywrap - -%option extra-type="struct parser_control *" -%option never-interactive - - /* shebang */ -shebang #!.*$ - - /* comment */ -comment ;.*$ - - /* boolean */ -boolean #t|#f|#true|#false - - /* symbol */ -identifier [a-z0-9A-Z+/*!$%&:@^~?<=>_.-]+ - - /* number */ -digit [0-9] -real {sign}{ureal}|{infnan} -ureal {uinteger}|\.{digit}+|{digit}+\.{digit}* -integer {sign}{uinteger} -uinteger {digit}+ -sign [+-]? -infnan "+inf.0"|"-inf.0"|"+nan.0"|"-nan.0" - - /* char */ -%x CHAR - - /* string */ -%x STRING - - /* bytevector */ -%x BYTEVECTOR - - /* block comment */ -%x BLOCK_COMMENT - - /* datum label */ -label #{uinteger} -%x DATUM_LABEL - -%% - -[ \t\n\r] /* skip whitespace */ -{comment} /* skip comment */ -{shebang} /* skip shebang */ - -"#|" { - BEGIN(BLOCK_COMMENT); - yylval.i = 0; -} -"#|" { - yylval.i++; -} -"|#" { - if (yylval.i == 0) - BEGIN(INITIAL); - else - yylval.i--; -} -.|\n { - /* skip block comment */ -} - -{label} { - BEGIN(DATUM_LABEL); - yylval.i = atoi(yytext + 1); -} -= { - BEGIN(INITIAL); - return tLABEL_SET; -} -# { - BEGIN(INITIAL); - return tLABEL_REF; -} - -"#;" return tDATUM_COMMENT; -"." return tDOT; -"(" return tLPAREN; -")" return tRPAREN; -"[" return tLBRACKET; -"]" return tRBRACKET; -"#(" return tVPAREN; -"'" return tQUOTE; -"`" return tQUASIQUOTE; -"," return tUNQUOTE; -",@" return tUNQUOTE_SPLICING; - -{boolean} { - yylval.i = (yytext[1] == 't'); - return tBOOLEAN; -} - -{integer} { - yylval.i = atoi(yytext); - return tINT; -} - -{real} { - yylval.f = atof(yytext); - return tFLOAT; -} - -{identifier} { - yylval.buf.dat = yytext; - yylval.buf.len = yyleng; - return tSYMBOL; -} - -"\"" { - BEGIN(STRING); - yylval.buf.len = 0; - yylval.buf.dat = yyalloc(yylval.buf.len + 1, yyscanner); - strcpy(yylval.buf.dat, ""); -} -[^\\"]+ { - yylval.buf.len += yyleng; - yylval.buf.dat = yyrealloc(yylval.buf.dat, yylval.buf.len + 1, yyscanner); - strcpy(yylval.buf.dat + yylval.buf.len - yyleng, yytext); -} -\\. { - yylval.buf.len += 1; - yylval.buf.dat = yyrealloc(yylval.buf.dat, yylval.buf.len + 1, yyscanner); - yylval.buf.dat[yylval.buf.len] = '\0'; - - switch (yytext[yyleng - 1]) { - case 'a': yylval.buf.dat[yylval.buf.len - 1] = '\a'; break; - case 'b': yylval.buf.dat[yylval.buf.len - 1] = '\b'; break; - case 't': yylval.buf.dat[yylval.buf.len - 1] = '\t'; break; - case 'n': yylval.buf.dat[yylval.buf.len - 1] = '\n'; break; - case 'r': yylval.buf.dat[yylval.buf.len - 1] = '\r'; break; - default: yylval.buf.dat[yylval.buf.len - 1] = yytext[yyleng - 1]; break; - } -} -\\[:blank:]*\n[:blank:]* { - /* skip intraline whitespaces */ -} -\" { - BEGIN(INITIAL); - return tSTRING; -} - -#\\ { - BEGIN(CHAR); -} -alarm { yylval.c = '\a'; BEGIN(INITIAL); return tCHAR; } -backspace { yylval.c = '\b'; BEGIN(INITIAL); return tCHAR; } -delete { yylval.c = 0x7f; BEGIN(INITIAL); return tCHAR; } -escape { yylval.c = 0x1b; BEGIN(INITIAL); return tCHAR; } -newline { yylval.c = '\n'; BEGIN(INITIAL); return tCHAR; } -null { yylval.c = '\0'; BEGIN(INITIAL); return tCHAR; } -return { yylval.c = '\r'; BEGIN(INITIAL); return tCHAR; } -space { yylval.c = ' '; BEGIN(INITIAL); return tCHAR; } -tab { yylval.c = '\t'; BEGIN(INITIAL); return tCHAR; } -. { yylval.c = yytext[0]; BEGIN(INITIAL); return tCHAR; } - -"#u8(" { - BEGIN(BYTEVECTOR); - yylval.buf.len = 0; - yylval.buf.dat = NULL; -} -[ \r\n\t] { - /* skip whitespace */ -} -{uinteger} { - int i = atoi(yytext); - if (0 > i || i > 255) { - yyfree(yylval.buf.dat, yyscanner); - REJECT; - } - yylval.buf.len += 1; - yylval.buf.dat = yyrealloc(yylval.buf.dat, yylval.buf.len, yyscanner); - yylval.buf.dat[yylval.buf.len - 1] = (char)i; -} -")" { - BEGIN(INITIAL); - return tBYTEVECTOR; -} - -%% - -void * -yyalloc(size_t bytes, yyscan_t yyscanner) -{ - return pic_alloc(yyget_extra(yyscanner)->pic, bytes); -} - -void * -yyrealloc(void *ptr, size_t bytes, yyscan_t yyscanner) -{ - return pic_realloc(yyget_extra(yyscanner)->pic, ptr, bytes); -} - -void -yyfree(void * ptr, yyscan_t yyscanner) -{ - return pic_free(yyget_extra(yyscanner)->pic, ptr); -}