change the type of immediate number value from int to double
This commit is contained in:
+1
-1
@@ -74,7 +74,7 @@ pic_eval(pic_state *pic, pic_value obj, struct pic_env *env)
|
||||
/* not implemented */
|
||||
}
|
||||
}
|
||||
case PIC_TT_INT:
|
||||
case PIC_TT_FLOAT:
|
||||
case PIC_TT_NIL: {
|
||||
return obj;
|
||||
}
|
||||
|
||||
+3
-11
@@ -19,10 +19,10 @@ struct parser_control {
|
||||
}
|
||||
|
||||
%token tLPAREN tRPAREN tDOT
|
||||
%token <datum> tSYMBOL tINT
|
||||
%token <datum> tSYMBOL tNUMBER
|
||||
|
||||
%type <datum> datum simple_datum symbol compound_datum
|
||||
%type <datum> number integer list list_tail
|
||||
%type <datum> number list list_tail
|
||||
|
||||
%%
|
||||
|
||||
@@ -55,14 +55,7 @@ symbol
|
||||
;
|
||||
|
||||
number
|
||||
: integer
|
||||
;
|
||||
|
||||
integer
|
||||
: tINT
|
||||
{
|
||||
$$ = $1;
|
||||
}
|
||||
: tNUMBER
|
||||
;
|
||||
|
||||
compound_datum
|
||||
@@ -106,7 +99,6 @@ pic_parse(pic_state *pic, const char *str)
|
||||
struct parser_control p;
|
||||
|
||||
p.pic = pic;
|
||||
p.value = pic_int_value(42);
|
||||
|
||||
yy_scan_string(str);
|
||||
yyparse(&p);
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ struct parser_control {
|
||||
[ \t\n\r] /* skip whitespace */
|
||||
"(" return tLPAREN;
|
||||
")" return tRPAREN;
|
||||
[1-9][0-9]* { yylval.datum = pic_int_value(atoi(yytext)); return tINT; }
|
||||
[1-9][0-9]* { yylval.datum = pic_float_value(atoi(yytext)); return tNUMBER; }
|
||||
[a-z0-9A-Z]+ { yylval.datum = pic_intern_cstr(p->pic, yytext); return tSYMBOL; }
|
||||
|
||||
%%
|
||||
|
||||
+5
-5
@@ -8,8 +8,8 @@ pic_type(pic_value v)
|
||||
switch (v.type) {
|
||||
case PIC_VTYPE_NIL:
|
||||
return PIC_TT_NIL;
|
||||
case PIC_VTYPE_INT:
|
||||
return PIC_TT_INT;
|
||||
case PIC_VTYPE_FLOAT:
|
||||
return PIC_TT_FLOAT;
|
||||
case PIC_VTYPE_UNDEF:
|
||||
return PIC_TT_UNDEF;
|
||||
case PIC_VTYPE_HEAP:
|
||||
@@ -38,12 +38,12 @@ pic_obj_value(void *ptr)
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_int_value(int i)
|
||||
pic_float_value(double f)
|
||||
{
|
||||
pic_value v;
|
||||
|
||||
v.type = PIC_VTYPE_INT;
|
||||
v.u.i = i;
|
||||
v.type = PIC_VTYPE_FLOAT;
|
||||
v.u.f = f;
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
@@ -100,8 +100,8 @@ print_irep(pic_state *pic, struct pic_irep *irep)
|
||||
case OP_PUSHNIL:
|
||||
puts("OP_PUSHNIL");
|
||||
break;
|
||||
case OP_PUSHI:
|
||||
printf("OP_PUSHI\t%d\n", irep->code[i].u.i);
|
||||
case OP_PUSHNUM:
|
||||
printf("OP_PUSHNUM\t%f\n", irep->code[i].u.f);
|
||||
break;
|
||||
case OP_PUSHUNDEF:
|
||||
puts("OP_PUSHUNDEF");
|
||||
@@ -190,9 +190,9 @@ pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *en
|
||||
break;
|
||||
}
|
||||
}
|
||||
case PIC_TT_INT: {
|
||||
irep->code[irep->clen].insn = OP_PUSHI;
|
||||
irep->code[irep->clen].u.i = pic_int(obj);
|
||||
case PIC_TT_FLOAT: {
|
||||
irep->code[irep->clen].insn = OP_PUSHNUM;
|
||||
irep->code[irep->clen].u.f = pic_float(obj);
|
||||
irep->clen++;
|
||||
break;
|
||||
}
|
||||
@@ -283,8 +283,8 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||
PUSH(pic_nil_value());
|
||||
NEXT;
|
||||
}
|
||||
CASE(OP_PUSHI) {
|
||||
PUSH(pic_int_value(pc->u.i));
|
||||
CASE(OP_PUSHNUM) {
|
||||
PUSH(pic_float_value(pc->u.f));
|
||||
NEXT;
|
||||
}
|
||||
CASE(OP_PUSHUNDEF) {
|
||||
@@ -322,7 +322,7 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
||||
pic_value a, b;
|
||||
a = POP();
|
||||
b = POP();
|
||||
PUSH(pic_int_value(pic_int(a) + pic_int(b)));
|
||||
PUSH(pic_float_value(pic_float(a) + pic_float(b)));
|
||||
NEXT;
|
||||
}
|
||||
CASE(OP_STOP) {
|
||||
|
||||
+2
-2
@@ -21,8 +21,8 @@ pic_debug(pic_state *pic, pic_value obj)
|
||||
case PIC_TT_SYMBOL:
|
||||
printf("%s", pic_symbol_ptr(obj)->name);
|
||||
break;
|
||||
case PIC_TT_INT:
|
||||
printf("%d", pic_int(obj));
|
||||
case PIC_TT_FLOAT:
|
||||
printf("%f", pic_float(obj));
|
||||
break;
|
||||
case PIC_TT_UNDEF:
|
||||
printf("#<undef>");
|
||||
|
||||
Reference in New Issue
Block a user