diff --git a/parse.leg b/parse.leg index dbbe3d5..50c58db 100644 --- a/parse.leg +++ b/parse.leg @@ -165,7 +165,9 @@ void print(Node *node) return; case Class: printf("Class"); - printf("\"%s\"", node->Class.array); + for(int i=0;i<32;i++){ + printf("\\%03o",(unsigned char)node->Class.array[i]); + } return; case Dot: printf("Dot"); @@ -206,9 +208,15 @@ else { \ -Symbol *intern(char *name){ +Symbol *intern(char *string){ int left=0,right=symbolTable.length-1; - + char *name = strdup(string),*p =name; + while(*p){ + if(*p=='-'){ + *p='_'; + } + p++; + } while (left<=right) { int middle=(left+right)/2; int comp=strcmp(name,symbolTable.elements[middle]->name); @@ -220,6 +228,7 @@ Symbol *intern(char *name){ left=middle+1; } else{ + free(name); return symbolTable.elements[middle]; } } @@ -227,8 +236,9 @@ Symbol *intern(char *name){ symbolTable.elements= realloc(symbolTable.elements,sizeof(symbolTable.elements[0]) * (symbolTable.length+1)); memmove(symbolTable.elements+left+1,symbolTable.elements+left,(symbolTable.length-left)*sizeof(symbolTable.elements[0])); symbolTable.length++; - return symbolTable.elements[left]=createSymbol(name); - + Symbol *s= symbolTable.elements[left]=createSymbol(name); + free(name); + return s; } @@ -269,9 +279,10 @@ atom = string | class | dot | rule | '(' - expression ')' - rule = i:id !'=' { $$ = mkId(intern(yytext)) } -id = < [a-zA-z_][a-zA-z_0-9]* > - { $$ = mkId(intern(yytext)) } +id = < [a-zA-z_\-][a-zA-z_0-9]* > - { $$ = mkId(intern(yytext)) } -string = '"' < [^\"]* > '"' - { $$ = mkString(yytext) } +string = '"' < [^\"]* > '"' - { $$ = mkString(unescapedString(yytext)) } + | "'" < [^\']* > "'" - { $$ = mkString(unescapedString(yytext)) } class = '['-<(!']'.)*> ']' - { $$=mkClass(classify(yytext)) } @@ -313,102 +324,7 @@ NodeCount nodeCount={ .Id=0 }; -void printVariableName(enum op type, NodeCount count, int increment){ - char number[50] ; - char *dest=malloc(30); - size_t n; - switch(type){ - case String : - printf("string%i",nodeCount.String); - if(increment==1)nodeCount.String++; - break; - case Query : - if(increment==1)nodeCount.Query++; - number[0]=nodeCount.Query+'0'; - n = strlen(number); - strncpy(dest,"query",5); - strncat(dest, number, n); - printf("%s ",dest); - break; - - case Star: - printf("star%i",nodeCount.Star); - if(increment==1) nodeCount.Star++; - break; - - case Plus : - if(increment==1) nodeCount.Plus++; - number[0]=nodeCount.Plus+'0'; - n = strlen(number); - strncpy(dest,"plus",4); - strncat(dest, number, n); - printf("%s ",dest); - break; - - case Or : - if(increment==1) nodeCount.Or++; - number[0]=nodeCount.Or+'0'; - n = strlen(number); - strncpy(dest,"or",2); - strncat(dest, number, n); - printf("%s ",dest); - break; - - case And: - if(increment==1) nodeCount.And++; - number[0]=nodeCount.And+'0'; - n = strlen(number); - strncpy(dest,"and",3); - strncat(dest, number, n); - printf("%s ",dest); - break; - - case Class: - if(increment==1)nodeCount.Class++; - number[0]=nodeCount.Class+'0'; - n = strlen(number); - strncpy(dest,"class",5); - strncat(dest, number, n); - printf("%s ",dest); - break; - - case Dot: - if(increment==1) nodeCount.Dot++; - number[0]=nodeCount.Dot+'0'; - n = strlen(number); - strncpy(dest,"dot",3); - strncat(dest, number, n); - printf("%s ",dest); - break; - - case Exc: - if(increment==1) nodeCount.Exc++; - number[0]=nodeCount.Exc+'0'; - n = strlen(number); - strncpy(dest,"exc",3); - strncat(dest, number, n); - printf("%s ",dest); - break; - - case Et: - if(increment==1) nodeCount.Et++; - number[0]=nodeCount.Et+'0'; - n = strlen(number); - strncpy(dest,"et",2); - strncat(dest, number, n); - printf("%s ",dest); - break; - - case Id: - if(increment==1) nodeCount.Id++; - number[0]=nodeCount.Id+'0'; - n = strlen(number); - strncpy(dest,"id",2); - strncat(dest, number, n); - printf("%s ",dest); - break; - } -} + int nodeNumber=0; @@ -420,7 +336,20 @@ int printCode(FILE *file,Node *node) case String:{ fprintf(file,"Node node%i = { .String = { String, ",thisNumber); - fprintf(file,"\"%s\"", node->String.string); + fprintf(file,"\""); + for(int i=0;iString.len;i++){ + int c = (unsigned char) node->String.string[i]; + switch(c) { + case '"': + case '\\': + fprintf(file,"\\%c",c); + continue; + default : + if(c >=' ' && c <= '~') fprintf(file,"%c",c); + else fprintf(file,"\\%03o",c); + } + } + fprintf(file,"\""); fprintf(file," , %i }}; \n",node->String.len); return thisNumber; } @@ -499,13 +428,13 @@ void printSymbolTable(FILE *file) { } void declareSymbols(FILE *file) { for (int k= 0; kname); + fprintf(file,"Symbol symbol_%s ;\n",symbolTable.elements[k]->name); } } void defineSymbols(FILE *file) { for (int k= 0; kname,s->name,s->number,s->number); + fprintf(file,"Symbol symbol_%s = { \"%s\", &node%i, %i};\n",s->name,s->name,s->number,s->number); } }