reentrant scanner

This commit is contained in:
Yuichi Nishiwaki 2013-10-23 03:45:57 +09:00
parent bb0bb0e186
commit f31ddb36a2
2 changed files with 21 additions and 19 deletions

View File

@ -9,15 +9,20 @@
struct parser_control { struct parser_control {
pic_state *pic; pic_state *pic;
void *yyscanner;
pic_value value; pic_value value;
bool incomp; bool incomp;
int yynerrs; int yynerrs;
}; };
void init_scanner(const char *);
void final_scanner(void);
void yyerror(struct parser_control *, const char *); void yyerror(struct parser_control *, const char *);
/* just for supressing warnings. a little bit evil */
int yylex();
int yylex_();
void yylex_init();
void yy_scan_string();
void yylex_destroy();
%} %}
%pure_parser %pure_parser
@ -122,6 +127,12 @@ yyerror(struct parser_control *p, const char *msg)
p->yynerrs++; p->yynerrs++;
} }
int
yylex(YYSTYPE *yylvalp, struct parser_control *p)
{
return yylex_(yylvalp, p->yyscanner, p);
}
bool bool
pic_parse(pic_state *pic, const char *str, pic_value *v) pic_parse(pic_state *pic, const char *str, pic_value *v)
{ {
@ -131,9 +142,10 @@ pic_parse(pic_state *pic, const char *str, pic_value *v)
p.incomp = false; p.incomp = false;
p.yynerrs = 0; p.yynerrs = 0;
init_scanner(str); yylex_init(&p.yyscanner);
yy_scan_string(str, p.yyscanner);
yyparse(&p); yyparse(&p);
final_scanner(); yylex_destroy(p.yyscanner);
if (p.yynerrs > 0) { if (p.yynerrs > 0) {
p.value = pic_undef_value(); p.value = pic_undef_value();

View File

@ -7,6 +7,7 @@
struct parser_control { struct parser_control {
pic_state *pic; pic_state *pic;
void *yyscanner;
pic_value value; pic_value value;
bool incomp; bool incomp;
int yynerrs; int yynerrs;
@ -14,9 +15,10 @@ struct parser_control {
static pic_value new_escaped_string(pic_state *, const char *); static pic_value new_escaped_string(pic_state *, const char *);
#define YY_DECL int yylex (YYSTYPE *yylvalp, struct parser_control *p) #define YY_DECL int yylex_ (YYSTYPE *yylvalp, yyscan_t yyscanner, struct parser_control *p)
%} %}
%option reentrant
%option noinput %option noinput
%option nounput %option nounput
@ -55,7 +57,7 @@ string_elem [^\"\\]|"\\\""|"\\\\"
%% %%
int int
yywrap() yywrap(yyscan_t yyscanner)
{ {
return 1; return 1;
} }
@ -84,15 +86,3 @@ new_escaped_string(pic_state *pic, const char *str)
pic_free(pic, new_str); pic_free(pic, new_str);
return v; return v;
} }
void
init_scanner(const char *str)
{
yy_scan_string(str);
}
void
final_scanner()
{
yylex_destroy();
}