From 0df7f6fa71cea5de0e041df80854d307930e418d Mon Sep 17 00:00:00 2001 From: Shinya Sato Date: Tue, 2 Nov 2021 16:05:52 +0900 Subject: v0.5.1 --- src/inpla.l | 193 ------------------------------------------------------- src/inpla.y | 103 +++++++++++++---------------- src/lex.l | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/name_table.c | 16 +++-- 4 files changed, 248 insertions(+), 257 deletions(-) delete mode 100644 src/inpla.l create mode 100644 src/lex.l diff --git a/src/inpla.l b/src/inpla.l deleted file mode 100644 index 85bf522..0000000 --- a/src/inpla.l +++ /dev/null @@ -1,193 +0,0 @@ -%{ -#include -#include -#include "linenoise/linenoise.h" - -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result = mygetinput(buf, max_size); - -static int mygetinput(char *buf, int size) { - char *line; - if (feof(yyin)) return YY_NULL; - - if (yyin!=stdin) { - int len; - char ch; - for (len = 0; len < size; len++) { - ch = getc(yyin); - if (ch == EOF) - break; - buf[len] = ch; - } - return len; - } - - linenoiseSetMultiLine(1); - if (yylineno == 1) { - line = linenoise(">>> "); - } else { - line = linenoise("... "); - } - if(!line) return YY_NULL; - if(strlen(line) > size-2){ - fprintf(stderr,"input line too long\n"); - return YY_NULL; - } - sprintf(buf, "%s\n", line); - linenoiseHistoryAdd(line); - linenoiseHistorySave(".inpla.history.txt"); - free(line); - return strlen(buf); -} - - -//#undef YY_INPUT -//#define YYINPUT(buf, result, max_size) result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); - - -/************************************ - Strings -*************************************/ -#define MAX_STRING_LENGTH 1024 -static char ParseStringBuffer[MAX_STRING_LENGTH]; -static int nextPtr_ParseStringBuffer = 0; -void Parse_StringBuffer_reInit() { - nextPtr_ParseStringBuffer = 0; -} - -void Parse_addString(char ch) { - ParseStringBuffer[nextPtr_ParseStringBuffer] = ch; - nextPtr_ParseStringBuffer++; -} - -char *Parse_closeStringBuffer() { - char *ret; - ParseStringBuffer[nextPtr_ParseStringBuffer]='\0'; - ret = ParseStringBuffer; - return ret; -} - - - -%} - -%option nounput -%option yylineno -%option noyywrap -%x STRING_STATE COM_STATE -%% -";" return (DELIMITER); -":" return (COLON); -"(" return (LP); -")" return (RP); -"{" return LC; -"}" return RC; -"[" return LB; -"]" return RB; -"," return (COMMA); -"><" return (CROSS); -"=>" return (TO); -"~" return (CNCT); -"-" return (SUB); -"|" return(PIPE); -"&" return(AMP); -"=" return(LD); -"==" return(EQUAL); -"!=" return(NE); -">" return(GT); -">=" return(GE); -"<" return(LT); -"<=" return(LE); -"+" return (ADD); -"*" return (MUL); -"/" return (DIV); -"%" return (MOD); -"_" return (ANY); -"<<" return (ABR); - -"int" return(INT); - -"let" return(LET); -"in" return(IN); -"end" return(END); - -"where" return(WHERE); - -"if" return(IF); -"then" return(THEN); -"else" return(ELSE); - -"interface" return(INTERFACE); -"ifce" return(IFCE); - -"prnat" return(PRNAT); -"free" return(FREE); -"exit" return(EXIT); - -"rand" return(RAND); - -"const" return(DEF); - -"use" return(USE); - -"*L" return(ANNOTATE_L); -"*R" return(ANNOTATE_R); -[a-z][a-zA-Z0-9_'\.]* { yylval.chval = strdup(yytext); - return (NAME);} -[A-Z][a-zA-Z0-9_'\.]* { yylval.chval = strdup(yytext); - return (AGENT);} -[0-9]+ { yylval.intval = atoi(yytext); - return (INT_LITERAL);} - -"//"[^\n]* ; //comment -"/*" BEGIN(COM_STATE); -. ; -\n ; -"*/" BEGIN INITIAL; //comment - -\r\n ; -[\n|\r] ; -[ \t]+ ; -<> {return END_OF_FILE;} -\" { - Parse_StringBuffer_reInit(); - BEGIN STRING_STATE; -} - -. {return yytext[0];} - - - - -\" { - yylval.chval = strdup(Parse_closeStringBuffer()); - BEGIN INITIAL; - return STRING_LITERAL; -} -\n { -// Parse_addString('\n'); -yyerror("Unterminated string"); -BEGIN(INITIAL); -return DELIMITER; -} -\\\" Parse_addString('"'); -\\n Parse_addString('\n'); -\\t Parse_addString('\t'); -\\\\ Parse_addString('\\'); -. Parse_addString(yytext[0]); -%% - -void pushFP(FILE *fp) { - yypush_buffer_state(yy_create_buffer(fp, YY_BUF_SIZE)); -} - -int popFP() { - yypop_buffer_state(); - if (! YY_CURRENT_BUFFER ) { - yyterminate(); - return 0; - } - return 1; -} - - diff --git a/src/inpla.y b/src/inpla.y index 1545b81..7b13db5 100644 --- a/src/inpla.y +++ b/src/inpla.y @@ -21,7 +21,7 @@ //#define COUNT_CNCT // count of execution of JMP_CNCT //#define COUNT_MKAGENT // count of execution fo mkagent -//#define CELL_USE_VERBOSE // count of memory access +#define CELL_USE_VERBOSE // count of memory access @@ -48,8 +48,8 @@ int ActiveThreadNum=0; //#define YYDEBUG 1 -#define VERSION "0.5.0" -#define BUILT_DATE "28 Oct. 2021" +#define VERSION "0.5.1" +#define BUILT_DATE "2 Nov. 2021" extern FILE *yyin; @@ -824,40 +824,6 @@ unsigned long getNumOfAvailAgentHeap(Heap *hp) { -/* -VALUE myallocVal(Heap *hp) { - -#ifdef MALLOC - Agent *ptr; - ptr = malloc(sizeof(Agent)); - return ptr; -#else - - int i,idx; - - idx = hp->lastAlloc; - - for (i=0; i < hp->size; i++) { - if (!IS_FLAG_AVAIL(((Val *)hp->heap)[idx].basic.id)) { - idx++; - if (idx >= hp->size) { - idx -= hp->size; - } - continue; - } - TOGGLE_FLAG_AVAIL(((Val *)hp->heap)[idx].basic.id); - hp->lastAlloc = idx; - return (VALUE)&(((Val *)hp->heap)[idx]); - } - - printf("\nCritical ERROR: All %d term cells have been consumed.\n", hp->size); - printf("You should have more term cells with -c option.\n"); - exit(-1); - -#endif - -} -*/ @@ -904,17 +870,6 @@ VALUE makeName(VirtualMachine *vm) { } -/* -VALUE makeVal_int(VirtualMachine *vm, int num) { - VALUE ptr; - ptr = myallocVal(&vm->agentHeap); - - BASIC(ptr)->id = ID_INT; - RVAL(ptr)->u.intval = num; - return ptr; -} -*/ - /********************************** Counter for Interaction times @@ -1325,7 +1280,8 @@ void freeName(VALUE ptr) { void freeAgentRec(VALUE ptr) { loop: - if ((IS_FIXNUM(ptr)) || (ptr == (VALUE)NULL)) { + if ((IS_FLAG_AVAIL(BASIC(ptr)->id)) || + (IS_FIXNUM(ptr)) || (ptr == (VALUE)NULL)) { return; } else if (IS_NAMEID(BASIC(ptr)->id)) { if (ptr == ShowNameHeap) return; @@ -6778,7 +6734,7 @@ loop_a2IsAgent: { // MG(r) ~ (a|b) => *MGp(*r)~a, *MGp(*r)~b #ifdef COUNT_INTERACTION - vm->NumberOfInteraction++; + vm->NumberOfInteraction++; #endif BASIC(a1)->id = ID_MERGER_P; AGENT(a1)->port[1] = (VALUE)NULL; @@ -6798,6 +6754,10 @@ loop_a2IsAgent: case ID_NIL: // *MGP(r)~[] #ifndef THREAD + +#ifdef COUNT_INTERACTION + vm->NumberOfInteraction++; +#endif if (AGENT(a1)->port[1] == (VALUE)NULL) { AGENT(a1)->port[1] = a2; return; @@ -6809,6 +6769,7 @@ loop_a2IsAgent: goto loop; } #else + // AGENT(a1)->port[2] is used as a lock for NIL case if (AGENT(a1)->port[2] == (VALUE)NULL) { if (!(__sync_bool_compare_and_swap(&(AGENT(a1)->port[2]), NULL, a2))) { @@ -6821,6 +6782,9 @@ loop_a2IsAgent: } else if ((AGENT(a1)->port[2] != (VALUE)NULL) && (BASIC(AGENT(a1)->port[2])->id == ID_NIL)) { +#ifdef COUNT_INTERACTION + vm->NumberOfInteraction++; +#endif VALUE a1p0 = AGENT(a1)->port[0]; freeAgent(AGENT(a1)->port[2]); freeAgent(a1); @@ -6835,6 +6799,10 @@ loop_a2IsAgent: // *MGP(r)~x:xs => r~x:w, *MGP(w)~xs; { #ifndef THREAD + +#ifdef COUNT_INTERACTION + vm->NumberOfInteraction++; +#endif VALUE a1p0 = AGENT(a1)->port[0]; VALUE w = makeName(vm); @@ -6845,13 +6813,34 @@ loop_a2IsAgent: a1 = a1p0; goto loop; #else - if (AGENT(a1)->port[1] == (VALUE)NULL) { + // AGENT(a1)->port[1] is used as a lock for CONS case + // AGENT(a1)->port[2] is used as a lock for NIL case + + if (AGENT(a1)->port[2] != (VALUE)NULL) { + // The other MGP finished still, so: + // *MGP(r)~x:xs => r~x:xs; + +#ifdef COUNT_INTERACTION + vm->NumberOfInteraction++; +#endif + VALUE a1p0 = AGENT(a1)->port[0]; + freeAgent(AGENT(a1)->port[2]); // free the lock for NIL + freeAgent(a1); + a1 = a1p0; + goto loop; + + } else if (AGENT(a1)->port[1] == (VALUE)NULL) { if (!(__sync_bool_compare_and_swap(&(AGENT(a1)->port[1]), NULL, a2))) { + // Failure to be locked. goto loop; } - + + // Succeed the lock +#ifdef COUNT_INTERACTION + vm->NumberOfInteraction++; +#endif VALUE a1p0 = AGENT(a1)->port[0]; VALUE w = makeName(vm); @@ -6866,15 +6855,9 @@ loop_a2IsAgent: goto loop; - } else if ((AGENT(a1)->port[2] != (VALUE)NULL) && - (BASIC(AGENT(a1)->port[2])->id == ID_NIL)) { - freeAgent(AGENT(a1)->port[2]); - VALUE a1p0 = AGENT(a1)->port[0]; - freeAgent(a1); - a1 = a1p0; - goto loop; - } else { + // MPG works for the other now. + goto loop; } diff --git a/src/lex.l b/src/lex.l new file mode 100644 index 0000000..85bf522 --- /dev/null +++ b/src/lex.l @@ -0,0 +1,193 @@ +%{ +#include +#include +#include "linenoise/linenoise.h" + +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result = mygetinput(buf, max_size); + +static int mygetinput(char *buf, int size) { + char *line; + if (feof(yyin)) return YY_NULL; + + if (yyin!=stdin) { + int len; + char ch; + for (len = 0; len < size; len++) { + ch = getc(yyin); + if (ch == EOF) + break; + buf[len] = ch; + } + return len; + } + + linenoiseSetMultiLine(1); + if (yylineno == 1) { + line = linenoise(">>> "); + } else { + line = linenoise("... "); + } + if(!line) return YY_NULL; + if(strlen(line) > size-2){ + fprintf(stderr,"input line too long\n"); + return YY_NULL; + } + sprintf(buf, "%s\n", line); + linenoiseHistoryAdd(line); + linenoiseHistorySave(".inpla.history.txt"); + free(line); + return strlen(buf); +} + + +//#undef YY_INPUT +//#define YYINPUT(buf, result, max_size) result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); + + +/************************************ + Strings +*************************************/ +#define MAX_STRING_LENGTH 1024 +static char ParseStringBuffer[MAX_STRING_LENGTH]; +static int nextPtr_ParseStringBuffer = 0; +void Parse_StringBuffer_reInit() { + nextPtr_ParseStringBuffer = 0; +} + +void Parse_addString(char ch) { + ParseStringBuffer[nextPtr_ParseStringBuffer] = ch; + nextPtr_ParseStringBuffer++; +} + +char *Parse_closeStringBuffer() { + char *ret; + ParseStringBuffer[nextPtr_ParseStringBuffer]='\0'; + ret = ParseStringBuffer; + return ret; +} + + + +%} + +%option nounput +%option yylineno +%option noyywrap +%x STRING_STATE COM_STATE +%% +";" return (DELIMITER); +":" return (COLON); +"(" return (LP); +")" return (RP); +"{" return LC; +"}" return RC; +"[" return LB; +"]" return RB; +"," return (COMMA); +"><" return (CROSS); +"=>" return (TO); +"~" return (CNCT); +"-" return (SUB); +"|" return(PIPE); +"&" return(AMP); +"=" return(LD); +"==" return(EQUAL); +"!=" return(NE); +">" return(GT); +">=" return(GE); +"<" return(LT); +"<=" return(LE); +"+" return (ADD); +"*" return (MUL); +"/" return (DIV); +"%" return (MOD); +"_" return (ANY); +"<<" return (ABR); + +"int" return(INT); + +"let" return(LET); +"in" return(IN); +"end" return(END); + +"where" return(WHERE); + +"if" return(IF); +"then" return(THEN); +"else" return(ELSE); + +"interface" return(INTERFACE); +"ifce" return(IFCE); + +"prnat" return(PRNAT); +"free" return(FREE); +"exit" return(EXIT); + +"rand" return(RAND); + +"const" return(DEF); + +"use" return(USE); + +"*L" return(ANNOTATE_L); +"*R" return(ANNOTATE_R); +[a-z][a-zA-Z0-9_'\.]* { yylval.chval = strdup(yytext); + return (NAME);} +[A-Z][a-zA-Z0-9_'\.]* { yylval.chval = strdup(yytext); + return (AGENT);} +[0-9]+ { yylval.intval = atoi(yytext); + return (INT_LITERAL);} + +"//"[^\n]* ; //comment +"/*" BEGIN(COM_STATE); +. ; +\n ; +"*/" BEGIN INITIAL; //comment + +\r\n ; +[\n|\r] ; +[ \t]+ ; +<> {return END_OF_FILE;} +\" { + Parse_StringBuffer_reInit(); + BEGIN STRING_STATE; +} + +. {return yytext[0];} + + + + +\" { + yylval.chval = strdup(Parse_closeStringBuffer()); + BEGIN INITIAL; + return STRING_LITERAL; +} +\n { +// Parse_addString('\n'); +yyerror("Unterminated string"); +BEGIN(INITIAL); +return DELIMITER; +} +\\\" Parse_addString('"'); +\\n Parse_addString('\n'); +\\t Parse_addString('\t'); +\\\\ Parse_addString('\\'); +. Parse_addString(yytext[0]); +%% + +void pushFP(FILE *fp) { + yypush_buffer_state(yy_create_buffer(fp, YY_BUF_SIZE)); +} + +int popFP() { + yypop_buffer_state(); + if (! YY_CURRENT_BUFFER ) { + yyterminate(); + return 0; + } + return 1; +} + + diff --git a/src/name_table.c b/src/name_table.c index 3634dd0..3cbaee3 100644 --- a/src/name_table.c +++ b/src/name_table.c @@ -230,7 +230,12 @@ IDTYPE NameTable_get_set_id(char *key) { -// Whether the given 'term' has a name node 'keynode'. + + + + + +// Whether the given 'term' has a node 'keynode'. int term_has_keynode(VALUE keynode, VALUE term) { int i; @@ -266,8 +271,10 @@ int term_has_keynode(VALUE keynode, VALUE term) { int keynode_exists_in_another_term(VALUE keynode, VALUE *connected_from) { - // It returns how many occurs in terms connected from global names. - // Also, the one of the terms is stored in the 'connected_from'. + // It returns how times the keynode occurs in + // terms connected from global names. + // When there are such connected terms, + // one of these will be stored in the 'connected_from' as the result. int i, result=0; NameList *at; @@ -300,7 +307,8 @@ int keynode_exists_in_another_term(VALUE keynode, VALUE *connected_from) { VALUE replace_keynode(VALUE keynode, VALUE term, VALUE heap) { - + // heap[term/keynode] + if ((heap == (VALUE)NULL) || (IS_FIXNUM(heap))) { return heap; } -- cgit v1.2.3