do not abort when finding syntax error
This commit is contained in:
parent
d9e47bdd05
commit
5671c43a77
|
@ -69,5 +69,6 @@ pic_value pic_float_value(double);
|
|||
#define pic_nil_p(v) ((v).type == PIC_VTYPE_NIL)
|
||||
#define pic_true_p(v) ((v).type == PIC_VTYPE_TRUE)
|
||||
#define pic_false_p(v) ((v).type == PIC_VTYPE_FALSE)
|
||||
#define pic_undef_p(v) ((v).type == PIC_VTYPE_UNDEF)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
#include "picrin.h"
|
||||
|
||||
#if PIC_ENABLE_READLINE
|
||||
# include <string.h>
|
||||
# include <stdlib.h>
|
||||
# include <readline/readline.h>
|
||||
# include <readline/history.h>
|
||||
#endif
|
||||
|
@ -84,6 +86,11 @@ main()
|
|||
printf("]\n");
|
||||
#endif
|
||||
|
||||
if (pic_undef_p(v)) {
|
||||
pic_gc_arena_restore(pic, ai);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* eval */
|
||||
proc = pic_codegen(pic, v, pic->global_env);
|
||||
v = pic_run(pic, proc, pic_nil_value());
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
#include "picrin.h"
|
||||
|
||||
#define YYERROR_VERBOSE 1
|
||||
|
||||
struct parser_control {
|
||||
pic_state *pic;
|
||||
pic_value value;
|
||||
|
@ -29,7 +31,7 @@ struct parser_control {
|
|||
program
|
||||
:
|
||||
{
|
||||
p->value = pic_nil_value(p->pic);
|
||||
p->value = pic_undef_value(p->pic);
|
||||
}
|
||||
| datum
|
||||
{
|
||||
|
@ -95,7 +97,6 @@ int
|
|||
yyerror(struct parser_control *p, const char *msg)
|
||||
{
|
||||
puts(msg);
|
||||
abort();
|
||||
}
|
||||
|
||||
pic_value
|
||||
|
@ -109,5 +110,9 @@ pic_parse(pic_state *pic, const char *str)
|
|||
yyparse(&p);
|
||||
yylex_destroy();
|
||||
|
||||
if (yynerrs > 0) {
|
||||
p.value = pic_undef_value();
|
||||
}
|
||||
|
||||
return p.value;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue