parse-from-file facility
This commit is contained in:
parent
c93cef8c8c
commit
f192c96650
|
@ -4,6 +4,7 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "picconf.h"
|
#include "picconf.h"
|
||||||
#include "picrin/value.h"
|
#include "picrin/value.h"
|
||||||
|
@ -76,7 +77,8 @@ pic_value pic_intern_cstr(pic_state *, const char *);
|
||||||
pic_value pic_str_new(pic_state *, const char *, size_t);
|
pic_value pic_str_new(pic_state *, const char *, size_t);
|
||||||
pic_value pic_str_new_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_file(pic_state *, FILE *file, pic_value *);
|
||||||
|
bool pic_parse_cstr(pic_state *, const char *, pic_value *);
|
||||||
|
|
||||||
pic_value pic_run(pic_state *, struct pic_proc *, pic_value);
|
pic_value pic_run(pic_state *, struct pic_proc *, pic_value);
|
||||||
struct pic_proc *pic_codegen(pic_state *, pic_value);
|
struct pic_proc *pic_codegen(pic_state *, pic_value);
|
||||||
|
|
27
src/parse.y
27
src/parse.y
|
@ -21,6 +21,7 @@ void yyerror(struct parser_control *, const char *);
|
||||||
int yylex();
|
int yylex();
|
||||||
int yylex_();
|
int yylex_();
|
||||||
void yylex_init();
|
void yylex_init();
|
||||||
|
void yyset_in();
|
||||||
void yy_scan_string();
|
void yy_scan_string();
|
||||||
void yylex_destroy();
|
void yylex_destroy();
|
||||||
%}
|
%}
|
||||||
|
@ -175,7 +176,31 @@ yylex(YYSTYPE *yylvalp, struct parser_control *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
pic_parse(pic_state *pic, const char *str, pic_value *v)
|
pic_parse_file(pic_state *pic, FILE *file, pic_value *v)
|
||||||
|
{
|
||||||
|
struct parser_control p;
|
||||||
|
|
||||||
|
p.pic = pic;
|
||||||
|
p.incomp = false;
|
||||||
|
p.yynerrs = 0;
|
||||||
|
|
||||||
|
yylex_init(&p.yyscanner);
|
||||||
|
yyset_in(file, p.yyscanner);
|
||||||
|
yyparse(&p);
|
||||||
|
yylex_destroy(p.yyscanner);
|
||||||
|
|
||||||
|
if (p.yynerrs > 0) {
|
||||||
|
p.value = pic_undef_value();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! p.incomp) {
|
||||||
|
*v = p.value;
|
||||||
|
}
|
||||||
|
return ! p.incomp;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
pic_parse_cstr(pic_state *pic, const char *str, pic_value *v)
|
||||||
{
|
{
|
||||||
struct parser_control p;
|
struct parser_control p;
|
||||||
|
|
||||||
|
|
|
@ -95,7 +95,7 @@ main(int argc, char *argv[], char **envp)
|
||||||
strcat(code, line);
|
strcat(code, line);
|
||||||
|
|
||||||
/* read */
|
/* read */
|
||||||
r = pic_parse(pic, code, &v);
|
r = pic_parse_cstr(pic, code, &v);
|
||||||
if (! r) { /* wait for more input */
|
if (! r) { /* wait for more input */
|
||||||
goto next;
|
goto next;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue