Annotation of OpenXM/src/kan96xx/trans/yylex_polymake.c, Revision 1.6
1.6 ! takayama 1: /* $OpenXM: OpenXM/src/kan96xx/trans/yylex_polymake.c,v 1.5 2009/09/04 02:25:30 takayama Exp $ */
1.1 takayama 2: /* parser for polymake output */
3: /* This program requires
4:
5:
6: */
7:
8: #include <stdio.h>
9: #include "yylex_polymake.h"
10: #include "yy_polymake.tab.h"
11:
12: #define mymalloc(n) sGC_malloc(n)
13: /*
14: #define mymalloc(n) malloc(n)
15: */
16: /* pm = PolyMake */
17: #define PM_emptyLineCode 1
18:
19:
20: static char *S=NULL;
21: /* It is assumed that the newline code is only \n (preprocessed).
22: Empty line is marked with 0x1. More than one empty line does not appear. */
23: static int Pt=-1;
24: static int PMdebug = 0;
25:
26: /* char *PMlval; */
27:
28: /* The function putstr() uses static variables inside,
29: so if it is under use, it must not be initialized.
30: The function putstr2() is for the second use and is identical
31: function with putstr().
32: */
33: static char *putstr(int c);
34: static char *putstr2(int c);
35: static char *putstr2s(char *s);
36:
37: char *pmPutstr(int c) {
38: return putstr(c);
39: }
40:
41: pmSetS(char *s) {
42: S = s;
43: return 0;
44: }
45:
46: int PMlex() {
47: int type;
48: type = PMlex_aux();
49:
50: if (PMdebug) {
51: printf("type=%d ",type);
52: if ((type == PM_number) || (type == PM_keyword)) {
53: printf("value="); pmPrintObject(stdout,PMlval);
54: }
55: printf("\n");
56: }
57:
58: return type;
59: }
60: int PMlex_aux() {
61: if (Pt < 0) {
62: return PM_noToken;
63: }
64: if (S[Pt] == 0) { Pt=-1; return PM_noToken; }
65: while ((S[Pt]<=' ') && (S[Pt]!='\n') && (S[Pt] != PM_emptyLineCode)) Pt++;
66: if (S[Pt] == '\n') { Pt++; return PM_newline; }
67: if (S[Pt] == PM_emptyLineCode) {Pt++; return PM_emptyLine; }
68: if (S[Pt] == '{') { Pt++; return PM_LCurryBrace; }
69: if (S[Pt] == '}') { Pt++; return PM_RCurryBrace; }
1.3 takayama 70: if (S[Pt] == '<') { Pt++; return PM_LAngle; }
71: if (S[Pt] == '>') { Pt++; return PM_RAngle; }
72: if (S[Pt] == '(') { Pt++; return PM_LBrace; }
73: if (S[Pt] == ')') { Pt++; return PM_RBrace; }
74: if (S[Pt] == '[') { Pt++; return PM_LBracket; }
75: if (S[Pt] == ']') { Pt++; return PM_RBracket; }
76: if (S[Pt] == ':') { Pt++; return PM_colon; }
1.5 takayama 77: if (S[Pt] == '=') { Pt++; return PM_eq; }
1.1 takayama 78: if (((S[Pt] >= '0') && (S[Pt] <= '9')) || (S[Pt] == '-')) {
79: putstr(-1); putstr(S[Pt++]);
80: while (((S[Pt]>='0') && (S[Pt]<='9')) || (S[Pt] == '/')) putstr(S[Pt++]);
81: PMlval = pmNewStrObject(putstr(0));
82: return PM_number;
83: }
84: if (((S[Pt] >= 'A') && (S[Pt] <= 'Z')) ||
85: ((S[Pt] >= 'a') && (S[Pt] <= 'z')) ||
1.4 takayama 86: (S[Pt] == '_') || S[Pt] == '!') {
87: if (S[Pt] != '!') {putstr(-1); putstr(S[Pt++]);}
88: else {
89: putstr(-1); Pt++;
90: putstr('N'); putstr('O'); putstr('T'); putstr('_'); putstr('_');
91: }
92: while (((S[Pt] >= 'A') && (S[Pt] <= 'Z')) ||
93: ((S[Pt] >= 'a') && (S[Pt] <= 'z')) ||
94: (S[Pt] == '_')) putstr(S[Pt++]);
95: PMlval = pmNewStrObject(putstr(0));
96: return PM_keyword;
1.1 takayama 97: }
98: Pt++; return PM_unknown;
99: }
100:
101: #define PUTSTR_INIT 10
102: static char *putstr(int c) {
103: static char *s=NULL;
104: static int pt=0;
105: static int limit=0;
106: int i;
107: char *old;
108: if (c < 0) {
109: s = (char *)mymalloc(PUTSTR_INIT);
110: if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(10);}
111: limit = PUTSTR_INIT;
112: pt = 0; s[pt] = 0;
113: return s;
114: }
115: if (s == NULL) putstr(-1);
116: if (pt < limit-1) {
117: s[pt++]=c; s[pt]=0;
118: return s;
119: }else{
120: old = s;
121: limit = 2*limit;
122: s = (char *)mymalloc(limit);
123: if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(10);}
124: for (i=0; i<=pt; i++) {
125: s[i] = old[i];
126: }
127: return putstr(c);
128: }
129: }
130: static char *putstr2(int c) {
131: static char *s=NULL;
132: static int pt=0;
133: static int limit=0;
134: int i;
135: char *old;
136: if (c < 0) {
137: s = (char *)mymalloc(PUTSTR_INIT);
138: if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(10);}
139: limit = PUTSTR_INIT;
140: pt = 0; s[pt] = 0;
141: return s;
142: }
143: if (s == NULL) putstr2(-1);
144: if (pt < limit-1) {
145: s[pt++]=c; s[pt]=0;
146: return s;
147: }else{
148: old = s;
149: limit = 2*limit;
150: s = (char *)mymalloc(limit);
151: if (s == NULL) {fprintf(stderr,"No more memory.\n"); exit(10);}
152: for (i=0; i<=pt; i++) {
153: s[i] = old[i];
154: }
155: return putstr2(c);
156: }
157: }
158: static char *putstr2s(char *s) {
159: int i;
160: char *ss;
161: for (i=0; i<strlen(s); i++) {
162: ss = putstr2(s[i]);
163: }
164: return ss;
165: }
166:
1.6 ! takayama 167: int pmPreprocess() {
1.1 takayama 168: int newp,oldp;
169: int state;
170: int i,j;
171: if (S == NULL) return -1;
172: Pt = 0;
173: for (oldp = newp = 0; S[oldp] != 0; oldp++) {
174: if ((S[oldp] == 0xd) && (S[oldp] == 0xa)) { /* Windows 0d 0a */
175: S[newp++] = '\n'; oldp++;
176: }else{
177: S[newp++] = S[oldp];
178: }
179: }
180: S[newp] = '\0';
181:
182: for (oldp = newp = 0; S[oldp] != 0; oldp++) {
183: if (S[oldp] == 0xd) { /* Replace for mac 0xd to 0xa */
184: S[newp++] = '\n';
185: }else{
186: S[newp++] = S[oldp];
187: }
188: }
189: S[newp] = '\0';
190:
191: /* Remove #, empty lines, ... */
192: state = 1; newp=0;
193: for (oldp=0; S[oldp] != 0; oldp++) {
194: /* printf("oldp=%d, state=%d, char=%c\n",oldp,state,S[oldp]); */
195: switch(state) {
196: case 0:
197: if (S[oldp] == '\n') {state=1; newp=oldp+1;}
198: break;
199: case 1:
200: if ((S[oldp] == ' ') || (S[oldp] == '\t')) break;
1.2 takayama 201: if ((S[oldp] == '#') || ((S[oldp]=='_') && (oldp == 0))
202: || ((S[oldp]=='_') && (S[oldp-1]<' '))) {
1.1 takayama 203: /* skip the rest of the line, state=1; */
204: for (; S[oldp] != 0 ; oldp++) {
205: if (S[oldp] == '\n') {oldp--; break;}
206: }
207: if (S[oldp] == 0) oldp--;
208: }else if (S[oldp] == '\n') {
209: /* replace the empty line by PM_emptyLine */
210: S[newp]= PM_emptyLineCode; j=oldp+1;
211: for (i=newp+1; S[j] != 0; i++) {
212: S[i] = S[j]; j++;
213: }
214: oldp=newp;
215: S[i] = 0;
216: }else{
217: state = 0;
218: }
219: break;
220: default:
221: break;
222: }
223: }
224: }
225:
226: /* --------------- pmObjects --------------------- */
227: pmObjectp pmNewStrObject(char *s) {
228: pmObjectp ob;
229: ob = (pmObjectp) mymalloc(sizeof(struct pmObject));
230: if (ob == NULL) {
231: fprintf(stderr,"No more memory.\n");
232: exit(10);
233: }
234: ob->tag = PMobject_str;
235: ob->body = s;
236: return ob;
237: }
238: pmObjectp pmNewListObject(pmObjectp a) {
239: pmObjectp ob;
240: struct pmList *aa;
241: ob = (pmObjectp) mymalloc(sizeof(struct pmObject));
242: if (ob == NULL) {
243: fprintf(stderr,"No more memory.\n");
244: exit(10);
245: }
246: aa= (struct pmList *)mymalloc(sizeof(struct pmList));
247: if (aa == NULL) {
248: fprintf(stderr,"No more memory.\n");
249: exit(10);
250: }
251: aa->left=a;
252: aa->right=NULL;
253: ob->tag = PMobject_list;
254: ob->body = aa;
255: return ob;
256: }
257: pmObjectp pmCons(pmObjectp a,struct pmList *b) {
258: pmObjectp ob;
259: struct pmList *t;
260: ob = pmNewListObject(a);
261: t = ob->body;
262: t->right = b;
263: return ob;
264: }
265:
266: int pmListLength(struct pmList *list) {
267: struct pmList *t;
268: int n;
269: if (list == NULL) return 0;
270: n = 0;
271: t = list;
272: while (t != NULL) {
273: n++; t = t->right;
274: }
275: return n;
276: }
277:
278: pmObjectp pmNewTreeObjecto(pmObjectp s)
279: {
280: if ((s == NULL) || (s->tag != PMobject_str)) {
281: warning_yylex_polymake("Invalid argument for pmNewObjecto\n");
282: return pmNewTreeObject("?");
283: }
284: return pmNewTreeObject((char *)(s->body));
285: }
286: pmObjectp pmNewTreeObject(char *s) {
287: pmObjectp ob;
288: struct pmTree *aa;
289: ob = (pmObjectp) mymalloc(sizeof(struct pmObject));
290: if (ob == NULL) {
291: fprintf(stderr,"No more memory.\n");
292: exit(10);
293: }
294: aa= (struct pmTree *)mymalloc(sizeof(struct pmTree));
295: if (aa == NULL) {
296: fprintf(stderr,"No more memory.\n");
297: exit(10);
298: }
299: aa->nodeName = s;
300: aa->attrList = NULL;
301: aa->childs = NULL;
302: ob->tag = PMobject_tree;
303: ob->body = aa;
304: return ob;
305: }
306:
307: pmObjectp pmAddAttr(pmObjectp c,pmObjectp a) {
308: struct pmTree *tree;
309: if (a->tag != PMobject_tree) {
310: warning_yylex_polymake("pmAddAttr: the argument is not tree object.\n");
311: return a;
312: }
313: tree = a->body;
314: if (tree->attrList == NULL) {
315: tree->attrList = pmNewListObject(c);
316: }else{
317: if (tree->attrList->tag == PMobject_list) {
318: tree->attrList = pmCons(c,(struct pmList *)(tree->attrList->body));
319: }else{
320: warning_yylex_polymake("pmAddAttr: the attrbute list is broken.\n");
321: }
322: }
323: return a;
324: }
325:
326: /* Add c to the tree a */
327: pmObjectp pmAddChild(pmObjectp c,pmObjectp a) {
328: struct pmTree *tree;
329: if (a->tag != PMobject_tree) {
330: warning_yylex_polymake("pmAddAttr: the argument is not tree object.\n");
331: return a;
332: }
333: tree = a->body;
334: if (tree->childs == NULL) {
335: tree->childs = pmNewListObject(c);
336: }else{
337: if (tree->childs->tag == PMobject_list) {
338: tree->childs = pmCons(c,(struct pmList *)(tree->childs->body));
339: }else{
340: warning_yylex_polymake("pmAddAttr: the child list is broken.\n");
341: }
342: }
343: return a;
344: }
345:
1.6 ! takayama 346: void warning_yylex_polymake(char *s) {
1.1 takayama 347: fprintf(stderr,"Warning: %s",s);
348: }
349:
350: void pmPrintObject(FILE *fp,pmObjectp p) {
351: fprintf(fp,"%s",pmObjectToStr(p));
352: }
353: char *pmObjectToStr(pmObjectp p) {
354: char *s;
355: s=putstr2(-1);
356: s=pmObjectToStr_aux(p);
357: return putstr2(0);
358: }
359: char *pmObjectToStr_aux(pmObjectp p) {
360: int n,i;
361: struct pmList *list;
362: struct pmList *t;
363: struct pmTree *tree;
364: char *ans;
365: if (p == NULL) {
366: /* fprintf(stderr,"NULL "); */
367: return putstr2s("[]");
368: }
369: /* fprintf(stderr,"tag=%d ",p->tag); */
370: switch (p->tag) {
371: case PMobject_str:
372: ans=putstr2s((char *)(p->body));
373: break;
374: case PMobject_list:
375: list = (struct pmList *)(p->body);
376: if (list == NULL) break;
377: n = pmListLength(list);
378: t = list;
379: ans=putstr2s("[");
380: for (i=0; i<n; i++) {
381: ans=pmObjectToStr_aux(t->left);
382: if (i != n-1) ans=putstr2s(",");
383: if (t == NULL) break; else t = t->right;
384: }
385: ans=putstr2s("]");
386: break;
387: case PMobject_tree:
388: tree = p->body;
389: ans=putstr2s("polymake."); ans=putstr2s(tree->nodeName);
390: ans=putstr2s("(");
391: /* Ignore attribute list */
392: if (tree->childs == NULL) {n = 0; t = NULL; }
393: else {
394: t = tree->childs->body;
395: n = pmListLength(t);
396: }
397: for (i=0; i<n; i++) {
398: ans=pmObjectToStr_aux(t->left);
399: t = t->right;
400: if (i != n-1) ans=putstr2(',');
401: }
402: ans = putstr2s(")");
403: break;
404: default:
405: fprintf(stderr,"Unknown object tag %d.\n",p->tag);
406: /* sleep(100); to call debugger. */
407: break;
408: }
409: return ans;
410: }
411:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>