aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormirenn <me@mirenn.dev>2026-03-12 16:36:27 +0100
committermirenn <me@mirenn.dev>2026-04-14 09:44:28 +0200
commit6bb1a9b95b09663436c2fe30a8e2185a3f741af1 (patch)
tree5546f4c44b3e9ca09776dae0078db25af229247b /src
parenta8d572933d3a29e73bbbe20bc49e1fe988e55cfa (diff)
downloadinpla-6bb1a9b95b09663436c2fe30a8e2185a3f741af1.tar.gz
inpla-6bb1a9b95b09663436c2fe30a8e2185a3f741af1.zip
float support
Diffstat (limited to 'src')
-rw-r--r--src/ast.c32
-rw-r--r--src/ast.h14
-rw-r--r--src/config.h2
-rw-r--r--src/id_table.c10
-rw-r--r--src/id_table.h17
-rw-r--r--src/inpla.y405
-rw-r--r--src/lex.l4
-rw-r--r--src/mytype.h16
-rw-r--r--src/name_table.h2
9 files changed, 273 insertions, 229 deletions
diff --git a/src/ast.c b/src/ast.c
index 3d37857..e1bd22e 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -8,10 +8,10 @@
#include <string.h>
#include "ast.h"
-#define MAX_SYMBOLS 256
+#define MAX_SYMBOLS 1000000
typedef struct {
char* sym[MAX_SYMBOLS];
- long val[MAX_SYMBOLS];
+ double val[MAX_SYMBOLS];
int nth;
} SymbolTable;
@@ -66,12 +66,12 @@ int lookupEntry(SymbolTable *table, char *name) {
return -1;
}
-int ast_getRecordedVal(int entry) {
+double ast_getRecordedVal(int entry) {
return ConstTable.val[entry];
}
-void recordVal(SymbolTable *table, char *name, long val) {
+void recordVal(SymbolTable *table, char *name, double val) {
int i;
for (i=0; i< table->nth; i++) {
@@ -142,15 +142,15 @@ Ast *ast_makeSymbol(char *name) {
return ptr;
}
-Ast *ast_makeInt(long num) {
+Ast *ast_makeFloat(double num) {
Ast *ptr;
ptr = ast_myalloc();
- ptr->id = AST_INT;
- ptr->longval = num;
+ ptr->id = AST_FLOAT;
+ ptr->doubleval = num;
return ptr;
}
-int ast_recordConst(char *name, int val) {
+int ast_recordConst(char *name, double val) {
if (lookupEntry(&ConstTable, name) == -1) {
recordVal(&ConstTable, name, val);
return 1;
@@ -168,8 +168,8 @@ Ast *ast_makeAST(AST_ID id, Ast *left, Ast *right) {
if (entry != -1) {
ptr = ast_myalloc();
- ptr->id = AST_INT;
- ptr->longval = ConstTable.val[entry];
+ ptr->id = AST_FLOAT;
+ ptr->doubleval = ConstTable.val[entry];
return ptr;
}
}
@@ -277,8 +277,8 @@ Ast *ast_getTail(Ast *p)
void ast_puts(Ast *p) {
static char *string_AstID[] = {
// basic
- "SYM", "NAME", "INTNAME", "AGENT",
- "CNCT", "CNCT_TRO_INT", "CNCT_TRO_CONS", "CNCT_TRO",
+ "SYM", "NAME", "FLOATNAME", "AGENT",
+ "CNCT", "CNCT_TRO_FLOAT", "CNCT_TRO_CONS", "CNCT_TRO",
"RULE", "BODY", "IF", "THEN_ELSE",
// LIST
@@ -289,7 +289,7 @@ void ast_puts(Ast *p) {
// extension
"TUPLE",
- "INT", "LD", "ADD", "SUB", "MUL", "DIV", "MOD",
+ "FLOAT", "LD", "ADD", "SUB", "MUL", "DIV", "MOD",
"LT", "LE", "EQ", "NE", "UNM", "AND", "OR", "NOT",
@@ -304,8 +304,8 @@ void ast_puts(Ast *p) {
if (p==NULL) {printf("NULL"); return;}
switch(p->id) {
- case AST_INT:
- printf("int %ld", p->longval);
+ case AST_FLOAT:
+ printf("double %f", p->doubleval);
break;
case AST_SYM:
printf("%s", p->sym);
@@ -435,7 +435,7 @@ Ast *ast_remove_tuple1(Ast *p) {
if (p==NULL) return p;
switch(p->id) {
- case AST_INT:
+ case AST_FLOAT:
return p;
break;
case AST_SYM:
diff --git a/src/ast.h b/src/ast.h
index 44bc597..553a3bc 100644
--- a/src/ast.h
+++ b/src/ast.h
@@ -5,8 +5,8 @@
#include "config.h"
typedef enum {
- AST_SYM=0, AST_NAME, AST_INTVAR, AST_AGENT,
- AST_CNCT, AST_CNCT_TCO_INTVAR, AST_CNCT_TCO_CONS, AST_CNCT_TCO,
+ AST_SYM=0, AST_NAME, AST_FLOATVAR, AST_AGENT,
+ AST_CNCT, AST_CNCT_TCO_FLOATVAR, AST_CNCT_TCO_CONS, AST_CNCT_TCO,
AST_RULE, AST_BODY, AST_IF, AST_THEN_ELSE,
// this is for ASTLIST
@@ -19,7 +19,7 @@ typedef enum {
AST_TUPLE,
// operation
- AST_INT, AST_LD, AST_PLUS, AST_SUB, AST_MUL, AST_DIV, AST_MOD,
+ AST_FLOAT, AST_LD, AST_PLUS, AST_SUB, AST_MUL, AST_DIV, AST_MOD,
AST_LT, AST_LE, AST_EQ, AST_NE, AST_UNM, AST_AND, AST_OR, AST_NOT,
// for built-in lists
@@ -36,7 +36,7 @@ typedef enum {
typedef struct abstract_syntax_tree {
AST_ID id;
int intval;
- long longval;
+ double doubleval;
char *sym;
struct abstract_syntax_tree *left,*right;
} Ast;
@@ -44,7 +44,7 @@ typedef struct abstract_syntax_tree {
void ast_heapInit(void);
void ast_heapReInit(void);
Ast *ast_makeSymbol(char *name);
-Ast *ast_makeInt(long num);
+Ast *ast_makeFloat(double num);
Ast *ast_makeAST(AST_ID id, Ast *left, Ast *right);
Ast *ast_makeTuple(Ast *tuple);
Ast *ast_reverseList(Ast *l);
@@ -54,10 +54,10 @@ Ast *ast_getNth(Ast *p,int nth);
Ast *ast_getTail(Ast *p);
void ast_puts(Ast *p);
Ast *ast_paramToCons(Ast *ast);
-int ast_recordConst(char *name, int val);
+int ast_recordConst(char *name, double val);
Ast *ast_remove_tuple1(Ast *p);
Ast *ast_unfoldABR(Ast *left_params, char *sym, Ast *paramlist, Ast *annotate);
-int ast_getRecordedVal(int entry);
+double ast_getRecordedVal(int entry);
#define ast_makeCons(x1,x2) ast_makeAST(AST_LIST,x1,x2)
#define ast_makeList1(x1) ast_makeAST(AST_LIST,x1,NULL)
diff --git a/src/config.h b/src/config.h
index d1c677d..dcd87f7 100644
--- a/src/config.h
+++ b/src/config.h
@@ -183,7 +183,7 @@
-#define COUNT_INTERACTION // Count the amount of interactions.
+//#define COUNT_INTERACTION // Count the amount of interactions.
diff --git a/src/id_table.c b/src/id_table.c
index 57189ba..37abe18 100644
--- a/src/id_table.c
+++ b/src/id_table.c
@@ -36,7 +36,7 @@ void IdTable_init() {
IdTable[ID_TUPLE5].aux.arity = 5;
IdTable[ID_NIL].aux.arity = 0;
IdTable[ID_CONS].aux.arity = 2;
- IdTable[ID_INTAGENT].aux.arity = 1;
+ IdTable[ID_FLOATAGENT].aux.arity = 1;
IdTable[ID_APPEND].aux.arity = 2;
IdTable[ID_ZIP].aux.arity = 2;
@@ -60,7 +60,7 @@ void IdTable_init() {
IdTable[ID_DUP].aux.arity = 2;
- IdTable[ID_INT].name = "Int";
+ IdTable[ID_FLOAT].name = "Float";
IdTable[ID_TUPLE0].name = "Tuple0";
IdTable[ID_TUPLE1].name = "Tuple1";
IdTable[ID_TUPLE2].name = "Tuple2";
@@ -69,7 +69,7 @@ void IdTable_init() {
IdTable[ID_TUPLE5].name = "Tuple5";
IdTable[ID_NIL].name = "[]";
IdTable[ID_CONS].name = "Cons";
- IdTable[ID_INTAGENT].name = "Int";
+ IdTable[ID_FLOATAGENT].name = "Float";
IdTable[ID_WILDCARD].name = "Wildcard";
IdTable[ID_APPEND].name = "Append";
@@ -122,8 +122,8 @@ int IdTable_getid_builtin_funcAgent(Ast *agent) {
id = ID_ZIP;
} else if (strcmp((char *)agent->left->sym, "Map") == 0) {
id = ID_MAP;
- } else if (strcmp((char *)agent->left->sym, "Int") == 0) {
- id = ID_INTAGENT;
+ } else if (strcmp((char *)agent->left->sym, "Float") == 0) {
+ id = ID_FLOATAGENT;
} else if (strcmp((char *)agent->left->sym, "Merger") == 0) {
id = ID_MERGER;
} else if (strcmp((char *)agent->left->sym, "Eraser") == 0) {
diff --git a/src/id_table.h b/src/id_table.h
index 809a814..48a257e 100644
--- a/src/id_table.h
+++ b/src/id_table.h
@@ -9,7 +9,7 @@
// 257 .. : GNAME
-#define ID_INT 0
+#define ID_FLOAT 0
// NOTE:
@@ -31,7 +31,7 @@
#define ID_WILDCARD 9
-#define ID_INTAGENT 10 // This is an experimental dummy agent
+#define ID_FLOATAGENT 10 // This is an experimental dummy agent
// to show the use effect of Int agent.
#define START_ID_OF_BUILTIN_CONSTRUCTOR_AGENT 10
@@ -60,25 +60,24 @@
// because these IDs are wanted larger like ID_DUP > any_agent.id
+#define NUM_AGENTS 1000 // Increased from 256
+
#define START_ID_OF_USER_AGENT END_ID_OF_BUILTIN_OP_AGENT+1
-#define END_ID_OF_AGENT 255
+#define END_ID_OF_AGENT (NUM_AGENTS-1)
#define END_ID_OF_USER_AGENT END_ID_OF_AGENT-2
#define ID_ERASER END_ID_OF_AGENT-1
#define ID_DUP END_ID_OF_AGENT
-#define NUM_AGENTS END_ID_OF_AGENT+1 // 256
-
-#define ID_NAME NUM_AGENTS // starts from 256 (NUM_AGENTS)
+#define ID_NAME NUM_AGENTS // starts from 1000
#define START_ID_OF_GNAME ID_NAME+1
-#define NUM_GNAMES NUM_AGENTS // 256: the same as the size of AGENT
+#define NUM_GNAMES 1000000 // 1,000,000 global names
-//#define IS_AGENTID(a) (a <= ID_END_ID_OF_AGENT)
-#define IS_AGENTID(a) (!(a & 0x100)) // less than 256
+#define IS_AGENTID(a) ((a) < ID_NAME)
#define IS_NAMEID(a) ((a) >= ID_NAME)
diff --git a/src/inpla.y b/src/inpla.y
index 08d3904..aa199ec 100644
--- a/src/inpla.y
+++ b/src/inpla.y
@@ -6,6 +6,7 @@
#include <unistd.h>
#include <errno.h>
#include <sched.h>
+#include <math.h>
#include "unlikely.h"
#include "timer.h" //#include <time.h>
@@ -166,14 +167,14 @@ static char *Errormsg = NULL;
%}
%union{
- long longval;
+ double doubleval;
char *chval;
Ast *ast;
}
%token <chval> NAME "NAME_LITERAL"
%token <chval> AGENT "AGENT_LITERAL"
-%token <longval> NUMERAL_LITERAL
+%token <doubleval> NUMERAL_LITERAL
%token <chval> STRING_LITERAL
%token CROSS "><"
@@ -191,7 +192,7 @@ static char *Errormsg = NULL;
%token GE ">="
%token NOT AND OR
-%token INT LET IN END IF THEN ELSE WHERE RAND DEF
+%token FLOAT LET IN END IF THEN ELSE WHERE RAND DEF
%token INTERFACE IFCE PRNAT FREE EXIT MEMSTAT
%token END_OF_FILE USE
@@ -391,7 +392,7 @@ command:
int entry=ast_recordConst($2,$4);
if (!entry) {
- printf("`%s' has been already bound to a value `%d' as immutable.\n\n",
+ printf("`%s' has been already bound to a value `%f' as immutable.\n\n",
$2, ast_getRecordedVal(entry));
fflush(stdout);
}
@@ -400,7 +401,7 @@ command:
int entry=ast_recordConst($2,$5*(-1));
if (!entry) {
- printf("`%s' has been already bound to a value `%d' as immutable.\n\n",
+ printf("`%s' has been already bound to a value `%f' as immutable.\n\n",
$2, ast_getRecordedVal(entry));
fflush(stdout);
}
@@ -480,7 +481,7 @@ agent_percent
;
val_declare
-: INT NAME { $$ = ast_makeAST(AST_INTVAR, ast_makeSymbol($2), NULL); }
+: FLOAT NAME { $$ = ast_makeAST(AST_FLOATVAR, ast_makeSymbol($2), NULL); }
;
agent_cons
@@ -617,7 +618,7 @@ unary_expr
primary_expr
: nameterm { $$ = $1;}
-| NUMERAL_LITERAL { $$ = ast_makeInt($1); }
+| NUMERAL_LITERAL { $$ = ast_makeFloat($1); }
| AGENT { $$=ast_makeAST(AST_AGENT, ast_makeSymbol($1), NULL); }
| '(' expr ')' { $$ = $2; }
@@ -1096,12 +1097,13 @@ HoopList *HoopList_new_forAgent(unsigned int size) {
}
hp_list->size = size;
-
+#ifndef SUPPRESS_OUTPUT
#ifdef PUT_NEW_AGENTHOOP_TIME
time=stop_timer(&t);
printf("(%.6f sec)\n",
(double)(time)/1000000.0);
#endif
+#endif
@@ -1679,7 +1681,7 @@ static int Puts_list_element=0;
static int PutIndirection = 1; // indirected term t for x is put as x->t
void puts_term(VALUE ptr) {
if (IS_FIXNUM(ptr)) {
- printf("%ld", FIX2INT(ptr));
+ printf("%f", FIX2FLOAT(ptr));
return;
} else if (BASIC(ptr) == NULL) {
printf("<NULL>");
@@ -1772,7 +1774,7 @@ void puts_term(VALUE ptr) {
} else if (BASIC(ptr)->id == ID_PERCENT) {
printf("%%");
- printf("%s", IdTable_get_name(FIX2INT(AGENT(ptr)->port[0])));
+ printf("%s", IdTable_get_name((int)FIX2FLOAT(AGENT(ptr)->port[0])));
} else if (BASIC(ptr)->id == ID_WILDCARD) {
printf("Wildcard");
@@ -2833,8 +2835,8 @@ void IMCode_puts(int n) {
case OP_LOADI:
case OP_EQI_R0:
case OP_LOADI_SHARED:
- printf("%s $%ld var%ld\n", string_opcode[imcode->opcode],
- imcode->operand1, imcode->operand2);
+ printf("%s $%f var%ld\n", string_opcode[imcode->opcode],
+ FIX2FLOAT(imcode->operand1), imcode->operand2);
break;
@@ -2865,8 +2867,8 @@ void IMCode_puts(int n) {
case OP_ADDI:
case OP_SUBI:
case OP_EQI:
- printf("%s var%ld $%ld var%ld\n", string_opcode[imcode->opcode],
- imcode->operand1, imcode->operand2, imcode->operand3);
+ printf("%s var%ld $%f var%ld\n", string_opcode[imcode->opcode],
+ imcode->operand1, FIX2FLOAT(imcode->operand2), imcode->operand3);
break;
@@ -2952,9 +2954,9 @@ void VMCode_puts(void **code, int n) {
i+=2;
} else if (code[i] == CodeAddr[OP_PUSHI]) {
- printf("pushi reg%lu $%ld\n",
+ printf("pushi reg%lu $%f\n",
(unsigned long)code[i+1],
- FIX2INT((unsigned long)code[i+2]));
+ FIX2FLOAT((unsigned long)code[i+2]));
i+=2;
} else if (code[i] == CodeAddr[OP_MYPUSH]) {
@@ -2976,8 +2978,8 @@ void VMCode_puts(void **code, int n) {
puts("ret_free_lr");
} else if (code[i] == CodeAddr[OP_LOADI]) {
- printf("loadi $%ld reg%lu\n",
- FIX2INT((unsigned long)code[i+1]),
+ printf("loadi $%f reg%lu\n",
+ FIX2FLOAT((unsigned long)code[i+1]),
(unsigned long)code[i+2]);
i+=2;
@@ -2989,13 +2991,13 @@ void VMCode_puts(void **code, int n) {
i+=3;
} else if (code[i] == CodeAddr[OP_LOADP_L]) {
- printf("loadp_l reg%lu $%ld\n",
+ printf("loadp_l reg%lu $%lu\n",
(unsigned long)code[i+1],
(unsigned long)code[i+2]);
i+=2;
} else if (code[i] == CodeAddr[OP_LOADP_R]) {
- printf("loadp_r reg%lu $%ld\n",
+ printf("loadp_r reg%lu $%lu\n",
(unsigned long)code[i+1],
(unsigned long)code[i+2]);
i+=2;
@@ -3115,9 +3117,9 @@ void VMCode_puts(void **code, int n) {
i+=3;
} else if (code[i] == CodeAddr[OP_EQI]) {
- printf("eqi reg%lu $%ld reg%lu\n",
+ printf("eqi reg%lu $%f reg%lu\n",
(unsigned long)code[i+1],
- FIX2INT((unsigned long)code[i+2]),
+ FIX2FLOAT((unsigned long)code[i+2]),
(unsigned long)code[i+3]);
i+=3;
@@ -3147,9 +3149,9 @@ void VMCode_puts(void **code, int n) {
i+=2;
} else if (code[i] == CodeAddr[OP_EQI_R0]) {
- printf("eqi_r0 reg%lu $%ld\n",
+ printf("eqi_r0 reg%lu $%f\n",
(unsigned long)code[i+1],
- FIX2INT((unsigned long)code[i+2]));
+ FIX2FLOAT((unsigned long)code[i+2]));
i+=2;
} else if (code[i] == CodeAddr[OP_NE_R0]) {
@@ -3268,14 +3270,14 @@ typedef enum {
NB_NAME=0,
NB_META_L,
NB_META_R,
- NB_INTVAR,
+ NB_FLOATVAR,
NB_WILDCARD,
} NB_TYPE;
// NBIND 数は meta数(MAX_PORT*2) + 一つの rule(や eqlist) における
// 最大name出現数(100)
-#define MAX_NBIND MAX_PORT*2+100
+#define MAX_NBIND 1000000
typedef struct {
char *name;
int reg;
@@ -3283,7 +3285,7 @@ typedef struct {
// >0: local name
// (for the bind names: should be 1)
// (for the int names: not paticular)
- NB_TYPE type; // NB_NAME, NB_META_L (or R), NB_INTVAR, NB_WILDCARD
+ NB_TYPE type; // NB_NAME, NB_META_L (or R), NB_FLOATVAR, NB_WILDCARD
} NameBind;
@@ -3338,7 +3340,7 @@ typedef struct {
// Annotation states
#define ANNOTATE_NOTHING 0 // The rule agent is not reused.
#define ANNOTATE_REUSE 1 // Annotation (*L), (*R) is specified.
-#define ANNOTATE_INT_MODIFIER 2 // (int i), therefore it must not be freed.
+#define ANNOTATE_FLOAT_MODIFIER 2 // (int i), therefore it must not be freed.
#define ANNOTATE_WILDCARD 3 // Wildcard Agent, therefore it must not be freed.
#define ANNOTATE_TCO 4 // Annotated and reused as TCO.
@@ -3441,11 +3443,11 @@ void CmEnv_clear_keeping_rule_properties(void)
CmEnv_clear_bind(CmEnv.bindPtr_metanames);
// Except of ANNOTATE_INT and ANNOTATE_WILDCARD
- if ((CmEnv.annotateL != ANNOTATE_INT_MODIFIER)
+ if ((CmEnv.annotateL != ANNOTATE_FLOAT_MODIFIER)
&& (CmEnv.annotateL != ANNOTATE_WILDCARD)) {
CmEnv.annotateL = ANNOTATE_NOTHING;
}
- if ((CmEnv.annotateR != ANNOTATE_INT_MODIFIER)
+ if ((CmEnv.annotateR != ANNOTATE_FLOAT_MODIFIER)
&& (CmEnv.annotateR != ANNOTATE_WILDCARD)) {
CmEnv.annotateR = ANNOTATE_NOTHING;
}
@@ -3518,14 +3520,14 @@ void CmEnv_set_symbol_as_meta(char *name, int reg, NB_TYPE type) {
}
-int CmEnv_set_as_INTVAR(char *name) {
+int CmEnv_set_as_FLOATVAR(char *name) {
int result;
if (name != NULL) {
CmEnv.bind[CmEnv.bindPtr].name = name;
CmEnv.bind[CmEnv.bindPtr].reg = CmEnv.localNamePtr;
CmEnv.bind[CmEnv.bindPtr].refnum = 0;
- CmEnv.bind[CmEnv.bindPtr].type = NB_INTVAR;
+ CmEnv.bind[CmEnv.bindPtr].type = NB_FLOATVAR;
result = CmEnv.localNamePtr;
CmEnv.bindPtr++;
@@ -4501,7 +4503,7 @@ int CmEnv_generate_VMCode(void **code, int max_size) {
#endif
code[addr++] = CodeAddr[imcode->opcode];
- code[addr++] = (void *)INT2FIX(imcode->operand1);
+ code[addr++] = (void *)imcode->operand1;
code[addr++] = (void *)(unsigned long)dest;
break;
@@ -4522,7 +4524,7 @@ int CmEnv_generate_VMCode(void **code, int max_size) {
#endif
code[addr++] = CodeAddr[OP_LOADI];
- code[addr++] = (void *)INT2FIX(imcode->operand1);
+ code[addr++] = (void *)imcode->operand1;
code[addr++] = (void *)(unsigned long)dest;
break;
@@ -4652,7 +4654,7 @@ int CmEnv_generate_VMCode(void **code, int max_size) {
code[addr++] = CodeAddr[imcode->opcode];
code[addr++] = (void *)(unsigned long)src1;
- code[addr++] = (void *)(unsigned long)imcode->operand2;
+ code[addr++] = (void *)imcode->operand2;
code[addr++] = (void *)(unsigned long)dest;
break;
@@ -4674,7 +4676,7 @@ int CmEnv_generate_VMCode(void **code, int max_size) {
code[addr++] = CodeAddr[imcode->opcode];
code[addr++] = (void *)(unsigned long)src1;
- code[addr++] = (void *)INT2FIX(imcode->operand2);
+ code[addr++] = (void *)imcode->operand2;
code[addr++] = (void *)(unsigned long)dest;
break;
@@ -4736,7 +4738,7 @@ int CmEnv_generate_VMCode(void **code, int max_size) {
code[addr++] = CodeAddr[imcode->opcode];
code[addr++] = (void *)(unsigned long)src1;
- code[addr++] = (void *)INT2FIX(imcode->operand2);
+ code[addr++] = (void *)imcode->operand2;
break;
}
@@ -4787,8 +4789,7 @@ int CmEnv_generate_VMCode(void **code, int max_size) {
code[addr++] = CodeAddr[imcode->opcode];
code[addr++] = (void *)(unsigned long)src1;
// int
- code[addr++] = (void *)INT2FIX(imcode->operand2);
-
+ code[addr++] = (void *)imcode->operand2;
break;
}
@@ -5096,7 +5097,7 @@ int Ast_is_expr(Ast *ptr) {
}
switch (ptr->id) {
- case AST_INT:
+ case AST_FLOAT:
return 1;
break;
@@ -5106,7 +5107,7 @@ int Ast_is_expr(Ast *ptr) {
if (result == 0) {
return 0;
}
- if (type != NB_INTVAR) {
+ if (type != NB_FLOATVAR) {
return 0;
}
@@ -5418,7 +5419,7 @@ int Ast_make_annotation_TailCallOptimisation(Ast *mainbody) {
// Return 1 when annotated.
//
// When there is an equation for TCO, its ID is changed from AST_CNCT into
- // AST_CNCT_TCO_INTVAR or AST_CNCT_TCO.
+ // AST_CNCT_TCO_FLOATVAR or AST_CNCT_TCO.
if (mainbody == NULL)
@@ -5478,7 +5479,7 @@ int Ast_make_annotation_TailCallOptimisation(Ast *mainbody) {
if (Ast_is_expr(constructor_agent)) {
// --- CASE 1: rule_left_agent ~ expression
available_TCO = 1;
- astID_of_TCO = AST_CNCT_TCO_INTVAR;
+ astID_of_TCO = AST_CNCT_TCO_FLOATVAR;
} else if (constructor_agent->id == AST_NAME) {
// --- CASE 2: rule_left_agent ~ name where the name is meta_R
@@ -5545,15 +5546,17 @@ int Compile_expr_on_ast(Ast *ptr, int target) {
return 1;
}
switch (ptr->id) {
- case AST_INT:
- IMCode_genCode2(OP_LOADI, ptr->longval, target);
+ case AST_FLOAT: {
+ IMCode_genCode2(OP_LOADI, FLOAT2FIX(ptr->doubleval), target);
return 1;
break;
+ }
- case AST_NAME: {
+ case AST_NAME:
+ case AST_FLOATVAR: {
int result = CmEnv_find_var(ptr->left->sym);
if (result == -1) {
- // result=CmEnv_set_as_INTVAR(ptr->left->sym);
+ // result=CmEnv_set_as_FLOATVAR(ptr->left->sym);
// Increase the counter of compilation errors
CmEnv.count_compilation_errors++;
@@ -5568,7 +5571,7 @@ int Compile_expr_on_ast(Ast *ptr, int target) {
NB_TYPE type;
int get_result;
get_result = CmEnv_gettype_forname((ptr)->left->sym, &type);
- if ((get_result) && (type != NB_INTVAR)) {
+ if ((get_result) && (type != NB_FLOATVAR)) {
printf("%d:Warning: `%s' is used as a property variable, although is is not declared as so.\n",
yylineno,
(ptr)->left->sym);
@@ -5668,13 +5671,13 @@ int Compile_expr_on_ast(Ast *ptr, int target) {
if (!Compile_expr_on_ast(ptr->right, newreg2)) return 0;
IMCode_genCode2(OP_JMPEQ0, newreg2, label1);
- IMCode_genCode2(OP_LOADI_SHARED, 1, target);
+ IMCode_genCode2(OP_LOADI_SHARED, FLOAT2FIX(1.0), target);
int label2 = CmEnv_get_newlabel();
IMCode_genCode1(OP_JMP, label2);
IMCode_genCode1(OP_LABEL, label1);
- IMCode_genCode2(OP_LOADI_SHARED, 0, target);
+ IMCode_genCode2(OP_LOADI_SHARED, FLOAT2FIX(0.0), target);
IMCode_genCode1(OP_LABEL, label2);
@@ -5703,13 +5706,13 @@ int Compile_expr_on_ast(Ast *ptr, int target) {
if (!Compile_expr_on_ast(ptr->right, newreg2)) return 0;
IMCode_genCode2(OP_JMPNEQ0, newreg2, label1);
- IMCode_genCode2(OP_LOADI_SHARED, 0, target);
+ IMCode_genCode2(OP_LOADI_SHARED, FLOAT2FIX(0.0), target);
int label2 = CmEnv_get_newlabel();
IMCode_genCode1(OP_JMP, label2);
IMCode_genCode1(OP_LABEL, label1);
- IMCode_genCode2(OP_LOADI_SHARED, 1, target);
+ IMCode_genCode2(OP_LOADI_SHARED, FLOAT2FIX(1.0), target);
IMCode_genCode1(OP_LABEL, label2);
@@ -5731,13 +5734,13 @@ int Compile_expr_on_ast(Ast *ptr, int target) {
int label1 = CmEnv_get_newlabel();
IMCode_genCode2(OP_JMPEQ0, newreg, label1);
- IMCode_genCode2(OP_LOADI, 0, target);
+ IMCode_genCode2(OP_LOADI, FLOAT2FIX(0.0), target);
int label2 = CmEnv_get_newlabel();
IMCode_genCode1(OP_JMP, label2);
IMCode_genCode1(OP_LABEL, label1);
- IMCode_genCode2(OP_LOADI, 1, target);
+ IMCode_genCode2(OP_LOADI, FLOAT2FIX(1.0), target);
IMCode_genCode1(OP_LABEL, label2);
@@ -5783,11 +5786,21 @@ int Compile_term_on_ast(Ast *ptr, int target) {
return result;
break;
- case AST_INT:
+ case AST_FLOATVAR: {
+ result = CmEnv_find_var(ptr->left->sym);
+ if (result == -1) {
+ result = CmEnv_set_as_FLOATVAR(ptr->left->sym);
+ }
+ return result;
+ break;
+ }
+
+ case AST_FLOAT: {
result = CmEnv_newvar();
- IMCode_genCode2(OP_LOADI, ptr->longval, result);
+ IMCode_genCode2(OP_LOADI, FLOAT2FIX(ptr->doubleval), result);
return result;
break;
+ }
case AST_NIL:
if (target == -1) {
@@ -6148,7 +6161,7 @@ int check_invalid_occurrence_as_rule(Ast *ast) {
if (CmEnv_gettype_forname(ast->left->sym, &type)) {
/*
- if (type == NB_INTVAR) {
+ if (type == NB_FLOATVAR) {
printf("ERROR: The variable '%s' for an integer cannot be used as an agent ",
ast->left->sym);
return 0;
@@ -6158,7 +6171,7 @@ int check_invalid_occurrence_as_rule(Ast *ast) {
// printf("ERROR: The name '%s' is not bound ", ast->left->sym);
// return 0;
}
- } else if (ast->id == AST_INT) {
+ } else if (ast->id == AST_FLOAT) {
// printf("ERROR: The integer '%d' is used as an agent ",
// ast->intval);
// return 0;
@@ -6265,7 +6278,7 @@ int Compile_eqlist_on_ast_in_rulebody(Ast *at) {
// Check for: x:int~expr
if ((eq->left)->id == AST_NAME) {
int result = CmEnv_gettype_forname((eq->left)->left->sym, &type);
- if ((result != 0) && (type == NB_INTVAR)) {
+ if ((result != 0) && (type == NB_FLOATVAR)) {
// the left term is a variable on property
if (Ast_is_expr(eq->right)) {
@@ -6275,7 +6288,7 @@ int Compile_eqlist_on_ast_in_rulebody(Ast *at) {
} else if ((eq->right)->id == AST_NAME) {
result = CmEnv_gettype_forname((eq->right)->left->sym, &type);
- if ((result !=0) && (type == NB_INTVAR)) {
+ if ((result !=0) && (type == NB_FLOATVAR)) {
printf("%d:Warning: The variable `%s' is connected to a variable %s. It may cause runtime error.\n",
yylineno,
(eq->left)->left->sym, (eq->right)->left->sym);
@@ -6287,7 +6300,7 @@ int Compile_eqlist_on_ast_in_rulebody(Ast *at) {
// Check for: expr~x:int
if ((eq->right)->id == AST_NAME) {
int result = CmEnv_gettype_forname((eq->right)->left->sym, &type);
- if ((result != 0) && (type == NB_INTVAR)) {
+ if ((result != 0) && (type == NB_FLOATVAR)) {
// the right term is a variable on property
if (Ast_is_expr(eq->left)) {
@@ -6298,7 +6311,7 @@ int Compile_eqlist_on_ast_in_rulebody(Ast *at) {
} else {
if ((eq->left)->id == AST_NAME) {
result = CmEnv_gettype_forname((eq->left)->left->sym, &type);
- if ((result !=0) && (type == NB_INTVAR)) {
+ if ((result !=0) && (type == NB_FLOATVAR)) {
printf("%d:Warning: The variable `%s' is connected to a variable %s. It may cause runtime error.\n",
yylineno,
(eq->right)->left->sym, (eq->left)->left->sym);
@@ -6381,7 +6394,7 @@ int Compile_eqlist_on_ast_in_rulebody(Ast *at) {
// operation for the last placed equation.
- if (eq->id == AST_CNCT_TCO_INTVAR) {
+ if (eq->id == AST_CNCT_TCO_FLOATVAR) {
// rule_left_agent ~ expression
// It always becomes loop operation
@@ -6648,7 +6661,7 @@ int Compile_stmlist_on_ast(Ast *at) {
toRegLeft = CmEnv_find_var(ptr->left->left->sym);
if (toRegLeft == -1) {
// the sym is new
- toRegLeft = CmEnv_set_as_INTVAR(ptr->left->left->sym);
+ toRegLeft = CmEnv_set_as_FLOATVAR(ptr->left->left->sym);
} else {
printf("%d:Warning: `%s' has been already defined.\n",
yylineno, ptr->left->left->sym);
@@ -6659,14 +6672,15 @@ int Compile_stmlist_on_ast(Ast *at) {
// y is a name
int toRegRight = CmEnv_find_var(ptr->right->left->sym);
if (toRegRight == -1) {
- toRegRight = CmEnv_set_as_INTVAR(ptr->right->left->sym);
+ toRegRight = CmEnv_set_as_FLOATVAR(ptr->right->left->sym);
}
IMCode_genCode2(OP_LOAD, toRegRight, toRegLeft);
- } else if (ptr->right->id == AST_INT) {
- // y is an integer
- IMCode_genCode2(OP_LOADI, ptr->right->longval, toRegLeft);
+ } else if (ptr->right->id == AST_FLOAT) {
+ // y is a double
+ IMCode_genCode2(OP_LOADI, FLOAT2FIX(ptr->right->doubleval), toRegLeft);
+
} else {
// y is an expression
@@ -7083,7 +7097,7 @@ void RuleTable_get_code_for_Int(VALUE heap_syml, void ***code) {
RuleList *at = RuleTable[syml];
while (at != NULL) {
- if (at->sym == ID_INT) {
+ if (at->sym == ID_FLOAT) {
if (at->available == 0) {
return;
@@ -7143,7 +7157,7 @@ void *RuleTable_get_code(int symlID, int symrID, int *result) {
static inline
void RuleTable_get_code_for_Int(VALUE heap_syml, void ***code) {
int symlID = AGENT(heap_syml)->basic.id;
- *code = RuleTable[ID_INT][symlID];
+ *code = RuleTable[ID_FLOAT][symlID];
}
#endif
@@ -7190,8 +7204,8 @@ int set_metaL(Ast *ast) {
if (ptr->left->id == AST_NAME) {
type = NB_META_L;
- } else if (ptr->left->id == AST_INTVAR) {
- type = NB_INTVAR;
+ } else if (ptr->left->id == AST_FLOATVAR) {
+ type = NB_FLOATVAR;
} else if (ptr->left->id == AST_AGENT) {
printf("Error: `%s' isn't a name in the left-hand side of this rule active pair.\n", ptr->left->left->sym);
return 0;
@@ -7218,8 +7232,8 @@ int set_metaR(Ast *ast) {
if (ptr->left->id == AST_NAME) {
type = NB_META_R;
- } else if (ptr->left->id == AST_INTVAR) {
- type = NB_INTVAR;
+ } else if (ptr->left->id == AST_FLOATVAR) {
+ type = NB_FLOATVAR;
} else if (ptr->left->id == AST_AGENT) {
printf("Error: `%s' isn't a name in the right-hand side of this rule active pair.\n", ptr->left->left->sym);
return 0;
@@ -7237,13 +7251,13 @@ int set_metaR(Ast *ast) {
}
-void set_metaL_as_IntName(Ast *ast) {
- CmEnv_set_symbol_as_meta(ast->left->sym, VM_OFFSET_ANNOTATE_L, NB_INTVAR);
+void set_metaL_as_FloatName(Ast *ast) {
+ CmEnv_set_symbol_as_meta(ast->left->sym, VM_OFFSET_ANNOTATE_L, NB_FLOATVAR);
}
-void set_metaR_as_IntName(Ast *ast) {
- CmEnv_set_symbol_as_meta(ast->left->sym, VM_OFFSET_ANNOTATE_R, NB_INTVAR);
+void set_metaR_as_FloatName(Ast *ast) {
+ CmEnv_set_symbol_as_meta(ast->left->sym, VM_OFFSET_ANNOTATE_R, NB_FLOATVAR);
}
@@ -7280,14 +7294,14 @@ int get_ruleagentID(Ast *ruleAgent) {
} else if (ruleAgent->id == AST_NIL) {
id = ID_NIL;
- } else if (ruleAgent->id == AST_INTVAR) {
- id = ID_INT;
+ } else if (ruleAgent->id == AST_FLOATVAR) {
+ id = ID_FLOAT;
} else if (ruleAgent->id == AST_NAME) {
id = ID_WILDCARD;
- } else if (strcmp((char *)ruleAgent->left->sym, "Int") == 0) {
- id = ID_INTAGENT;
+ } else if (strcmp((char *)ruleAgent->left->sym, "Float") == 0) {
+ id = ID_FLOATAGENT;
} else {
id = IdTable_getid_builtin_funcAgent(ruleAgent);
@@ -7359,7 +7373,7 @@ int make_rule_oneway(Ast *ast) {
idR = get_ruleagentID(ruleAgent_R);
// Peel the tuple1 such as `(int i)'
- // int i は (AST_INTVAR (AST_SYM sym NULL) NULL) として構築されているので
+ // double i は (AST_FLOATVAR (AST_SYM sym NULL) NULL) として構築されているので
// ID_TUPLE1 である間は読み飛ばす
while (idR == ID_TUPLE1) {
ruleAgent_R = ruleAgent_R->right->left;
@@ -7413,7 +7427,7 @@ int make_rule_oneway(Ast *ast) {
// IMPORTANT:
// The first two codes stores arities of idL and idR, respectively.
- if ((idL == ID_INT) || (idL == ID_WILDCARD)) {
+ if ((idL == ID_FLOAT) || (idL == ID_WILDCARD)) {
arity = 0;
} else {
arity = get_arity_on_ast(ruleAgent_L);
@@ -7427,7 +7441,7 @@ int make_rule_oneway(Ast *ast) {
IdTable_set_arity(idL, arity);
code[0] = (void *)(unsigned long)arity;
- if ((idR == ID_INT) || (idR == ID_WILDCARD)) {
+ if ((idR == ID_FLOAT) || (idR == ID_WILDCARD)) {
arity = 0;
} else {
arity = get_arity_on_ast(ruleAgent_R);
@@ -7446,9 +7460,9 @@ int make_rule_oneway(Ast *ast) {
- if (idL == ID_INT) {
- set_metaL_as_IntName(ruleAgent_L);
- CmEnv.annotateL = ANNOTATE_INT_MODIFIER; // to prevent putting Free_L
+ if (idL == ID_FLOAT) {
+ set_metaL_as_FloatName(ruleAgent_L);
+ CmEnv.annotateL = ANNOTATE_FLOAT_MODIFIER; // to prevent putting Free_L
} else if (idL == ID_WILDCARD) {
set_metaL_as_AnyAgent(ruleAgent_L);
CmEnv.annotateL = ANNOTATE_WILDCARD; // to prevent putting Free_L
@@ -7458,9 +7472,9 @@ int make_rule_oneway(Ast *ast) {
}
}
- if (idR == ID_INT) {
- set_metaR_as_IntName(ruleAgent_R);
- CmEnv.annotateR = ANNOTATE_INT_MODIFIER; // to prevent putting Free_R
+ if (idR == ID_FLOAT) {
+ set_metaR_as_FloatName(ruleAgent_R);
+ CmEnv.annotateR = ANNOTATE_FLOAT_MODIFIER; // to prevent putting Free_R
} else if (idR == ID_WILDCARD) {
set_metaR_as_AnyAgent(ruleAgent_R);
CmEnv.annotateR = ANNOTATE_WILDCARD; // to prevent putting Free_R
@@ -7593,16 +7607,16 @@ int make_rule_oneway(Ast *ast) {
// #define DEBUG_PUT_RULE_CODE
#ifdef DEBUG_PUT_RULE_CODE
if (((strcmp(IdTable_get_name(idL), "Fib") == 0) &&
- (idR == ID_INT))
+ (idR == ID_FLOAT))
||
((strcmp(IdTable_get_name(idL), "fib") == 0) &&
- (idR == ID_INT))
+ (idR == ID_FLOAT))
||
((strcmp(IdTable_get_name(idL), "Ack") == 0) &&
- (idR == ID_INT))
+ (idR == ID_FLOAT))
||
((strcmp(IdTable_get_name(idL), "Ackm") == 0) &&
- (idR == ID_INT))
+ (idR == ID_FLOAT))
||
((strcmp(IdTable_get_name(idL), "MergeCC") == 0) &&
(idR == ID_CONS))
@@ -7618,7 +7632,7 @@ int make_rule_oneway(Ast *ast) {
}
#endif
-
+#ifndef SUPPRESS_OUTPUT
#ifdef PUT_RULE_COMPILATION_TIME
time=stop_timer(&t);
printf("(Compilation of %s><%s takes %.6f sec)\n",
@@ -7626,6 +7640,7 @@ int make_rule_oneway(Ast *ast) {
IdTable_get_name(idR),
(double)(time)/1000000.0);
#endif
+#endif
return 1;
@@ -8039,7 +8054,7 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
// puts("pushi reg fixint");
{
VALUE a1 = reg[(unsigned long)code[++pc]];
- VALUE a2 = (unsigned long)code[++pc];
+ VALUE a2 = (VALUE)code[++pc];
PUSH(vm, a1, a2);
}
goto *code[++pc];
@@ -8059,8 +8074,10 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_LOADI:
// puts("loadi num dest");
- i = (long)code[++pc];
- reg[(unsigned long)code[++pc]] = i;
+ {
+ VALUE val = (VALUE)code[++pc];
+ reg[(unsigned long)code[++pc]] = val;
+ }
goto *code[++pc];
@@ -8195,20 +8212,20 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_ADD:
// puts("ADD src1 src2 dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- long j = FIX2INT(reg[(unsigned long)code[++pc]]);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[++pc]] = INT2FIX(i+j);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(i+j);
}
goto *code[++pc];
E_SUB:
// puts("SUB src1 src2 dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- long j = FIX2INT(reg[(unsigned long)code[++pc]]);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[++pc]] = INT2FIX(i-j);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(i-j);
}
goto *code[++pc];
@@ -8216,10 +8233,10 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_ADDI:
// puts("ADDI src int dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- long j = (unsigned long)code[++pc];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT((VALUE)code[++pc]);
- reg[(unsigned long)code[++pc]] = INT2FIX(i+j);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(i+j);
}
goto *code[++pc];
@@ -8227,10 +8244,10 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_SUBI:
// puts("SUBI src int dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- long j = (unsigned long)code[++pc];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT((VALUE)code[++pc]);
- reg[(unsigned long)code[++pc]] = INT2FIX(i-j);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(i-j);
}
goto *code[++pc];
@@ -8238,10 +8255,10 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_MUL:
// puts("MUL src1 src2 dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- long j = FIX2INT(reg[(unsigned long)code[++pc]]);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[++pc]] = INT2FIX(i*j);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(i*j);
}
goto *code[++pc];
@@ -8249,35 +8266,33 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_DIV:
// puts("DIV src1 src2 dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- long j = FIX2INT(reg[(unsigned long)code[++pc]]);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[++pc]] = INT2FIX(i/j);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(i/j);
}
goto *code[++pc];
E_MOD:
// puts("MOD src1 src2 dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- long j = FIX2INT(reg[(unsigned long)code[++pc]]);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[++pc]] = INT2FIX(i%j);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(fmod(i, j));
}
goto *code[++pc];
E_LT:
// puts("LT src1 src2 dest");
{
- // int i = FIX2INT(reg[(unsigned long)code[pc++]]);
- // int j = FIX2INT(reg[(unsigned long)code[pc++]]);
- long i = reg[(unsigned long)code[++pc]];
- long j = reg[(unsigned long)code[++pc]];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
if (i<j) {
- reg[(unsigned long)code[++pc]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(1.0f);
} else {
- reg[(unsigned long)code[++pc]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(0.0f);
}
}
goto *code[++pc];
@@ -8286,13 +8301,13 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_LE:
// puts("LT src1 src2 dest");
{
- long i = reg[(unsigned long)code[++pc]];
- long j = reg[(unsigned long)code[++pc]];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
if (i<=j) {
- reg[(unsigned long)code[++pc]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(1.0f);
} else {
- reg[(unsigned long)code[++pc]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(0.0f);
}
}
goto *code[++pc];
@@ -8301,13 +8316,13 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_EQ:
// puts("EQ src1 src2 dest");
{
- long i = reg[(unsigned long)code[++pc]];
- long j = reg[(unsigned long)code[++pc]];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
if (i==j) {
- reg[(unsigned long)code[++pc]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(1.0f);
} else {
- reg[(unsigned long)code[++pc]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(0.0f);
}
}
goto *code[++pc];
@@ -8317,13 +8332,13 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_EQI:
// puts("EQI src1 fixint dest");
{
- long i = reg[(unsigned long)code[++pc]];
- long j = (unsigned long)code[++pc];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT((VALUE)code[++pc]);
if (i==j) {
- reg[(unsigned long)code[++pc]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(1.0f);
} else {
- reg[(unsigned long)code[++pc]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(0.0f);
}
}
goto *code[++pc];
@@ -8333,13 +8348,13 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_NE:
// puts("NE src1 src2 dest");
{
- long i = reg[(unsigned long)code[++pc]];
- long j = reg[(unsigned long)code[++pc]];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
if (i!=j) {
- reg[(unsigned long)code[++pc]] = INT2FIX(1);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(1.0f);
} else {
- reg[(unsigned long)code[++pc]] = INT2FIX(0);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(0.0f);
}
}
goto *code[++pc];
@@ -8349,8 +8364,8 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_LT_R0:
// puts("LT_R0 src1 src2");
{
- long i = reg[(unsigned long)code[++pc]];
- long j = reg[(unsigned long)code[++pc]];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
if (i<j) {
reg[0] = 1;
@@ -8364,8 +8379,8 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_LE_R0:
// puts("LE_R0 src1 src2");
{
- long i = reg[(unsigned long)code[++pc]];
- long j = reg[(unsigned long)code[++pc]];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
if (i<=j) {
reg[0] = 1;
@@ -8379,8 +8394,8 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_EQ_R0:
// puts("EQ_R0 src1 src2");
{
- long i = reg[(unsigned long)code[++pc]];
- long j = reg[(unsigned long)code[++pc]];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
if (i==j) {
reg[0] = 1;
@@ -8394,8 +8409,8 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_EQI_R0:
// puts("EQI_R0 src1 int");
{
- long i = reg[(unsigned long)code[++pc]];
- long j = (unsigned long)code[++pc];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT((VALUE)code[++pc]);
if (i==j) {
reg[0] = 1;
@@ -8411,8 +8426,8 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
E_NE_R0:
// puts("NE_R0 src1 src2");
{
- long i = reg[(unsigned long)code[++pc]];
- long j = reg[(unsigned long)code[++pc]];
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ double j = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
if (i!=j) {
reg[0] = 1;
@@ -8430,7 +8445,7 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
// the pc is a relative address, not absolute one!
{
long i = reg[(unsigned long)code[++pc]];
- if (!FIX2INT(i)) {
+ if (!(int)FIX2FLOAT(i)) {
int j = (unsigned long)code[++pc];
pc += j;
} else {
@@ -8460,7 +8475,7 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
// puts("JMPNEQ0 reg pc");
{
long i = reg[(unsigned long)code[++pc]];
- if (FIX2INT(i)) {
+ if ((int)FIX2FLOAT(i)) {
int j = (unsigned long)code[++pc];
pc += j;
} else {
@@ -8608,14 +8623,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY)
// puts("UNM src dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[++pc]] = INT2FIX(-1 * i);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(-1.0f * i);
}
#else
// puts("UNM dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[pc]] = INT2FIX(-1 * i);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[pc]] = FLOAT2FIX(-1.0f * i);
}
#endif
goto *code[++pc];
@@ -8625,14 +8640,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY)
// puts("RAND src dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[++pc]] = INT2FIX(rand() % i);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX((double)(rand() % (int)i));
}
#else
// puts("RAND dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[pc]] = INT2FIX(rand() % i);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[pc]] = FLOAT2FIX((double)(rand() % (int)i));
}
#endif
goto *code[++pc];
@@ -8642,14 +8657,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY)
// puts("INC src dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[++pc]] = INT2FIX(++i);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(++i);
}
#else
// puts("INC src");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[pc]] = INT2FIX(++i);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[pc]] = FLOAT2FIX(++i);
}
#endif
goto *code[++pc];
@@ -8659,14 +8674,14 @@ void *exec_code(int mode, VirtualMachine * restrict vm, void * restrict *code) {
#if !defined(OPTIMISE_TWO_ADDRESS) || !defined(OPTIMISE_TWO_ADDRESS_UNARY)
// puts("DEC src dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[++pc]] = INT2FIX(--i);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[++pc]] = FLOAT2FIX(--i);
}
#else
// puts("DEC dest");
{
- long i = FIX2INT(reg[(unsigned long)code[++pc]]);
- reg[(unsigned long)code[pc]] = INT2FIX(--i);
+ double i = FIX2FLOAT(reg[(unsigned long)code[++pc]]);
+ reg[(unsigned long)code[pc]] = FLOAT2FIX(--i);
}
#endif
@@ -8742,8 +8757,8 @@ loop_a2IsFixnum:
if (IS_FIXNUM(a1)) {
printf("Runtime ERROR: "); puts_term(a1); printf("~"); puts_term(a2);
- printf("\nInteger %ld >< %ld can not be used as an active pair\n",
- FIX2INT(a1), FIX2INT(a2));
+ printf("\nFloat %f >< %f can not be used as an active pair\n",
+ FIX2FLOAT(a1), FIX2FLOAT(a2));
#ifndef THREAD
mark_and_sweep();
return;
@@ -8762,7 +8777,6 @@ loop_a2IsFixnum:
if (code == NULL) {
-
#ifdef INPLA_USE_BUILTINS
// ------------------------------------------------
// built-in: BUILT-IN_OP >< int
@@ -8919,8 +8933,6 @@ loop_agent_a1_a2_this_order:
#include "builtin_OP-OP.inc.c"
// ------------------------------------------------
#endif
-
-
// Wildcard Agents
code = RuleTable_get_code(BASIC(a1)->id, ID_WILDCARD, &result);
@@ -9234,7 +9246,7 @@ typedef struct {
int SimulationInfo_getid(VALUE ptr) {
if (IS_FIXNUM(ptr)) {
- return ID_INT;
+ return ID_FLOAT;
}
if (IS_NAMEID(BASIC(ptr)->id)) {
@@ -9393,11 +9405,13 @@ void SimulationInfo_execution_loop(void) {
step++;
-
+
+ #ifdef COUNT_INTERACTION
if (SimulationInfo.verbose_stacked_eq) {
printf("\t\t;");
printf("%lu interactions\n",VM_Get_InteractionCount(&VM));
}
+ #endif
fflush(NULL);
@@ -9413,14 +9427,16 @@ void SimulationInfo_execution_loop(void) {
int exec(Ast *at) {
// Ast at: (AST_BODY stmlist aplist)
- unsigned long long t, time;
void** code = (void**)malloc(sizeof(void*) * MAX_EXEC_VMCODE_SEQUENCE);
if (code == NULL) {
puts("Error: Malloc error for code in exec func.");
exit(-1);
}
+ #ifndef SUPPRESS_OUTPUT
start_timer(&t);
+ unsigned long long t, time;
+ #endif
CmEnv_clear_all();
@@ -9494,14 +9510,18 @@ int exec(Ast *at) {
- if (left->id == AST_NAME) {
+ if ((left->id == AST_NAME) || (left->id == AST_FLOATVAR)) {
select_kind_of_push(left, p1, p2);
- } else if (right->id == AST_NAME) {
+ } else if ((right->id == AST_NAME) || (right->id == AST_FLOATVAR)) {
select_kind_of_push(right, p2, p1);
} else {
- IMCode_genCode2(OP_PUSH, p1, p2);
+ if ((left->id == AST_FLOAT) || (right->id == AST_FLOAT)) {
+ IMCode_genCode2(OP_MYPUSH, p1, p2);
+ } else {
+ IMCode_genCode2(OP_PUSH, p1, p2);
+ }
}
at = ast_getTail(at);
@@ -9583,8 +9603,8 @@ int exec(Ast *at) {
eval_equation(&VM, t1, t2);
}
}
-
+#ifndef SUPPRESS_OUTPUT
time=stop_timer(&t);
#ifdef COUNT_INTERACTION
@@ -9602,6 +9622,7 @@ int exec(Ast *at) {
printf("(%.2f sec)\n",
(double)(time)/1000000);
#endif
+#endif
#ifdef COUNT_MKAGENT
printf("(%d mkAgent calls)\n", NumberOfMkAgent);
@@ -9758,8 +9779,9 @@ void tpool_destroy(void) {
int exec(Ast *at) {
// Ast at: (AST_BODY stmlist aplist)
-
+ #ifndef SUPPRESS_OUTPUT
unsigned long long t, time;
+ #endif
int eqsnum = 0;
void** code = (void**)malloc(sizeof(void*) * MAX_EXEC_VMCODE_SEQUENCE);
@@ -9776,7 +9798,10 @@ int exec(Ast *at) {
}
#endif
+ #ifndef SUPPRESS_OUTPUT
start_timer(&t);
+ unsigned long long t, time;
+ #endif
CmEnv_clear_all();
@@ -9826,14 +9851,18 @@ int exec(Ast *at) {
}
- if (left->id == AST_NAME) {
+ if ((left->id == AST_NAME) || (left->id == AST_FLOATVAR)) {
select_kind_of_push(left, p1, p2);
- } else if (right->id == AST_NAME) {
+ } else if ((right->id == AST_NAME) || (right->id == AST_FLOATVAR)) {
select_kind_of_push(right, p2, p1);
} else {
- IMCode_genCode2(OP_PUSH, p1, p2);
+ if ((left->id == AST_FLOAT) || (right->id == AST_FLOAT)) {
+ IMCode_genCode2(OP_MYPUSH, p1, p2);
+ } else {
+ IMCode_genCode2(OP_PUSH, p1, p2);
+ }
}
eqsnum++; // for distrubution
@@ -9930,6 +9959,7 @@ int exec(Ast *at) {
}
+#ifndef SUPPRESS_OUTPUT
time=stop_timer(&t);
#ifdef COUNT_INTERACTION
@@ -9949,6 +9979,7 @@ int exec(Ast *at) {
(double)(time)/1000000.0,
MaxThreadsNum);
#endif
+#endif
return 0;
@@ -10355,6 +10386,7 @@ int main(int argc, char *argv[])
}
}
+#ifndef SUPPRESS_OUTPUT
#ifndef THREAD
if (WHNFinfo.enable) {
printf("Inpla %s (Weak Strategy) : Interaction nets as a programming language", VERSION);
@@ -10372,6 +10404,7 @@ int main(int argc, char *argv[])
printf("Inpla %s : Interaction nets as a programming language", VERSION);
printf(" [built: %s]\n", BUILT_DATE);
#endif
+#endif
diff --git a/src/lex.l b/src/lex.l
index d6a3064..fd69ddb 100644
--- a/src/lex.l
+++ b/src/lex.l
@@ -100,7 +100,7 @@ int yycolumn = 1;
<INITIAL>"<=" return(LE);
<INITIAL>"<<" return (ABR);
-<INITIAL>"int" return(INT);
+<INITIAL>"float" return(FLOAT);
<INITIAL>"let" return(LET);
<INITIAL>"in" return(IN);
@@ -132,7 +132,7 @@ int yycolumn = 1;
return (NAME);}
<INITIAL>[A-Z][a-zA-Z0-9_'\.]* { yylval.chval = strdup(yytext);
return (AGENT);}
-<INITIAL>[0-9]+ { yylval.longval = atol(yytext);
+<INITIAL>[0-9]+(\.[0-9]*)?([eE][+-]?[0-9]+)? { yylval.doubleval = atof(yytext);
return (NUMERAL_LITERAL);}
<INITIAL>"//"[^\n]* ; //comment
diff --git a/src/mytype.h b/src/mytype.h
index bdfbfee..a1e6e81 100644
--- a/src/mytype.h
+++ b/src/mytype.h
@@ -53,8 +53,20 @@ typedef struct EQList_tag {
#define FIXNUM_FLAG 0x01
-#define INT2FIX(i) ((VALUE)(((long)(i) << 1) | FIXNUM_FLAG))
-#define FIX2INT(i) ((long)(i) >> 1)
+
+static inline VALUE FLOAT2FIX(double f) {
+ union { float f; unsigned int i; } u;
+ u.f = (float)f;
+ VALUE v = u.i;
+ return (v << 32) | FIXNUM_FLAG;
+}
+
+static inline double FIX2FLOAT(VALUE v) {
+ union { float f; unsigned int i; } u;
+ u.i = (unsigned int)(v >> 32);
+ return (double)u.f;
+}
+
#define IS_FIXNUM(i) ((VALUE)(i) & FIXNUM_FLAG)
diff --git a/src/name_table.h b/src/name_table.h
index a739908..54ba2f7 100644
--- a/src/name_table.h
+++ b/src/name_table.h
@@ -21,7 +21,7 @@ typedef struct NameList {
struct NameList *next;
} NameList;
-#define NAME_HASHSIZE 127
+#define NAME_HASHSIZE 65535
//static NameList *NameHashTable[NAME_HASHSIZE]; // HashTable for name strings
// It should be called at first, and never called after that.