parser returns multiple expressions in a call
This commit is contained in:
+20
-15
@@ -2,6 +2,7 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "picrin.h"
|
||||
#include "picrin/pair.h"
|
||||
|
||||
void pic_init_pair(pic_state *);
|
||||
void pic_init_port(pic_state *);
|
||||
@@ -17,8 +18,8 @@ pic_load_stdlib(pic_state *pic)
|
||||
{
|
||||
static const char *fn = "piclib/built-in.scm";
|
||||
FILE *file;
|
||||
bool r;
|
||||
pic_value v;
|
||||
int n, i;
|
||||
pic_value v, vs;
|
||||
struct pic_proc *proc;
|
||||
|
||||
file = fopen(fn, "r");
|
||||
@@ -27,24 +28,28 @@ pic_load_stdlib(pic_state *pic)
|
||||
abort();
|
||||
}
|
||||
|
||||
r = pic_parse_file(pic, file, &v);
|
||||
if (! r) {
|
||||
n = pic_parse_file(pic, file, &vs);
|
||||
if (n <= 0) {
|
||||
fputs("fatal error: built-in.scm broken", stderr);
|
||||
abort();
|
||||
}
|
||||
|
||||
proc = pic_codegen(pic, v);
|
||||
if (proc == NULL) {
|
||||
fputs(pic->errmsg, stderr);
|
||||
fputs("fatal error: built-in.scm compilation failure", stderr);
|
||||
abort();
|
||||
}
|
||||
for (i = 0; i < n; ++i, vs = pic_cdr(pic, vs)) {
|
||||
v = pic_car(pic, vs);
|
||||
|
||||
v = pic_apply(pic, proc, pic_nil_value());
|
||||
if (pic_undef_p(v)) {
|
||||
fputs(pic->errmsg, stderr);
|
||||
fputs("fatal error: built-in.scm evaluation failure", stderr);
|
||||
abort();
|
||||
proc = pic_codegen(pic, v);
|
||||
if (proc == NULL) {
|
||||
fputs(pic->errmsg, stderr);
|
||||
fputs("fatal error: built-in.scm compilation failure", stderr);
|
||||
abort();
|
||||
}
|
||||
|
||||
v = pic_apply(pic, proc, pic_nil_value());
|
||||
if (pic_undef_p(v)) {
|
||||
fputs(pic->errmsg, stderr);
|
||||
fputs("fatal error: built-in.scm evaluation failure", stderr);
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
|
||||
+15
-19
@@ -52,14 +52,7 @@ void yylex_destroy();
|
||||
program
|
||||
: program_data
|
||||
{
|
||||
/* if single? */
|
||||
if (pic_eq_p(p->pic, pic_cdr(p->pic, $1), pic_nil_value())) {
|
||||
p->value = pic_car(p->pic, $1);
|
||||
}
|
||||
/* if multiple? */
|
||||
else {
|
||||
p->value = pic_cons(p->pic, pic_symbol_value(p->pic->sBEGIN), $1);
|
||||
}
|
||||
p->value = $1;
|
||||
}
|
||||
| incomplete_program_data
|
||||
{
|
||||
@@ -218,7 +211,7 @@ yylex(YYSTYPE *yylvalp, struct parser_control *p)
|
||||
return yylex_(yylvalp, p->yyscanner);
|
||||
}
|
||||
|
||||
bool
|
||||
int
|
||||
pic_parse_file(pic_state *pic, FILE *file, pic_value *v)
|
||||
{
|
||||
struct parser_control p;
|
||||
@@ -234,15 +227,17 @@ pic_parse_file(pic_state *pic, FILE *file, pic_value *v)
|
||||
|
||||
if (p.yynerrs > 0) {
|
||||
p.value = pic_undef_value();
|
||||
return -1;
|
||||
}
|
||||
if (p.incomp) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (! p.incomp) {
|
||||
*v = p.value;
|
||||
}
|
||||
return ! p.incomp;
|
||||
*v = p.value;
|
||||
return pic_length(pic, p.value);
|
||||
}
|
||||
|
||||
bool
|
||||
int
|
||||
pic_parse_cstr(pic_state *pic, const char *str, pic_value *v)
|
||||
{
|
||||
struct parser_control p;
|
||||
@@ -257,11 +252,12 @@ pic_parse_cstr(pic_state *pic, const char *str, pic_value *v)
|
||||
yylex_destroy(p.yyscanner);
|
||||
|
||||
if (p.yynerrs > 0) {
|
||||
p.value = pic_undef_value();
|
||||
return -1;
|
||||
}
|
||||
if (p.incomp) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (! p.incomp) {
|
||||
*v = p.value;
|
||||
}
|
||||
return ! p.incomp;
|
||||
*v = p.value;
|
||||
return pic_length(pic, p.value);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user