/* $OpenXM: OpenXM/src/kan96xx/Kan/yylex_polymake.c,v 1.2 2003/11/20 03:25:08 takayama Exp $ */ /* parser for polymake output */ /* This program requires */ #include #include "yylex_polymake.h" #include "yy_polymake.tab.h" /* #define mymalloc(n) sGC_malloc(n) */ #define mymalloc(n) malloc(n) /* pm = PolyMake */ #define PM_emptyLineCode 1 static char *S=NULL; /* It is assumed that the newline code is only \n (preprocessed). Empty line is marked with 0x1. More than one empty line does not appear. */ static int Pt=-1; static int PMdebug = 0; /* char *PMlval; */ static char *putstr(int c); int PMlex() { int type; type = PMlex_aux(); if (PMdebug) { printf("type=%d ",type); if ((type == PM_number) || (type == PM_keyword)) { printf("value="); pmPrintObject(stdout,PMlval); } printf("\n"); } return type; } int PMlex_aux() { if (Pt < 0) { return PM_noToken; } if (S[Pt] == 0) { Pt=-1; return PM_noToken; } while ((S[Pt]<=' ') && (S[Pt]!='\n') && (S[Pt] != PM_emptyLineCode)) Pt++; if (S[Pt] == '\n') { Pt++; return PM_newline; } if (S[Pt] == PM_emptyLineCode) {Pt++; return PM_emptyLine; } if (S[Pt] == '{') { Pt++; return PM_LCurryBrace; } if (S[Pt] == '}') { Pt++; return PM_RCurryBrace; } if (((S[Pt] >= '0') && (S[Pt] <= '9')) || (S[Pt] == '-')) { putstr(-1); putstr(S[Pt++]); while (((S[Pt]>='0') && (S[Pt]<='9')) || (S[Pt] == '/')) putstr(S[Pt++]); PMlval = pmNewStrObject(putstr(0)); return PM_number; } if (((S[Pt] >= 'A') && (S[Pt] <= 'Z')) || ((S[Pt] >= 'a') && (S[Pt] <= 'z')) || (S[Pt] == '_')) { putstr(-1); putstr(S[Pt++]); while (((S[Pt] >= 'A') && (S[Pt] <= 'Z')) || ((S[Pt] >= 'a') && (S[Pt] <= 'z')) || (S[Pt] == '_')) putstr(S[Pt++]); PMlval = pmNewStrObject(putstr(0)); return PM_keyword; } Pt++; return PM_unknown; } #define PUTSTR_INIT 10 static char *putstr(int c) { static char *s=NULL; static int pt=0; static int limit=0; int i; char *old; if (c < 0) { s = (char *)mymalloc(PUTSTR_INIT); if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(10);} limit = PUTSTR_INIT; pt = 0; s[pt] = 0; return s; } if (s == NULL) putstr(-1); if (pt < limit-1) { s[pt++]=c; s[pt]=0; return s; }else{ old = s; limit = 2*limit; s = (char *)mymalloc(limit); if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(10);} for (i=0; i<=pt; i++) { s[i] = old[i]; } return putstr(c); } } pmPreprocess() { int newp,oldp; int state; int i,j; if (S == NULL) return -1; Pt = 0; for (oldp = newp = 0; S[oldp] != 0; oldp++) { if ((S[oldp] == 0xd) && (S[oldp] == 0xa)) { /* Windows 0d 0a */ S[newp++] = '\n'; oldp++; }else{ S[newp++] = S[oldp]; } } S[newp] = '\0'; for (oldp = newp = 0; S[oldp] != 0; oldp++) { if (S[oldp] == 0xd) { /* Replace for mac 0xd to 0xa */ S[newp++] = '\n'; }else{ S[newp++] = S[oldp]; } } S[newp] = '\0'; /* Remove #, empty lines, ... */ state = 1; newp=0; for (oldp=0; S[oldp] != 0; oldp++) { /* printf("oldp=%d, state=%d, char=%c\n",oldp,state,S[oldp]); */ switch(state) { case 0: if (S[oldp] == '\n') {state=1; newp=oldp+1;} break; case 1: if ((S[oldp] == ' ') || (S[oldp] == '\t')) break; if ((S[oldp] == '#') || ((S[oldp]=='_') && (S[oldp-1]<' '))) { /* skip the rest of the line, state=1; */ for (; S[oldp] != 0 ; oldp++) { if (S[oldp] == '\n') {oldp--; break;} } if (S[oldp] == 0) oldp--; }else if (S[oldp] == '\n') { /* replace the empty line by PM_emptyLine */ S[newp]= PM_emptyLineCode; j=oldp+1; for (i=newp+1; S[j] != 0; i++) { S[i] = S[j]; j++; } oldp=newp; S[i] = 0; }else{ state = 0; } break; default: break; } } } pmObjectp pmNewStrObject(char *s) { pmObjectp ob; ob = (pmObjectp) mymalloc(sizeof(struct pmObject)); if (ob == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } ob->tag = PMobject_str; ob->body = s; return ob; } pmObjectp pmNewListObject(pmObjectp a) { pmObjectp ob; struct pmList *aa; ob = (pmObjectp) mymalloc(sizeof(struct pmObject)); if (ob == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } aa= (struct pmList *)mymalloc(sizeof(struct pmList)); if (aa == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } aa->left=a; aa->right=NULL; ob->tag = PMobject_list; ob->body = aa; return ob; } pmObjectp pmCons(pmObjectp a,struct pmList *b) { pmObjectp ob; struct pmList *t; ob = pmNewListObject(a); t = ob->body; t->right = b; return ob; } int pmListLength(struct pmList *list) { struct pmList *t; int n; if (list == NULL) return 0; n = 0; t = list; while (t != NULL) { n++; t = t->right; } return n; } pmObjectp pmNewTreeObjecto(pmObjectp s) { if ((s == NULL) || (s->tag != PMobject_str)) { warning_yylex_polymake("Invalid argument for pmNewObjecto\n"); return pmNewTreeObject("?"); } return pmNewTreeObject((char *)(s->body)); } pmObjectp pmNewTreeObject(char *s) { pmObjectp ob; struct pmTree *aa; ob = (pmObjectp) mymalloc(sizeof(struct pmObject)); if (ob == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } aa= (struct pmTree *)mymalloc(sizeof(struct pmTree)); if (aa == NULL) { fprintf(stderr,"No more memory.\n"); exit(10); } aa->nodeName = s; aa->attrList = NULL; aa->childs = NULL; ob->tag = PMobject_tree; ob->body = aa; return ob; } pmObjectp pmAddAttr(pmObjectp c,pmObjectp a) { struct pmTree *tree; if (a->tag != PMobject_tree) { warning_yylex_polymake("pmAddAttr: the argument is not tree object.\n"); return a; } tree = a->body; if (tree->attrList == NULL) { tree->attrList = pmNewListObject(c); }else{ if (tree->attrList->tag == PMobject_list) { tree->attrList = pmCons(c,(struct pmList *)(tree->attrList->body)); }else{ warning_yylex_polymake("pmAddAttr: the attrbute list is broken.\n"); } } return a; } /* Add c to the tree a */ pmObjectp pmAddChild(pmObjectp c,pmObjectp a) { struct pmTree *tree; if (a->tag != PMobject_tree) { warning_yylex_polymake("pmAddAttr: the argument is not tree object.\n"); return a; } tree = a->body; if (tree->childs == NULL) { tree->childs = pmNewListObject(c); }else{ if (tree->childs->tag == PMobject_list) { tree->childs = pmCons(c,(struct pmList *)(tree->childs->body)); }else{ warning_yylex_polymake("pmAddAttr: the child list is broken.\n"); } } return a; } warning_yylex_polymake(char *s) { fprintf(stderr,"Warning: %s",s); } void pmPrintObject(FILE *fp,pmObjectp p) { int n,i; struct pmList *list; struct pmList *t; struct pmTree *tree; if (p == NULL) { /* fprintf(stderr,"NULL "); */ return; } /* fprintf(stderr,"tag=%d ",p->tag); */ switch (p->tag) { case PMobject_str: fprintf(fp,"%s",(char *)(p->body)); break; case PMobject_list: list = (struct pmList *)(p->body); if (list == NULL) break; n = pmListLength(list); t = list; fprintf(fp,"["); for (i=0; ileft); if (i != n-1) fprintf(fp,","); if (t == NULL) break; else t = t->right; } fprintf(fp,"]"); break; case PMobject_tree: tree = p->body; fprintf(fp,"polymake.%s(",tree->nodeName); /* Ignore attribute list */ if (tree->childs == NULL) {n = 0; t = NULL; } else { t = tree->childs->body; n = pmListLength(t); } for (i=0; ileft); t = t->right; if (i != n-1) fprintf(fp,","); } fprintf(fp,")"); break; default: fprintf(stderr,"Unknown object tag %d.\n",p->tag); /* sleep(100); to call debugger. */ break; } } main_t() { int c,type; putstr(-1); while ((c=getchar()) != EOF) { putstr(c); } S = putstr(0); printf("%s\n",S); pmPreprocess(S); printf("--------------------------\n"); printf("%s\n",S); printf("--------------------------\n"); while ((type=PMlex()) != PM_noToken) { printf("type=%d ",type); if ((type == PM_number) || (type == PM_keyword)) { printf("value="); pmPrintObject(stdout,PMlval); } printf("\n"); } } main() { int c,type; putstr(-1); while ((c=getchar()) != EOF) { putstr(c); } S = putstr(0); printf("%s\n",S); pmPreprocess(S); printf("--------------------------\n"); printf("%s\n",S); printf("--------------------------\n"); PMparse(); } PMerror() { }