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