remove flex dependency

This commit is contained in:
Yuichi Nishiwaki
2014-06-25 15:39:30 +09:00
parent da4a4fd449
commit 83a13d4ca4
4 changed files with 1 additions and 461 deletions
+1 -6
View File
@@ -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
-230
View File
@@ -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;
}
<BLOCK_COMMENT>"#|" {
yylval.i++;
}
<BLOCK_COMMENT>"|#" {
if (yylval.i == 0)
BEGIN(INITIAL);
else
yylval.i--;
}
<BLOCK_COMMENT>.|\n {
/* skip block comment */
}
{label} {
BEGIN(DATUM_LABEL);
yylval.i = atoi(yytext + 1);
}
<DATUM_LABEL>= {
BEGIN(INITIAL);
return tLABEL_SET;
}
<DATUM_LABEL># {
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, "");
}
<STRING>[^\\"]+ {
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);
}
<STRING>\\. {
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;
}
}
<STRING>\\[:blank:]*\n[:blank:]* {
/* skip intraline whitespaces */
}
<STRING>\" {
BEGIN(INITIAL);
return tSTRING;
}
#\\ {
BEGIN(CHAR);
}
<CHAR>alarm { yylval.c = '\a'; BEGIN(INITIAL); return tCHAR; }
<CHAR>backspace { yylval.c = '\b'; BEGIN(INITIAL); return tCHAR; }
<CHAR>delete { yylval.c = 0x7f; BEGIN(INITIAL); return tCHAR; }
<CHAR>escape { yylval.c = 0x1b; BEGIN(INITIAL); return tCHAR; }
<CHAR>newline { yylval.c = '\n'; BEGIN(INITIAL); return tCHAR; }
<CHAR>null { yylval.c = '\0'; BEGIN(INITIAL); return tCHAR; }
<CHAR>return { yylval.c = '\r'; BEGIN(INITIAL); return tCHAR; }
<CHAR>space { yylval.c = ' '; BEGIN(INITIAL); return tCHAR; }
<CHAR>tab { yylval.c = '\t'; BEGIN(INITIAL); return tCHAR; }
<CHAR>. { yylval.c = yytext[0]; BEGIN(INITIAL); return tCHAR; }
"#u8(" {
BEGIN(BYTEVECTOR);
yylval.buf.len = 0;
yylval.buf.dat = NULL;
}
<BYTEVECTOR>[ \r\n\t] {
/* skip whitespace */
}
<BYTEVECTOR>{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;
}
<BYTEVECTOR>")" {
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);
}