From 8114584f241788579a7a8467d245cf9175eac818 Mon Sep 17 00:00:00 2001 From: lquint Date: Tue, 13 Jul 2021 09:45:42 +0200 Subject: [PATCH] update --- parse | Bin 0 -> 28200 bytes parse.c | 186 ++++++++++++++++++++---------------------------------- parse.leg | 73 ++------------------- 3 files changed, 72 insertions(+), 187 deletions(-) create mode 100755 parse diff --git a/parse b/parse new file mode 100755 index 0000000000000000000000000000000000000000..3c8c58e157a8c35684519fc235c8f9c84d89252f GIT binary patch literal 28200 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 literal 0 HcmV?d00001 diff --git a/parse.c b/parse.c index 4ba8a73..a4599a6 100644 --- a/parse.c +++ b/parse.c @@ -256,76 +256,10 @@ Symbol *intern(char *name){ } -int binary_search(SymbolTable *st, char *c){ - int start=0,end=st->length-1; - int m=0; - while(end-start>1){ - - m=(end+start)/2; //printf("char : %s\n %s",c,st->elements[m]->name); - // printf("start : %i End : %i\n Compare : %i\n",start,end,strcmp(c,st->elements[m]->name));/**/ - if(strcmp(c,st->elements[m]->name)==0){ - return m; - } - else if(strcmp(c,st->elements[m]->name)<0){ - end=m-1; - } - else{ - start=m+1; - } - m=(end+start)/2; - } - // printf("Start : %i, m : %i, end : %i char : %s size :%i\n",start,m,end,c,st->length); - if(strcmp(c,st->elements[m]->name)<0){ - return start; - } - else{ - return end; - } - -} - - -void addSymbol(SymbolTable *symbolTable, Symbol *symbol) { - - if(symbolTable->length==0){ - - symbolTable->length++; - symbolTable->elements= realloc(symbolTable->elements,sizeof(Symbol) * symbolTable->length); - symbolTable->elements[0]=symbol;//printf("indice de %s = %i\n",symbolTable->elements[0]->name,0); - return; - } - else{ - - - symbolTable->length++; - symbolTable->elements= realloc(symbolTable->elements,sizeof(Symbol*) * symbolTable->length); - int indice=binary_search(symbolTable, symbol->name); - - for(int k=symbolTable->length-1;k>indice;k--){ - symbolTable->elements[k]=symbolTable->elements[k-1]; - } - symbolTable->elements[indice]=symbol;//printf("indice de %s = %i\n",symbolTable->elements[indice]->name,indice); - - } - -} - -void setRule(SymbolTable *symbolTable, char *name, Node *rule) { - for (int i= 0; i < symbolTable->length;i++) { - if (strcmp(symbolTable->elements[i]->name, name) == 0) { - symbolTable->elements[i]->rule= rule; - break; - } - } +void setRule(char *name, Node *rule){ + intern(name)->rule=rule; } -void arrayAppend(Array *array, Node *statement) { - array->length++; - array->elements= realloc(array->elements,sizeof(Node*) * array->length); - array->elements[array->length-1] = statement; - } - - #define YYSTYPE Node * YYSTYPE yylval = 0; @@ -607,11 +541,11 @@ YY_RULE(int) yy_atom(yycontext *yy); /* 10 */ YY_RULE(int) yy_postfix(yycontext *yy); /* 9 */ YY_RULE(int) yy_prefix(yycontext *yy); /* 8 */ YY_RULE(int) yy_and(yycontext *yy); /* 7 */ -YY_RULE(int) yy_or(yycontext *yy); /* 6 */ -YY_RULE(int) yy_expression(yycontext *yy); /* 5 */ -YY_RULE(int) yy__(yycontext *yy); /* 4 */ -YY_RULE(int) yy_id(yycontext *yy); /* 3 */ -YY_RULE(int) yy_declaration(yycontext *yy); /* 2 */ +YY_RULE(int) yy_expression(yycontext *yy); /* 6 */ +YY_RULE(int) yy__(yycontext *yy); /* 5 */ +YY_RULE(int) yy_id(yycontext *yy); /* 4 */ +YY_RULE(int) yy_declaration(yycontext *yy); /* 3 */ +YY_RULE(int) yy_or(yycontext *yy); /* 2 */ YY_RULE(int) yy_start(yycontext *yy); /* 1 */ YY_ACTION(void) yy_1_dot(yycontext *yy, char *yytext, int yyleng) @@ -621,7 +555,7 @@ YY_ACTION(void) yy_1_dot(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_dot\n")); { -#line 355 +#line 291 __=mkDot(); } #undef yythunkpos @@ -635,7 +569,7 @@ YY_ACTION(void) yy_1_class(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_class\n")); { -#line 353 +#line 289 __=mkClass(yytext) ; } #undef yythunkpos @@ -649,7 +583,7 @@ YY_ACTION(void) yy_1_string(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_string\n")); { -#line 351 +#line 287 __ = mkString(yytext) ; } #undef yythunkpos @@ -663,7 +597,7 @@ YY_ACTION(void) yy_1_id(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_id\n")); { -#line 349 +#line 285 __ = mkId(intern(yytext)) ; } #undef yythunkpos @@ -678,7 +612,7 @@ YY_ACTION(void) yy_1_rule(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_rule\n")); { -#line 347 +#line 283 __ = mkId(intern(yytext)) ; } #undef yythunkpos @@ -694,7 +628,7 @@ YY_ACTION(void) yy_4_postfix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_4_postfix\n")); { -#line 343 +#line 279 __ = s; } #undef yythunkpos @@ -710,7 +644,7 @@ YY_ACTION(void) yy_3_postfix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_3_postfix\n")); { -#line 342 +#line 278 s = mkPlus(s) ; } #undef yythunkpos @@ -726,7 +660,7 @@ YY_ACTION(void) yy_2_postfix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_2_postfix\n")); { -#line 341 +#line 277 s = mkStar(s) ; } #undef yythunkpos @@ -742,7 +676,7 @@ YY_ACTION(void) yy_1_postfix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_postfix\n")); { -#line 340 +#line 276 s = mkQuery(s) ; } #undef yythunkpos @@ -758,7 +692,7 @@ YY_ACTION(void) yy_2_prefix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_2_prefix\n")); { -#line 338 +#line 274 __ = p; } #undef yythunkpos @@ -774,7 +708,7 @@ YY_ACTION(void) yy_1_prefix(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_prefix\n")); { -#line 337 +#line 273 __ = mkExc(p); } #undef yythunkpos @@ -791,7 +725,7 @@ YY_ACTION(void) yy_2_and(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_2_and\n")); { -#line 335 +#line 271 __ = p ; } #undef yythunkpos @@ -809,7 +743,7 @@ YY_ACTION(void) yy_1_and(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_and\n")); { -#line 334 +#line 270 __ = mkAnd(p, a); ; } #undef yythunkpos @@ -827,7 +761,7 @@ YY_ACTION(void) yy_2_or(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_2_or\n")); { -#line 332 +#line 268 __ = a ; } #undef yythunkpos @@ -845,7 +779,7 @@ YY_ACTION(void) yy_1_or(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_or\n")); { -#line 331 +#line 267 __ = mkOr(o, a) ; } #undef yythunkpos @@ -863,8 +797,8 @@ YY_ACTION(void) yy_1_declaration(yycontext *yy, char *yytext, int yyleng) #define yythunkpos yy->__thunkpos yyprintf((stderr, "do yy_1_declaration\n")); { -#line 329 - setRule(&symbolTable,get(i, Id, symbol)->name, e) ; +#line 263 + setRule(get(i, Id, symbol)->name, e) ; } #undef yythunkpos #undef yypos @@ -1028,25 +962,21 @@ YY_RULE(int) yy_and(yycontext *yy) yyprintf((stderr, " fail %s @ %s\n", "and", yy->__buf+yy->__pos)); return 0; } -YY_RULE(int) yy_or(yycontext *yy) -{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; yyDo(yy, yyPush, 2, 0); - yyprintf((stderr, "%s\n", "or")); - { int yypos37= yy->__pos, yythunkpos37= yy->__thunkpos; if (!yy_and(yy)) goto l38; yyDo(yy, yySet, -2, 0); if (!yy__(yy)) goto l38; if (!yymatchChar(yy, '|')) goto l38; if (!yy__(yy)) goto l38; if (!yy_or(yy)) goto l38; yyDo(yy, yySet, -1, 0); yyDo(yy, yy_1_or, yy->__begin, yy->__end); goto l37; - l38:; yy->__pos= yypos37; yy->__thunkpos= yythunkpos37; if (!yy_and(yy)) goto l36; yyDo(yy, yySet, -2, 0); yyDo(yy, yy_2_or, yy->__begin, yy->__end); - } - l37:; - yyprintf((stderr, " ok %s @ %s\n", "or", yy->__buf+yy->__pos)); yyDo(yy, yyPop, 2, 0); +YY_RULE(int) yy_expression(yycontext *yy) +{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; + yyprintf((stderr, "%s\n", "expression")); if (!yy_or(yy)) goto l36; + yyprintf((stderr, " ok %s @ %s\n", "expression", yy->__buf+yy->__pos)); return 1; l36:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; - yyprintf((stderr, " fail %s @ %s\n", "or", yy->__buf+yy->__pos)); + yyprintf((stderr, " fail %s @ %s\n", "expression", yy->__buf+yy->__pos)); return 0; } YY_RULE(int) yy__(yycontext *yy) { yyprintf((stderr, "%s\n", "_")); - l40:; - { int yypos41= yy->__pos, yythunkpos41= yy->__thunkpos; if (!yy_space(yy)) goto l41; goto l40; - l41:; yy->__pos= yypos41; yy->__thunkpos= yythunkpos41; + l38:; + { int yypos39= yy->__pos, yythunkpos39= yy->__thunkpos; if (!yy_space(yy)) goto l39; goto l38; + l39:; yy->__pos= yypos39; yy->__thunkpos= yythunkpos39; } yyprintf((stderr, " ok %s @ %s\n", "_", yy->__buf+yy->__pos)); return 1; @@ -1056,45 +986,62 @@ YY_RULE(int) yy_id(yycontext *yy) yyprintf((stderr, "%s\n", "id")); yyText(yy, yy->__begin, yy->__end); { #define yytext yy->__text #define yyleng yy->__textlen -if (!(YY_BEGIN)) goto l42; +if (!(YY_BEGIN)) goto l40; #undef yytext #undef yyleng - } if (!yymatchClass(yy, (unsigned char *)"\000\000\000\000\000\000\000\000\376\377\377\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l42; - l43:; - { int yypos44= yy->__pos, yythunkpos44= yy->__thunkpos; if (!yymatchClass(yy, (unsigned char *)"\000\000\000\000\000\000\377\003\376\377\377\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l44; goto l43; - l44:; yy->__pos= yypos44; yy->__thunkpos= yythunkpos44; + } if (!yymatchClass(yy, (unsigned char *)"\000\000\000\000\000\000\000\000\376\377\377\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l40; + l41:; + { int yypos42= yy->__pos, yythunkpos42= yy->__thunkpos; if (!yymatchClass(yy, (unsigned char *)"\000\000\000\000\000\000\377\003\376\377\377\377\377\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l42; goto l41; + l42:; yy->__pos= yypos42; yy->__thunkpos= yythunkpos42; } yyText(yy, yy->__begin, yy->__end); { #define yytext yy->__text #define yyleng yy->__textlen -if (!(YY_END)) goto l42; +if (!(YY_END)) goto l40; #undef yytext #undef yyleng - } if (!yy__(yy)) goto l42; yyDo(yy, yy_1_id, yy->__begin, yy->__end); + } if (!yy__(yy)) goto l40; yyDo(yy, yy_1_id, yy->__begin, yy->__end); yyprintf((stderr, " ok %s @ %s\n", "id", yy->__buf+yy->__pos)); return 1; - l42:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; + l40:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; yyprintf((stderr, " fail %s @ %s\n", "id", yy->__buf+yy->__pos)); return 0; } YY_RULE(int) yy_declaration(yycontext *yy) { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; yyDo(yy, yyPush, 2, 0); - yyprintf((stderr, "%s\n", "declaration")); if (!yy_id(yy)) goto l45; yyDo(yy, yySet, -2, 0); if (!yymatchChar(yy, '=')) goto l45; if (!yy__(yy)) goto l45; if (!yy_expression(yy)) goto l45; yyDo(yy, yySet, -1, 0); yyDo(yy, yy_1_declaration, yy->__begin, yy->__end); + yyprintf((stderr, "%s\n", "declaration")); if (!yy_id(yy)) goto l43; yyDo(yy, yySet, -2, 0); if (!yymatchChar(yy, '=')) goto l43; if (!yy__(yy)) goto l43; if (!yy_expression(yy)) goto l43; yyDo(yy, yySet, -1, 0); yyDo(yy, yy_1_declaration, yy->__begin, yy->__end); yyprintf((stderr, " ok %s @ %s\n", "declaration", yy->__buf+yy->__pos)); yyDo(yy, yyPop, 2, 0); return 1; - l45:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; + l43:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; yyprintf((stderr, " fail %s @ %s\n", "declaration", yy->__buf+yy->__pos)); return 0; } +YY_RULE(int) yy_or(yycontext *yy) +{ int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; yyDo(yy, yyPush, 2, 0); + yyprintf((stderr, "%s\n", "or")); + { int yypos45= yy->__pos, yythunkpos45= yy->__thunkpos; if (!yy_and(yy)) goto l46; yyDo(yy, yySet, -2, 0); if (!yy__(yy)) goto l46; if (!yymatchChar(yy, '|')) goto l46; if (!yy__(yy)) goto l46; if (!yy_or(yy)) goto l46; yyDo(yy, yySet, -1, 0); yyDo(yy, yy_1_or, yy->__begin, yy->__end); goto l45; + l46:; yy->__pos= yypos45; yy->__thunkpos= yythunkpos45; if (!yy_and(yy)) goto l44; yyDo(yy, yySet, -2, 0); yyDo(yy, yy_2_or, yy->__begin, yy->__end); + } + l45:; + yyprintf((stderr, " ok %s @ %s\n", "or", yy->__buf+yy->__pos)); yyDo(yy, yyPop, 2, 0); + return 1; + l44:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; + yyprintf((stderr, " fail %s @ %s\n", "or", yy->__buf+yy->__pos)); + return 0; +} YY_RULE(int) yy_start(yycontext *yy) { int yypos0= yy->__pos, yythunkpos0= yy->__thunkpos; - yyprintf((stderr, "%s\n", "start")); if (!yy_declaration(yy)) goto l46; - l47:; - { int yypos48= yy->__pos, yythunkpos48= yy->__thunkpos; if (!yy_declaration(yy)) goto l48; goto l47; - l48:; yy->__pos= yypos48; yy->__thunkpos= yythunkpos48; + yyprintf((stderr, "%s\n", "start")); + { int yypos48= yy->__pos, yythunkpos48= yy->__thunkpos; if (!yy_or(yy)) goto l49; goto l48; + l49:; yy->__pos= yypos48; yy->__thunkpos= yythunkpos48; if (!yy_declaration(yy)) goto l47; + l50:; + { int yypos51= yy->__pos, yythunkpos51= yy->__thunkpos; if (!yy_declaration(yy)) goto l51; goto l50; + l51:; yy->__pos= yypos51; yy->__thunkpos= yythunkpos51; + } } + l48:; yyprintf((stderr, " ok %s @ %s\n", "start", yy->__buf+yy->__pos)); return 1; - l46:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; + l47:; yy->__pos= yypos0; yy->__thunkpos= yythunkpos0; yyprintf((stderr, " fail %s @ %s\n", "start", yy->__buf+yy->__pos)); return 0; } @@ -1146,7 +1093,7 @@ YY_PARSE(yycontext *) YYRELEASE(yycontext *yyctx) } #endif -#line 362 "parse.leg" +#line 298 "parse.leg" @@ -1223,6 +1170,7 @@ int execute(Node *node, InputBuffer *in) } case Id: { Symbol *symbol= get(node, Id, symbol); + if (0 == symbol->rule) { printf("undefined rule: %s\n", symbol->name); } return execute(symbol->rule, in); } } @@ -1244,6 +1192,8 @@ int main(int argc, char **argv) char *line=0; size_t line_max=0; ssize_t line_len=0; + Symbol *start= intern("start"); + if (!start->rule) perror("no start rule"); while((line_len=getline(&line,&line_max,stdin))>=0){ if(line_len>0 && line[line_len-1]=='\n'){ line[line_len-1]=0; diff --git a/parse.leg b/parse.leg index 8e6cdde..2334526 100644 --- a/parse.leg +++ b/parse.leg @@ -249,77 +249,10 @@ Symbol *intern(char *name){ } -/*int binary_search(SymbolTable *st, char *c){ - int start=0,end=st->length-1; - int m=0; - while(end-start>1){ - - m=(end+start)/2; //printf("char : %s\n %s",c,st->elements[m]->name); - // printf("start : %i End : %i\n Compare : %i\n",start,end,strcmp(c,st->elements[m]->name));/**/ - if(strcmp(c,st->elements[m]->name)==0){ - return m; - } - else if(strcmp(c,st->elements[m]->name)<0){ - end=m-1; - } - else{ - start=m+1; - } - m=(end+start)/2; - } - // printf("Start : %i, m : %i, end : %i char : %s size :%i\n",start,m,end,c,st->length); - if(strcmp(c,st->elements[m]->name)<0){ - return start; - } - else{ - return end; - } - -}*/ - - -/*void addSymbol(SymbolTable *symbolTable, Symbol *symbol) { - - if(symbolTable->length==0){ - - symbolTable->length++; - symbolTable->elements= realloc(symbolTable->elements,sizeof(Symbol) * symbolTable->length); - symbolTable->elements[0]=symbol;//printf("indice de %s = %i\n",symbolTable->elements[0]->name,0); - return; - } - else{ - - - symbolTable->length++; - symbolTable->elements= realloc(symbolTable->elements,sizeof(Symbol*) * symbolTable->length); - int indice=binary_search(symbolTable, symbol->name); - - for(int k=symbolTable->length-1;k>indice;k--){ - symbolTable->elements[k]=symbolTable->elements[k-1]; - } - symbolTable->elements[indice]=symbol;//printf("indice de %s = %i\n",symbolTable->elements[indice]->name,indice); - - } - -}*/ - -void setRule(char *name, Node *rule) { - intern(name)->rule= rule; - /*for (int i= 0; i < symbolTable->length;i++) { - if (strcmp(symbolTable->elements[i]->name, name) == 0) { - symbolTable->elements[i]->rule= rule; - break; - } - }*/ +void setRule(char *name, Node *rule){ + intern(name)->rule=rule; } -/*void arrayAppend(Array *array, Node *statement) { - array->length++; - array->elements= realloc(array->elements,sizeof(Node*) * array->length); - array->elements[array->length-1] = statement; - }*/ - - #define YYSTYPE Node * YYSTYPE yylval = 0; @@ -460,6 +393,8 @@ int main(int argc, char **argv) char *line=0; size_t line_max=0; ssize_t line_len=0; + Symbol *start= intern("start"); + if (!start->rule) perror("no start rule"); while((line_len=getline(&line,&line_max,stdin))>=0){ if(line_len>0 && line[line_len-1]=='\n'){ line[line_len-1]=0;