picrin/src/scan.l

121 lines
1.9 KiB
Plaintext
Raw Normal View History

2013-10-11 02:18:37 -04:00
%{
2013-10-11 23:07:28 -04:00
#include <stdlib.h>
2013-10-20 21:48:03 -04:00
#include <string.h>
2013-10-11 23:07:28 -04:00
2013-10-11 02:18:37 -04:00
#include "picrin.h"
#include "y.tab.h"
#define YY_DECL int yylex_(YYSTYPE *yylvalp, yyscan_t yyscanner)
2013-10-11 02:18:37 -04:00
%}
2013-10-22 14:45:57 -04:00
%option reentrant
2013-10-19 14:05:42 -04:00
%option noinput
2013-10-12 05:46:41 -04:00
%option nounput
2013-10-28 00:04:24 -04:00
/* comment */
comment ;.*$
2013-10-16 00:17:01 -04:00
/* boolean */
boolean #t|#f|#true|#false
2013-10-15 21:19:16 -04:00
/* symbol */
2013-10-22 23:39:48 -04:00
identifier [a-z0-9A-Z+/*!$%&:@^~?<=>_.-]+
2013-10-15 21:19:16 -04:00
/* number */
digit [0-9]
real {sign}{ureal}|{infnan}
2013-10-27 11:21:24 -04:00
ureal {uinteger}|\.{digit}+|{digit}+\.{digit}*
integer {sign}{uinteger}
uinteger {digit}+
2013-10-15 21:19:16 -04:00
sign [+-]?
2013-10-16 00:17:01 -04:00
infnan "+inf.0"|"-inf.0"|"+nan.0"|"-nan.0"
2013-10-15 21:19:16 -04:00
2013-10-20 21:48:03 -04:00
/* string */
2013-10-23 00:44:45 -04:00
%x STRING
2013-10-20 21:48:03 -04:00
2013-11-04 22:38:23 -05:00
/* bytevector */
%x BYTEVECTOR
2013-10-11 02:18:37 -04:00
%%
2013-10-12 05:46:11 -04:00
[ \t\n\r] /* skip whitespace */
2013-10-28 00:04:24 -04:00
{comment} /* skip comment */
2013-11-14 03:31:40 -05:00
"#;" return tDATUM_COMMENT;
2013-10-17 05:14:18 -04:00
"." return tDOT;
2013-10-15 10:25:31 -04:00
"(" return tLPAREN;
")" return tRPAREN;
2013-11-10 21:57:01 -05:00
"[" return tLBRACKET;
"]" return tRBRACKET;
2013-10-29 02:51:37 -04:00
"#(" return tVPAREN;
2013-10-20 20:29:56 -04:00
"'" return tQUOTE;
2013-10-22 23:39:48 -04:00
"`" return tQUASIQUOTE;
"," return tUNQUOTE;
",@" return tUNQUOTE_SPLICING;
{boolean} {
yylvalp->i = (yytext[1] == 't');
return tBOOLEAN;
}
{integer} {
yylvalp->i = atoi(yytext);
return tINT;
}
{real} {
yylvalp->f = atof(yytext);
return tFLOAT;
}
{identifier} {
yylvalp->cstr = strdup(yytext);
return tSYMBOL;
}
2013-10-23 00:44:45 -04:00
"\"" BEGIN(STRING);
<STRING>{
[^\\"]* yymore();
"\"" {
yytext[yyleng-1] = '\0';
yylvalp->cstr = strdup(yytext);
2013-10-23 00:44:45 -04:00
BEGIN(INITIAL);
return tSTRING;
}
}
2013-10-11 02:18:37 -04:00
2013-11-04 21:37:18 -05:00
#\\. {
yylvalp->c = yytext[2];
return tCHAR;
}
2013-11-04 22:38:23 -05:00
"#u8(" {
BEGIN(BYTEVECTOR);
yylvalp->blob.len = 0;
yylvalp->blob.capa = 10;
yylvalp->blob.dat = calloc(10, 1);
}
<BYTEVECTOR>[ \r\n\t]
<BYTEVECTOR>{uinteger} {
int i = atoi(yytext);
if (0 > i || i > 255)
REJECT;
yylvalp->blob.dat[yylvalp->blob.len++] = (char)i;
if (yylvalp->blob.len > yylvalp->blob.capa) {
yylvalp->blob.capa *= 2;
yylvalp->blob.dat = realloc(yylvalp->blob.dat, yylvalp->blob.capa);
}
}
<BYTEVECTOR>")" {
BEGIN(INITIAL);
return tBYTEVECTOR;
}
2013-10-11 02:18:37 -04:00
%%
int
2013-10-22 14:45:57 -04:00
yywrap(yyscan_t yyscanner)
2013-10-11 02:18:37 -04:00
{
return 1;
}