read strings
This commit is contained in:
parent
a49675c322
commit
8f4788ca27
|
@ -66,6 +66,8 @@ bool pic_eq_p(pic_state *, pic_value, pic_value);
|
||||||
|
|
||||||
pic_value pic_intern_cstr(pic_state *, const char *);
|
pic_value pic_intern_cstr(pic_state *, const char *);
|
||||||
|
|
||||||
|
pic_value pic_str_new_cstr(pic_state *, const char *);
|
||||||
|
|
||||||
bool pic_parse(pic_state *, const char *, pic_value *);
|
bool pic_parse(pic_state *, const char *, pic_value *);
|
||||||
|
|
||||||
pic_value pic_eval(pic_state *, pic_value, struct pic_env *);
|
pic_value pic_eval(pic_state *, pic_value, struct pic_env *);
|
||||||
|
|
|
@ -9,6 +9,4 @@ struct pic_string {
|
||||||
|
|
||||||
#define pic_str_ptr(v) ((struct pic_string *)v.u.data)
|
#define pic_str_ptr(v) ((struct pic_string *)v.u.data)
|
||||||
|
|
||||||
pic_value pic_str_new_cstr(pic_state *, const char *);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -374,6 +374,15 @@ pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *en
|
||||||
irep->clen++;
|
irep->clen++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case PIC_TT_STRING: {
|
||||||
|
int pidx;
|
||||||
|
pidx = pic->plen++;
|
||||||
|
pic->pool[pidx] = obj;
|
||||||
|
irep->code[irep->clen].insn = OP_PUSHCONST;
|
||||||
|
irep->code[irep->clen].u.i = pidx;
|
||||||
|
irep->clen++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case PIC_TT_PROC:
|
case PIC_TT_PROC:
|
||||||
case PIC_TT_UNDEF:
|
case PIC_TT_UNDEF:
|
||||||
case PIC_TT_PORT: {
|
case PIC_TT_PORT: {
|
||||||
|
|
26
src/parse.y
26
src/parse.y
|
@ -29,10 +29,10 @@ int yylex(struct parser_control *);
|
||||||
|
|
||||||
%token tLPAREN tRPAREN tDOT
|
%token tLPAREN tRPAREN tDOT
|
||||||
%token tQUOTE
|
%token tQUOTE
|
||||||
%token <datum> tSYMBOL tNUMBER tBOOLEAN
|
%token <datum> tSYMBOL tNUMBER tBOOLEAN tSTRING
|
||||||
|
|
||||||
%type <datum> datum simple_datum symbol compound_datum abbrev
|
%type <datum> datum simple_datum compound_datum abbrev
|
||||||
%type <datum> number boolean list list_data
|
%type <datum> list list_data
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
@ -58,24 +58,10 @@ datum
|
||||||
;
|
;
|
||||||
|
|
||||||
simple_datum
|
simple_datum
|
||||||
: symbol
|
|
||||||
| number
|
|
||||||
| boolean
|
|
||||||
;
|
|
||||||
|
|
||||||
symbol
|
|
||||||
: tSYMBOL
|
: tSYMBOL
|
||||||
{
|
| tNUMBER
|
||||||
$$ = $1;
|
| tBOOLEAN
|
||||||
}
|
| tSTRING
|
||||||
;
|
|
||||||
|
|
||||||
number
|
|
||||||
: tNUMBER
|
|
||||||
;
|
|
||||||
|
|
||||||
boolean
|
|
||||||
: tBOOLEAN
|
|
||||||
;
|
;
|
||||||
|
|
||||||
compound_datum
|
compound_datum
|
||||||
|
|
31
src/scan.l
31
src/scan.l
|
@ -1,5 +1,6 @@
|
||||||
%{
|
%{
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "y.tab.h"
|
#include "y.tab.h"
|
||||||
|
@ -10,6 +11,8 @@ struct parser_control {
|
||||||
bool incomp;
|
bool incomp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static pic_value escape_string(pic_state *, const char *);
|
||||||
|
|
||||||
#define YY_DECL int yylex (struct parser_control *p)
|
#define YY_DECL int yylex (struct parser_control *p)
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
@ -29,6 +32,10 @@ ureal {digit}+|\.{digit}+|{digit}+\.{digit}*
|
||||||
sign [+-]?
|
sign [+-]?
|
||||||
infnan "+inf.0"|"-inf.0"|"+nan.0"|"-nan.0"
|
infnan "+inf.0"|"-inf.0"|"+nan.0"|"-nan.0"
|
||||||
|
|
||||||
|
/* string */
|
||||||
|
string \"{string_elem}*\"
|
||||||
|
string_elem [^\"\\]|"\\\""|"\\\\"
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
[ \t\n\r] /* skip whitespace */
|
[ \t\n\r] /* skip whitespace */
|
||||||
|
@ -39,6 +46,10 @@ infnan "+inf.0"|"-inf.0"|"+nan.0"|"-nan.0"
|
||||||
{boolean} { yylval.datum = pic_bool_value(strcmp(yytext, "#t") == 0 || strcmp(yytext, "#true") == 0); return tBOOLEAN; }
|
{boolean} { yylval.datum = pic_bool_value(strcmp(yytext, "#t") == 0 || strcmp(yytext, "#true") == 0); return tBOOLEAN; }
|
||||||
{real} { yylval.datum = pic_float_value(atof(yytext)); return tNUMBER; }
|
{real} { yylval.datum = pic_float_value(atof(yytext)); return tNUMBER; }
|
||||||
{identifier} { yylval.datum = pic_intern_cstr(p->pic, yytext); return tSYMBOL; }
|
{identifier} { yylval.datum = pic_intern_cstr(p->pic, yytext); return tSYMBOL; }
|
||||||
|
{string} {
|
||||||
|
yylval.datum = escape_string(p->pic, yytext);
|
||||||
|
return tSTRING;
|
||||||
|
}
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
@ -48,6 +59,26 @@ yywrap()
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
escape_string(pic_state *pic, const char *str)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char *new_str;
|
||||||
|
int i;
|
||||||
|
pic_value v;
|
||||||
|
|
||||||
|
len = strlen(str);
|
||||||
|
new_str = (char *)pic_alloc(pic, len + 1);
|
||||||
|
for (i = 1; i < len - 1; ++i) {
|
||||||
|
new_str[i-1] = str[i];
|
||||||
|
}
|
||||||
|
new_str[i] = '\0';
|
||||||
|
|
||||||
|
v = pic_str_new_cstr(pic, new_str);
|
||||||
|
pic_free(pic, new_str);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
init_scanner(const char *str)
|
init_scanner(const char *str)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue