|
|
1.1 ! root 1: ! 2: %{ ! 3: /******************************************************************* ! 4: * * ! 5: * File: CIFPLOT/parser.y * ! 6: * Written by Dan Fitzpatrick * ! 7: * copyright 1980 -- Regents of the University of California * ! 8: * * ! 9: ********************************************************************/ ! 10: ! 11: /* This is a YACC description for the parser */ ! 12: ! 13: /* In the offical CIF language description SEMI = BLANKLIST ';' BLANKLIST ! 14: * but this causes ambiguities for the LALR(1) parser so the scanner ! 15: * returns ';' when it spots the pattern BLANKLIST ';' ! 16: */ ! 17: ! 18: #include <stdio.h> ! 19: #include "defs.h" ! 20: #include "globals.h" ! 21: #include "structs.h" ! 22: #include "alloc.h" ! 23: ! 24: #define yyparse parser ! 25: #define yylex scanner ! 26: ! 27: #define null Concat("",0); ! 28: int Definning=0; ! 29: int SendAll=0; /* If set causes the lexical analyzer to return ! 30: * BLANKLIST and ';' seperately */ ! 31: int A = 1; ! 32: int B = 1; ! 33: ! 34: #define SCALE(x) ( (((real) A) * ((real) x)) / ((real) B )) ! 35: ! 36: %} ! 37: ! 38: %start CIF_FILE ! 39: %token BLANK ! 40: %token OTHERCHAR ! 41: %token COMMENT_COMMAND ! 42: ! 43: %% ! 44: CIF_FILE ! 45: : COMMANDLIST END_COMMAND BLANKLIST ! 46: | COMMANDLIST END_COMMAND error ! 47: { Error("Improper Ending",FATAL); } ! 48: | COMMANDLIST END_COMMAND SEMI ! 49: { Error("Semi-Colon found after End", ! 50: RECOVERABLE); } ! 51: | COMMANDLIST ! 52: { Error("No End Statement",RECOVERABLE); } ! 53: | COMMANDLIST END_COMMAND BLANKLIST GARBAGE error ! 54: { Error("Garbage after End Statement", ! 55: RECOVERABLE); } ! 56: ; ! 57: ! 58: COMMANDLIST ! 59: : COMMANDLIST COMMAND SEMI ! 60: | COMMANDLIST SEMI ! 61: | BLANKLIST ! 62: | COMMANDLIST error ! 63: { Error("Unrecognizable Command",FATAL); } ! 64: SEMI ! 65: ; ! 66: ! 67: COMMAND ! 68: : FCOMMAND ! 69: ; ! 70: ! 71: FCOMMAND ! 72: : PRIM_COMMAND ! 73: { Execute($1); } ! 74: | DEF_DELETE_COMMAND ! 75: | SYMB_LIST DEF_FINNISH_COMMAND ! 76: { Execute($1); ! 77: Definning = 0; ! 78: A=1; B=1; } ! 79: | ERROR_COMMAND ! 80: ; ! 81: ! 82: ERROR_COMMAND ! 83: : COMMENT_COMMAND ! 84: { Error("Comments must end with a semi-colon", ! 85: RECOVERABLE); } ! 86: BLANKLIST FCOMMAND ! 87: { $$ = $1; } ! 88: | DEF_FINNISH_COMMAND ! 89: { Error("Define Finnished found outside of Definition", ! 90: FATAL); ! 91: $$ = $1; } ! 92: | DEF_ERROR ! 93: { Error("Unrecognized Definition Command", ! 94: FATAL); } ! 95: ; ! 96: ! 97: SYMB_LIST ! 98: : SYMB_LIST SYMB_COMMAND ! 99: { $$ = AddCmd($1,$2); } ! 100: | SYMB_LIST SEMI ! 101: { $$ = $1; } ! 102: | DEF_START_COMMAND SEMI ! 103: { Definning = 1; ! 104: A=(int) ((Command *) $1)->Ctype.Symbl.a; ! 105: B=(int) ((Command *) $1)->Ctype.Symbl.b; ! 106: $$ = $1; } ! 107: | SYMB_LIST error ! 108: { $$ = $1; ! 109: Error("Unrecognized or Illegal Command in Definition", ! 110: FATAL); } ! 111: SEMI ! 112: ; ! 113: ! 114: SYMB_COMMAND ! 115: : PRIM_COMMAND SEMI ! 116: { $$ = $1; } ! 117: | COMMENT_COMMAND ! 118: { Error("Comments must end with a semi-colon",RECOVERABLE); } ! 119: BLANKLIST SYMB_COMMAND ! 120: { $$ = $4; } ! 121: ; ! 122: ! 123: PRIM_COMMAND ! 124: : POLYGON_COMMAND ! 125: | BOX_COMMAND ! 126: | ROUNDFLASH_COMMAND ! 127: | WIRE_COMMAND ! 128: | LAYER_COMMAND ! 129: | CALL_COMMAND ! 130: | USEREXTENSION_COMMAND ! 131: | COMMENT_COMMAND ! 132: ; ! 133: ! 134: POLYGON_COMMAND ! 135: : 'P' PATH ! 136: { /* Polygons must have more than two ! 137: * vertices to be well defined */ ! 138: if( ((struct PathHeader *) $2)->PNo < 3) ! 139: Error("Degenerate Polygon",WARNING); ! 140: /* Polygons with less than two vertices are ! 141: * useless */ ! 142: if( ((struct PathHeader *) $2)->PNo < 2) { ! 143: Error("Command Ignored",WARNING); ! 144: $$ = MakeComment(); ! 145: } ! 146: else ! 147: $$ = MakePoly($2); } ! 148: | 'P' error ! 149: { Error("Bad Path Descriptor in Polygon",FATAL); ! 150: $$ = MakeComment(); } ! 151: ; ! 152: ! 153: BOX_COMMAND ! 154: : 'B' INTEGER SEP INTEGER SEP POINT ! 155: { $$ = MakeBox(SCALE($2),SCALE($4),$6, ! 156: MakePoint(1.0,0.0)); ! 157: Free($6); } ! 158: | 'B' INTEGER SEP INTEGER SEP POINT SEP POINT ! 159: { if(!CheckPoint($8)) ! 160: Error("Bad Direction Vector in Box Command",FATAL); ! 161: $$ = MakeBox(SCALE($2),SCALE($4),$6,$8); ! 162: Free($6); Free($8); } ! 163: | 'B' error ! 164: { Error("Illegal Box Description",FATAL); ! 165: $$ = MakeComment(); } ! 166: ; ! 167: ! 168: ROUNDFLASH_COMMAND ! 169: : 'R' INTEGER SEP POINT ! 170: { $$ = MakeFlash(SCALE($2),$4);} ! 171: | 'R' error ! 172: { Error("Illegal Round Flash Description",FATAL); ! 173: $$ = MakeComment(); } ! 174: ; ! 175: ! 176: WIRE_COMMAND ! 177: : 'W' INTEGER SEP PATH ! 178: { if( ((struct PathHeader *) $4)->PNo < 2) ! 179: Error("Degenerate Wire",WARNING); ! 180: $$ = MakeWire(SCALE($2),$4); } ! 181: | 'W' error ! 182: { Error("Illegal Wire Description",FATAL); ! 183: $$ = MakeComment(); } ! 184: ; ! 185: ! 186: LAYER_COMMAND ! 187: : 'L' BLANKLIST SHORTNAME ! 188: { $$ = MakeLayer($3); } ! 189: | 'L' error ! 190: { Error("Illegal Layer Command",FATAL); ! 191: $$ = MakeComment(); } ! 192: ; ! 193: ! 194: DEF_START_COMMAND ! 195: : 'D' BLANKLIST 'S' INTEGER ! 196: { $$ = MakeSymbol($4,1,1);} ! 197: | 'D' BLANKLIST 'S' INTEGER SEP INTEGER SEP INTEGER ! 198: { $$ = MakeSymbol($4,$6,$8);} ! 199: ; ! 200: ! 201: DEF_FINNISH_COMMAND ! 202: : 'D' BLANKLIST 'F' ! 203: { $$ = 0; } ! 204: ; ! 205: ! 206: DEF_DELETE_COMMAND ! 207: : 'D' BLANKLIST 'D' INTEGER ! 208: { DeleteDefintion($4); ! 209: $$ = MakeComment(); } ! 210: ! 211: ; ! 212: ! 213: DEF_ERROR ! 214: : 'D' error ! 215: ; ! 216: ! 217: CALL_COMMAND ! 218: : 'C' INTEGER TRANSFORMATION ! 219: { $$ = MakeCall($2,$3); } ! 220: | 'C' error ! 221: { Error("Illegal Call Command",FATAL); ! 222: $$ = MakeComment(); } ! 223: ; ! 224: ! 225: USEREXTENSION_COMMAND ! 226: : SENDALL '0' SP NAME ! 227: { $$ = MakeComment(); ! 228: if(!standard) ! 229: Include($4); ! 230: else ! 231: Error("User Extention Ignored\n",WARNING); ! 232: SendAll = 0; ! 233: Free($4); } ! 234: | SENDALL '0' 'I' SP NAME ! 235: { $$ = MakeComment(); ! 236: if(!standard) ! 237: Include($4); ! 238: else ! 239: Error("User Extention Ignored\n",WARNING); ! 240: SendAll = 0; ! 241: Free($4); } ! 242: | SENDALL '0' 'A' INTEGER SEP INTEGER SEP INTEGER SEP SINTEGER SEP SINTEGER BLANKLIST ! 243: { if(!standard) ! 244: $$ = MakeArray($4,$6,$8,SCALE($10),SCALE($12)); ! 245: else { ! 246: Error("User Extention Ignored\n",WARNING); ! 247: $$ = MakeComment(); ! 248: } ! 249: SendAll = 0; } ! 250: | SENDALL '1' BLANK USERLIST ! 251: { $$ = MakeComment(); ! 252: if(!standard) ! 253: fprintf(stderr,"%s\n",$4); ! 254: else ! 255: Error("User Extention Ignored\n",WARNING); ! 256: SendAll = 0; ! 257: Free($4); } ! 258: | SENDALL '2' SP '"' TEXT '"' TRANSFORMATION ! 259: { if(!standard) ! 260: $$ = MakeText($5,$7,'l'); ! 261: else { ! 262: Error("User Extention Ignored\n",WARNING); ! 263: $$ = MakeComment(); ! 264: } ! 265: SendAll = 0; } ! 266: | SENDALL '2' 'C' SP '"' TEXT '"' TRANSFORMATION ! 267: { if(!standard) ! 268: $$ = MakeText($6,$8,'c'); ! 269: else { ! 270: Error("User Extention Ignored\n",WARNING); ! 271: $$ = MakeComment(); ! 272: } ! 273: SendAll = 0; } ! 274: | SENDALL '9' SP NAME ! 275: { if(!standard) ! 276: $$ = MakeName($4); ! 277: else { ! 278: Error("User Extention Ignored\n",WARNING); ! 279: $$ = MakeComment(); ! 280: } ! 281: SendAll = 0; } ! 282: | SENDALL '9' '4' SP NAME BLANK POINT ! 283: { if(!standard) { ! 284: $$ = MakePointName($5,$7,"all"); ! 285: Free($7); ! 286: } ! 287: else { ! 288: Error("User Extention Ignored\n",WARNING); ! 289: $$ = MakeComment(); ! 290: } ! 291: SendAll = 0; } ! 292: | SENDALL '9' '4' SP NAME BLANK POINT SP SHORTNAME ! 293: { if(!standard) { ! 294: $$ = MakePointName($5,$7,$9); ! 295: Free($7); ! 296: } ! 297: else { ! 298: Error("User Extention Ignored\n",WARNING); ! 299: $$ = MakeComment(); ! 300: } ! 301: SendAll = 0; } ! 302: | SENDALL EXTEN_DIGIT error ! 303: { $$ = MakeComment(); ! 304: Error("Bad Syntax in Extension Command --- Command Ignored", ! 305: WARNING); ! 306: SendAll = 0; } ! 307: | SENDALL OTHER_DIGIT error ! 308: { $$ = MakeComment(); ! 309: Error("Unimplemented User Extension", ! 310: WARNING); ! 311: SendAll = 0; } ! 312: ; ! 313: ! 314: EXTEN_DIGIT ! 315: : '0' | '1' | '2' | '9' ! 316: ; ! 317: ! 318: OTHER_DIGIT ! 319: : '3' | '4' | '5' | '6' | '7' | '8' ! 320: ; ! 321: ! 322: SENDALL ! 323: : EMPTY {SendAll = 1; } ! 324: ; ! 325: ! 326: END_COMMAND ! 327: : 'E' ! 328: ; ! 329: ! 330: TRANSFORMATION ! 331: : BLANKLIST 'T' POINT TRANSFORMATION ! 332: { $$ = Translate($3,$4); ! 333: if(output == NOPLOT) ! 334: Free(((transform *) $4)->TransString); ! 335: Free($3); FreeTransform($4); } ! 336: | BLANKLIST 'M' BLANKLIST 'X' TRANSFORMATION ! 337: { $$ = Mirror('x',$5); ! 338: if(output == NOPLOT) ! 339: Free(((transform *) $5)->TransString); ! 340: FreeTransform($5); } ! 341: | BLANKLIST 'M' BLANKLIST 'Y' TRANSFORMATION ! 342: { $$ = Mirror('y',$5); ! 343: if(output == NOPLOT) ! 344: Free(((transform *) $5)->TransString); ! 345: FreeTransform($5); } ! 346: | BLANKLIST 'R' POINT TRANSFORMATION ! 347: { if(!CheckPoint($3)) ! 348: Error("Bad Rotation Vector",FATAL); ! 349: $$ = Rotate($3,$4); ! 350: if(output == NOPLOT) ! 351: Free(((transform *) $4)->TransString); ! 352: Free($3); FreeTransform($4); } ! 353: | EMPTY ! 354: { $$ = MakeTransform(); } ! 355: ; ! 356: ! 357: PATH ! 358: : PATH SEP POINT ! 359: { $$ = AddPath($1,$3); ! 360: Free($3); } ! 361: | POINT ! 362: { $$ = MakePath($1); } ! 363: ; ! 364: ! 365: POINT ! 366: : SINTEGER SEP SINTEGER ! 367: { $$ = MakePoint(SCALE($1),SCALE($3)); } ! 368: | SINTEGER error ! 369: { Error("Odd number of values encountered", ! 370: FATAL); ! 371: $$ = MakePoint(SCALE($1),0.0);} ! 372: ; ! 373: ! 374: SINTEGER ! 375: : SEPLIST INTEGERD ! 376: { $$ = $2; } ! 377: | SEPLIST '-' INTEGERD ! 378: { $$ = - $3; } ! 379: ; ! 380: ! 381: INTEGER ! 382: : SEPLIST INTEGERD ! 383: { $$ = $2; } ! 384: | SEPLIST '-' INTEGERD ! 385: { Error("Expected Positive Integer",FATAL); ! 386: $$ = $3; } ! 387: ; ! 388: ! 389: INTEGERD ! 390: : INTEGERD DIGIT ! 391: { if ($1 > (0x800000 / 10)) { ! 392: Error("Integers may not exceed 2**24", ! 393: FATAL); ! 394: $$ = 0; ! 395: } ! 396: else ! 397: $$ = ($1*10)+$2-'0'; } ! 398: | DIGIT ! 399: { $$ = $1 - '0'; } ! 400: ; ! 401: ! 402: SHORTNAME ! 403: : C ! 404: | C C ! 405: { $$ = Concat($1,$2,0); ! 406: Free($1); Free($2); } ! 407: | C C C ! 408: { $$ = Concat($1,$2,$3,0); ! 409: Free($1); Free($2); Free($3); } ! 410: | C C C C ! 411: { $$ = Concat($1,$2,$3,$4,0); ! 412: Free($1); Free($2); ! 413: Free($3); Free($4); } ! 414: ; ! 415: ! 416: C ! 417: : DIGIT ! 418: { $$ = MakeString($1); } ! 419: | UPPERCHAR ! 420: { $$ = MakeString($1); } ! 421: ; ! 422: ! 423: SEPLIST ! 424: : SEPLIST SEP ! 425: | EMPTY ! 426: ; ! 427: ! 428: SEP ! 429: : UPPERCHAR ! 430: | BLANK ! 431: | OTHERCHAR ! 432: ; ! 433: ! 434: UPPERCHAR ! 435: : 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' ! 436: | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' ! 437: | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' ! 438: | 'V' | 'W' | 'X' | 'Y' | 'Z' ! 439: ; ! 440: ! 441: DIGIT ! 442: : '0' | '1' | '2' | '3' | '4' ! 443: | '5' | '6' | '7' | '8' | '9' ! 444: ; ! 445: ! 446: NAME ! 447: : NAME NAMECHAR ! 448: { $$ = Concat($1,$2,0); ! 449: Free($1); Free($2); } ! 450: | NAMECHAR ! 451: ; ! 452: ! 453: NAMECHAR ! 454: : BASECHAR ! 455: | '"' ! 456: { $$ = MakeString('"'); } ! 457: ; ! 458: ! 459: TEXT ! 460: : TEXT TEXTCHAR ! 461: { $$ = Concat($1,$2,0); ! 462: Free($1); Free($2); } ! 463: | EMPTY ! 464: { $$ = null; } ! 465: ; ! 466: ! 467: TEXTCHAR ! 468: : BLANK ! 469: { $$ = MakeString($1); } ! 470: | BASECHAR ! 471: ; ! 472: ! 473: USERLIST ! 474: : USERLIST USERCHAR ! 475: { $$ = Concat($1,$2,0); ! 476: Free($1); Free($2); } ! 477: | EMPTY ! 478: { $$ = null; } ! 479: ; ! 480: ! 481: USERCHAR ! 482: : BLANK ! 483: { $$ = MakeString($1); } ! 484: | BASECHAR ! 485: | '"' ! 486: { $$ = MakeString('"'); } ! 487: ; ! 488: ! 489: BASECHAR ! 490: : DIGIT ! 491: { $$ = MakeString($1); } ! 492: | UPPERCHAR ! 493: { $$ = MakeString($1); } ! 494: | OTHERCHAR ! 495: { $$ = MakeString($1); } ! 496: | '(' ! 497: { $$ = MakeString('('); } ! 498: | ')' ! 499: { $$ = MakeString(')'); } ! 500: | '-' ! 501: { $$ = MakeString('-'); } ! 502: ; ! 503: ! 504: SP ! 505: : BLANK BLANKLIST ! 506: ; ! 507: ! 508: BLANKLIST ! 509: : BLANKLIST BLANK ! 510: | EMPTY ! 511: ; ! 512: ! 513: GARBAGE ! 514: : DIGIT ! 515: | UPPERCHAR ! 516: | '-' | '(' | ')' ! 517: ; ! 518: ! 519: SEMI ! 520: : ';' BLANKLIST ! 521: ; ! 522: ! 523: ! 524: EMPTY ! 525: : ! 526: ; ! 527: %% ! 528: ! 529: #include "scanner.c" ! 530:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.