00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 # include "lclintMacros.nf"
00053 # include "llbasic.h"
00054 # include "gram.h"
00055 # include "lclscan.h"
00056 # include "scanline.h"
00057 # include "lclscanline.h"
00058 # include "lcltokentable.h"
00059 # include "lclsyntable.h"
00060
00061
00062 # define CHARSIZE 256
00063
00064
00065 # define LCLMOVECHAR() \
00066 do { *bufPtr++ = currentChar; currentChar = *currentLine++; \
00067 colNumber++; } while (FALSE)
00068
00069
00070 # define LOOKAHEADCHAR() (*currentLine)
00071
00072
00073 # define LOOKAHEADTWICECHAR() (*(currentLine + 1))
00074
00075
00076 # define MAXCHAR 512
00077
00078
00079
00080
00081
00082
00083
00084 # define FIRSTRESERVEDNAME "?"
00085
00086
00087
00088
00089
00090
00091 typedef enum
00092 {
00093 STARTCNUM,
00094 STARTCNUMDOT,
00095 STARTCSTR,
00096 STARTCCHAR,
00097 STARTWIDE,
00098 STARTSLASH,
00099 STARTOTHER
00100 } StartCharType;
00101
00102 static void ScanCComment (void);
00103 static void ScanEscape (void);
00104 static void ScanCString (void);
00105 static void ScanCChar (void);
00106 static void ScanCNumber (void);
00107 static void LocalUserError ( char *);
00108
00109
00110
00111
00112
00113
00114 static charClassData LCLcharClass[LASTCHAR + 1];
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 static unsigned int colNumber;
00126 static unsigned int startCol;
00127 static char *currentLine;
00128 static char currentChar;
00129 static ltokenCode tokenCode;
00130 static lsymbol tokenSym;
00131 static char *bufPtr;
00132
00133 static bool inComment;
00134 static ltoken commentTok;
00135 static ltokenCode prevTokenCode;
00136
00137 static StartCharType startClass[CHARSIZE] =
00138 {
00139 STARTOTHER,
00140 STARTOTHER,
00141 STARTOTHER,
00142 STARTOTHER,
00143 STARTOTHER,
00144 STARTOTHER,
00145 STARTOTHER,
00146 STARTOTHER,
00147
00148 STARTOTHER,
00149 STARTOTHER,
00150 STARTOTHER,
00151 STARTOTHER,
00152 STARTOTHER,
00153 STARTOTHER,
00154 STARTOTHER,
00155 STARTOTHER,
00156
00157 STARTOTHER,
00158 STARTOTHER,
00159 STARTOTHER,
00160 STARTOTHER,
00161 STARTOTHER,
00162 STARTOTHER,
00163 STARTOTHER,
00164 STARTOTHER,
00165
00166 STARTOTHER,
00167 STARTOTHER,
00168 STARTOTHER,
00169 STARTOTHER,
00170 STARTOTHER,
00171 STARTOTHER,
00172 STARTOTHER,
00173 STARTOTHER,
00174
00175 STARTOTHER,
00176 STARTOTHER,
00177 STARTCSTR,
00178 STARTOTHER,
00179 STARTOTHER,
00180 STARTOTHER,
00181 STARTOTHER,
00182 STARTCCHAR,
00183
00184 STARTOTHER,
00185 STARTOTHER,
00186 STARTOTHER,
00187 STARTOTHER,
00188 STARTOTHER,
00189 STARTOTHER,
00190 STARTCNUMDOT,
00191 STARTSLASH,
00192
00193 STARTCNUM,
00194 STARTCNUM,
00195 STARTCNUM,
00196 STARTCNUM,
00197 STARTCNUM,
00198 STARTCNUM,
00199 STARTCNUM,
00200 STARTCNUM,
00201
00202 STARTCNUM,
00203 STARTCNUM,
00204 STARTOTHER,
00205 STARTOTHER,
00206 STARTOTHER,
00207 STARTOTHER,
00208 STARTOTHER,
00209 STARTOTHER,
00210
00211 STARTOTHER,
00212 STARTOTHER,
00213 STARTOTHER,
00214 STARTOTHER,
00215 STARTOTHER,
00216 STARTOTHER,
00217 STARTOTHER,
00218 STARTOTHER,
00219
00220 STARTOTHER,
00221 STARTOTHER,
00222 STARTOTHER,
00223 STARTOTHER,
00224 STARTOTHER,
00225 STARTOTHER,
00226 STARTOTHER,
00227 STARTOTHER,
00228
00229 STARTOTHER,
00230 STARTOTHER,
00231 STARTOTHER,
00232 STARTOTHER,
00233 STARTOTHER,
00234 STARTOTHER,
00235 STARTOTHER,
00236 STARTOTHER,
00237
00238 STARTOTHER,
00239 STARTOTHER,
00240 STARTOTHER,
00241 STARTOTHER,
00242 STARTWIDE,
00243 STARTOTHER,
00244 STARTOTHER,
00245 STARTOTHER,
00246
00247 STARTOTHER,
00248 STARTOTHER,
00249 STARTOTHER,
00250 STARTOTHER,
00251 STARTOTHER,
00252 STARTOTHER,
00253 STARTOTHER,
00254 STARTOTHER,
00255
00256 STARTOTHER,
00257 STARTOTHER,
00258 STARTOTHER,
00259 STARTOTHER,
00260 STARTOTHER,
00261 STARTOTHER,
00262 STARTOTHER,
00263 STARTOTHER,
00264
00265 STARTOTHER,
00266 STARTOTHER,
00267 STARTOTHER,
00268 STARTOTHER,
00269 STARTOTHER,
00270 STARTOTHER,
00271 STARTOTHER,
00272 STARTOTHER,
00273
00274 STARTOTHER,
00275 STARTOTHER,
00276 STARTOTHER,
00277 STARTOTHER,
00278 STARTOTHER,
00279 STARTOTHER,
00280 STARTOTHER,
00281 STARTOTHER,
00282 STARTOTHER
00283 };
00284
00285
00286
00287
00288
00289
00290 static bool isDigit[CHARSIZE] =
00291 {
00292 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00293 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00294 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00295 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00296 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00297 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00298 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00299 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00300 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
00301 };
00302
00303
00304
00305
00306
00307
00308 static bool isOigit[CHARSIZE] =
00309 {
00310 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00311 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00312 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00313 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00314 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00315 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00316 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00317 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
00318 };
00319
00320
00321
00322
00323
00324
00325 static bool isXigit[CHARSIZE] =
00326 {
00327 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00328 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00329 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00330
00331 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00332 FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00333 TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00334
00335 FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE,
00336 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00337 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00338
00339 FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE,
00340 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00341 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
00342 };
00343
00344
00345
00346
00347
00348
00349
00350
00351 static bool isStrChar[CHARSIZE] =
00352 {
00353 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00354 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00355 TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00356 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00357 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00358 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE,
00359 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00360 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
00361 };
00362
00363
00364
00365
00366
00367
00368
00369 static bool isCharChar[CHARSIZE] =
00370 {
00371 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE,
00372 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00373 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00374 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00375 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00376 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE,
00377 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,
00378 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE
00379 };
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 static bool isSimpleEscape[CHARSIZE] =
00390 {
00391 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00392 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00393 FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00394 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
00395 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
00396 FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE,
00397 FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE,
00398 FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
00399 };
00400
00401 static bool reportEOL;
00402 static bool reportComments;
00403 static lsymbol firstReserved;
00404
00405 static char tokenBuffer[MAXCHAR];
00406
00407 static const charClassData charClassDef[] =
00408 {
00409
00410
00411 { SINGLECHAR, FALSE },
00412 { SINGLECHAR, FALSE },
00413 { SINGLECHAR, FALSE },
00414 { SINGLECHAR, FALSE },
00415 { SINGLECHAR, FALSE },
00416 { SINGLECHAR, FALSE },
00417 { SINGLECHAR, FALSE },
00418 { SINGLECHAR, FALSE },
00419 { SINGLECHAR, FALSE },
00420
00421
00422 { WHITECHAR, FALSE },
00423 { CHC_NULL, TRUE },
00424
00425
00426 { SINGLECHAR, FALSE },
00427 { WHITECHAR, FALSE },
00428 { SINGLECHAR, FALSE },
00429 { SINGLECHAR, FALSE },
00430 { SINGLECHAR, FALSE },
00431 { SINGLECHAR, FALSE },
00432 { SINGLECHAR, FALSE },
00433 { SINGLECHAR, FALSE },
00434 { SINGLECHAR, FALSE },
00435 { SINGLECHAR, FALSE },
00436 { SINGLECHAR, FALSE },
00437 { SINGLECHAR, FALSE },
00438 { SINGLECHAR, FALSE },
00439 { SINGLECHAR, FALSE },
00440 { SINGLECHAR, FALSE },
00441 { SINGLECHAR, FALSE },
00442 { SINGLECHAR, FALSE },
00443 { SINGLECHAR, FALSE },
00444 { SINGLECHAR, FALSE },
00445 { SINGLECHAR, FALSE },
00446 { SINGLECHAR, FALSE },
00447
00448
00449 { WHITECHAR, FALSE },
00450 { SINGLECHAR, FALSE },
00451 { SINGLECHAR, FALSE },
00452 { SINGLECHAR, FALSE },
00453 { SINGLECHAR, FALSE },
00454 { SINGLECHAR, FALSE },
00455 { SINGLECHAR, FALSE },
00456 { SINGLECHAR, FALSE },
00457
00458
00459 { PERMCHAR, FALSE },
00460 { PERMCHAR, FALSE },
00461 { PERMCHAR, FALSE },
00462 { OPCHAR, FALSE },
00463 { PERMCHAR, FALSE },
00464 { OPCHAR, FALSE },
00465 { OPCHAR, FALSE },
00466 { OPCHAR, FALSE },
00467
00468
00469 { IDCHAR, FALSE },
00470 { IDCHAR, FALSE },
00471 { IDCHAR, FALSE },
00472 { IDCHAR, FALSE },
00473 { IDCHAR, FALSE },
00474 { IDCHAR, FALSE },
00475 { IDCHAR, FALSE },
00476 { IDCHAR, FALSE },
00477 { IDCHAR, FALSE },
00478 { IDCHAR, FALSE },
00479
00480
00481 { PERMCHAR, FALSE },
00482 { PERMCHAR, FALSE },
00483 { OPCHAR, FALSE },
00484 { OPCHAR, FALSE },
00485 { OPCHAR, FALSE },
00486 { SINGLECHAR, FALSE },
00487 { SINGLECHAR, FALSE },
00488
00489
00490 { IDCHAR, FALSE },
00491 { IDCHAR, FALSE },
00492 { IDCHAR, FALSE },
00493 { IDCHAR, FALSE },
00494 { IDCHAR, FALSE },
00495 { IDCHAR, FALSE },
00496 { IDCHAR, FALSE },
00497 { IDCHAR, FALSE },
00498 { IDCHAR, FALSE },
00499 { IDCHAR, FALSE },
00500 { IDCHAR, FALSE },
00501 { IDCHAR, FALSE },
00502 { IDCHAR, FALSE },
00503 { IDCHAR, FALSE },
00504 { IDCHAR, FALSE },
00505 { IDCHAR, FALSE },
00506 { IDCHAR, FALSE },
00507 { IDCHAR, FALSE },
00508 { IDCHAR, FALSE },
00509 { IDCHAR, FALSE },
00510 { IDCHAR, FALSE },
00511 { IDCHAR, FALSE },
00512 { IDCHAR, FALSE },
00513 { IDCHAR, FALSE },
00514 { IDCHAR, FALSE },
00515 { IDCHAR, FALSE },
00516
00517
00518 { PERMCHAR, FALSE },
00519 { CHC_EXTENSION, FALSE },
00520 { PERMCHAR, FALSE },
00521 { SINGLECHAR, FALSE },
00522 { IDCHAR, FALSE },
00523 { SINGLECHAR, FALSE },
00524
00525
00526 { IDCHAR, FALSE },
00527 { IDCHAR, FALSE },
00528 { IDCHAR, FALSE },
00529 { IDCHAR, FALSE },
00530 { IDCHAR, FALSE },
00531 { IDCHAR, FALSE },
00532 { IDCHAR, FALSE },
00533 { IDCHAR, FALSE },
00534 { IDCHAR, FALSE },
00535 { IDCHAR, FALSE },
00536 { IDCHAR, FALSE },
00537 { IDCHAR, FALSE },
00538 { IDCHAR, FALSE },
00539 { IDCHAR, FALSE },
00540 { IDCHAR, FALSE },
00541 { IDCHAR, FALSE },
00542 { IDCHAR, FALSE },
00543 { IDCHAR, FALSE },
00544 { IDCHAR, FALSE },
00545 { IDCHAR, FALSE },
00546 { IDCHAR, FALSE },
00547 { IDCHAR, FALSE },
00548 { IDCHAR, FALSE },
00549 { IDCHAR, FALSE },
00550 { IDCHAR, FALSE },
00551 { IDCHAR, FALSE },
00552
00553 { SINGLECHAR, FALSE },
00554 { SINGLECHAR, FALSE },
00555 { SINGLECHAR, FALSE },
00556 { SINGLECHAR, FALSE },
00557 { SINGLECHAR, FALSE },
00558
00559
00560 { SINGLECHAR, FALSE },
00561 { SINGLECHAR, FALSE },
00562 { SINGLECHAR, FALSE },
00563 { SINGLECHAR, FALSE },
00564 { SINGLECHAR, FALSE },
00565 { SINGLECHAR, FALSE },
00566 { SINGLECHAR, FALSE },
00567 { SINGLECHAR, FALSE },
00568 { SINGLECHAR, FALSE },
00569 { SINGLECHAR, FALSE },
00570 { SINGLECHAR, FALSE },
00571 { SINGLECHAR, FALSE },
00572 { SINGLECHAR, FALSE },
00573 { SINGLECHAR, FALSE },
00574 { SINGLECHAR, FALSE },
00575 { SINGLECHAR, FALSE },
00576 { SINGLECHAR, FALSE },
00577 { SINGLECHAR, FALSE },
00578 { SINGLECHAR, FALSE },
00579 { SINGLECHAR, FALSE },
00580 { SINGLECHAR, FALSE },
00581 { SINGLECHAR, FALSE },
00582 { SINGLECHAR, FALSE },
00583 { SINGLECHAR, FALSE },
00584 { SINGLECHAR, FALSE },
00585 { SINGLECHAR, FALSE },
00586 { SINGLECHAR, FALSE },
00587 { SINGLECHAR, FALSE },
00588 { SINGLECHAR, FALSE },
00589 { SINGLECHAR, FALSE },
00590 { SINGLECHAR, FALSE },
00591 { SINGLECHAR, FALSE },
00592 { SINGLECHAR, FALSE },
00593 { SINGLECHAR, FALSE },
00594 { SINGLECHAR, FALSE },
00595 { SINGLECHAR, FALSE },
00596 { SINGLECHAR, FALSE },
00597 { SINGLECHAR, FALSE },
00598 { SINGLECHAR, FALSE },
00599 { SINGLECHAR, FALSE },
00600 { SINGLECHAR, FALSE },
00601 { SINGLECHAR, FALSE },
00602 { SINGLECHAR, FALSE },
00603 { SINGLECHAR, FALSE },
00604 { SINGLECHAR, FALSE },
00605 { SINGLECHAR, FALSE },
00606 { SINGLECHAR, FALSE },
00607 { SINGLECHAR, FALSE },
00608 { SINGLECHAR, FALSE },
00609 { SINGLECHAR, FALSE },
00610 { SINGLECHAR, FALSE },
00611 { SINGLECHAR, FALSE },
00612 { SINGLECHAR, FALSE },
00613 { SINGLECHAR, FALSE },
00614 { SINGLECHAR, FALSE },
00615 { SINGLECHAR, FALSE },
00616 { SINGLECHAR, FALSE },
00617 { SINGLECHAR, FALSE },
00618 { SINGLECHAR, FALSE },
00619 { SINGLECHAR, FALSE },
00620 { SINGLECHAR, FALSE },
00621 { SINGLECHAR, FALSE },
00622 { SINGLECHAR, FALSE },
00623 { SINGLECHAR, FALSE },
00624 { SINGLECHAR, FALSE },
00625 { SINGLECHAR, FALSE },
00626 { SINGLECHAR, FALSE },
00627 { SINGLECHAR, FALSE },
00628 { SINGLECHAR, FALSE },
00629 { SINGLECHAR, FALSE },
00630 { SINGLECHAR, FALSE },
00631 { SINGLECHAR, FALSE },
00632 { SINGLECHAR, FALSE },
00633 { SINGLECHAR, FALSE },
00634 { SINGLECHAR, FALSE },
00635 { SINGLECHAR, FALSE },
00636 { SINGLECHAR, FALSE },
00637 { SINGLECHAR, FALSE },
00638 { SINGLECHAR, FALSE },
00639 { SINGLECHAR, FALSE },
00640 { SINGLECHAR, FALSE },
00641 { SINGLECHAR, FALSE },
00642 { SINGLECHAR, FALSE },
00643 { SINGLECHAR, FALSE },
00644 { SINGLECHAR, FALSE },
00645 { SINGLECHAR, FALSE },
00646 { SINGLECHAR, FALSE },
00647 { SINGLECHAR, FALSE },
00648 { SINGLECHAR, FALSE },
00649 { SINGLECHAR, FALSE },
00650 { SINGLECHAR, FALSE },
00651 { SINGLECHAR, FALSE },
00652 { SINGLECHAR, FALSE },
00653 { SINGLECHAR, FALSE },
00654 { SINGLECHAR, FALSE },
00655 { SINGLECHAR, FALSE },
00656 { SINGLECHAR, FALSE },
00657 { SINGLECHAR, FALSE },
00658 { SINGLECHAR, FALSE },
00659 { SINGLECHAR, FALSE },
00660 { SINGLECHAR, FALSE },
00661 { SINGLECHAR, FALSE },
00662 { SINGLECHAR, FALSE },
00663 { SINGLECHAR, FALSE },
00664 { SINGLECHAR, FALSE },
00665 { SINGLECHAR, FALSE },
00666 { SINGLECHAR, FALSE },
00667 { SINGLECHAR, FALSE },
00668 { SINGLECHAR, FALSE },
00669 { SINGLECHAR, FALSE },
00670 { SINGLECHAR, FALSE },
00671 { SINGLECHAR, FALSE },
00672 { SINGLECHAR, FALSE },
00673 { SINGLECHAR, FALSE },
00674 { SINGLECHAR, FALSE },
00675 { SINGLECHAR, FALSE },
00676 { SINGLECHAR, FALSE },
00677 { SINGLECHAR, FALSE },
00678 { SINGLECHAR, FALSE },
00679 { SINGLECHAR, FALSE },
00680 { SINGLECHAR, FALSE },
00681 { SINGLECHAR, FALSE },
00682 { SINGLECHAR, FALSE },
00683 { SINGLECHAR, FALSE },
00684 { SINGLECHAR, FALSE },
00685 { SINGLECHAR, FALSE },
00686 { SINGLECHAR, FALSE },
00687 { SINGLECHAR, FALSE }
00688 };
00689
00690 void
00691 ScanCComment (void)
00692 {
00693 inComment = TRUE;
00694 for (;;)
00695 {
00696 switch (currentChar)
00697 {
00698 case '*':
00699 LCLMOVECHAR ();
00700 if (currentChar == '/')
00701 {
00702 LCLMOVECHAR ();
00703 inComment = FALSE;
00704 return;
00705 }
00706 break;
00707 case '\n':
00708 return;
00709 default:
00710 LCLMOVECHAR ();
00711 }
00712 }
00713 }
00714
00715 void
00716 ScanEscape (void)
00717 {
00718 if (isSimpleEscape[(int)currentChar])
00719 {
00720 LCLMOVECHAR ();
00721 }
00722 else if (currentChar == 'x')
00723 {
00724 LCLMOVECHAR ();
00725 if (!isXigit[(int)currentChar])
00726 {
00727 LocalUserError ("at least one hex digit must follow '\\x'");
00728 }
00729 while (isXigit[(int)currentChar])
00730 {
00731 LCLMOVECHAR ();
00732 }
00733 }
00734 else if (isOigit[(int)currentChar])
00735 {
00736 LCLMOVECHAR ();
00737 if (isOigit[(int)currentChar])
00738 {
00739 LCLMOVECHAR ();
00740 }
00741 if (isOigit[(int)currentChar])
00742 {
00743 LCLMOVECHAR ();
00744 }
00745 }
00746 else
00747 {
00748 LocalUserError ("invalid escape sequence in a C string or character");
00749 }
00750 }
00751
00752 void
00753 ScanCString (void)
00754 {
00755 if (currentChar == '\\' && LOOKAHEADCHAR () == 'L')
00756 {
00757 LCLMOVECHAR ();
00758 LCLMOVECHAR ();
00759 }
00760
00761 if (currentChar == '\"')
00762 {
00763 LCLMOVECHAR ();
00764
00765 while (currentChar != '\"')
00766 {
00767 if (isStrChar[(int)currentChar])
00768 {
00769 LCLMOVECHAR ();
00770 }
00771 else if (currentChar == '\\')
00772 {
00773 LCLMOVECHAR ();
00774 ScanEscape ();
00775 }
00776 else if (currentChar == '\n')
00777 {
00778 LocalUserError ("unterminated C string");
00779 }
00780 else
00781 {
00782 LocalUserError ("invalid character in C string");
00783 }
00784 }
00785 LCLMOVECHAR ();
00786
00787 }
00788 else
00789 {
00790 LocalUserError ("C string must start with '\"'");
00791 }
00792
00793
00794 *bufPtr = '\0';
00795 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
00796 tokenCode = LLT_LCSTRING;
00797 }
00798
00799 void
00800 ScanCChar (void)
00801 {
00802 if (currentChar == '\\' && LOOKAHEADCHAR () == 'L')
00803 {
00804 LCLMOVECHAR ();
00805 LCLMOVECHAR ();
00806 }
00807
00808 if (currentChar == '\'')
00809 {
00810 LCLMOVECHAR ();
00811
00812 while (currentChar != '\'')
00813 {
00814 if (isCharChar[(int)currentChar])
00815 {
00816 LCLMOVECHAR ();
00817 }
00818 else if (currentChar == '\\')
00819 {
00820 LCLMOVECHAR ();
00821 ScanEscape ();
00822 }
00823 else if (currentChar == '\n')
00824 {
00825 LocalUserError ("unterminated C character constant");
00826 }
00827 else
00828 {
00829 LocalUserError ("invalid character in C character");
00830 }
00831 }
00832 LCLMOVECHAR ();
00833
00834 }
00835 else
00836 {
00837 LocalUserError ("invalid C character");
00838 }
00839
00840
00841 *bufPtr = '\0';
00842 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
00843 tokenCode = LLT_CCHAR;
00844 }
00845
00846 void
00847 ScanCNumber (void)
00848 {
00849 tokenCode = LLT_CINTEGER;
00850
00851 switch (currentChar)
00852 {
00853 case '.':
00854 LCLMOVECHAR ();
00855 tokenCode = LLT_CFLOAT;
00856 if (!isDigit[(int)currentChar])
00857 {
00858 LocalUserError ("at least one digit must follow '.'");
00859 }
00860 while (isDigit[(int)currentChar])
00861 {
00862 LCLMOVECHAR ();
00863 }
00864 if (currentChar == 'e' || currentChar == 'E')
00865 {
00866 LCLMOVECHAR ();
00867 if (currentChar == '+' || currentChar == '-')
00868 {
00869 LCLMOVECHAR ();
00870 }
00871 if (!isDigit[(int)currentChar])
00872 {
00873 LocalUserError ("digit must follow exponent");
00874 }
00875 while (isDigit[(int)currentChar])
00876 {
00877 LCLMOVECHAR ();
00878 }
00879 }
00880 if (currentChar == 'f' || currentChar == 'l' ||
00881 currentChar == 'F' || currentChar == 'L')
00882 {
00883 LCLMOVECHAR ();
00884 }
00885 break;
00886
00887 case '0':
00888 LCLMOVECHAR ();
00889 switch (currentChar)
00890 {
00891 case 'x':
00892 case 'X':
00893 LCLMOVECHAR ();
00894 if (!isXigit[(int)currentChar])
00895 {
00896 LocalUserError ("hex digit must follow 'x' or 'X'");
00897 }
00898 while (isXigit[(int)currentChar])
00899 {
00900 LCLMOVECHAR ();
00901 }
00902 break;
00903
00904 default:
00905
00906
00907
00908
00909
00910
00911
00912
00913 while (isDigit[(int)currentChar])
00914 {
00915 LCLMOVECHAR ();
00916 }
00917 switch (currentChar)
00918 {
00919 case '.':
00920 LCLMOVECHAR ();
00921 tokenCode = LLT_CFLOAT;
00922 while (isDigit[(int)currentChar])
00923 {
00924 LCLMOVECHAR ();
00925 }
00926 if (currentChar == 'e' || currentChar == 'E')
00927 {
00928 LCLMOVECHAR ();
00929 if (currentChar == '+' || currentChar == '-')
00930 {
00931 LCLMOVECHAR ();
00932 }
00933 if (!isDigit[(int)currentChar])
00934 {
00935 LocalUserError ("digit must follow exponent");
00936 }
00937 while (isDigit[(int)currentChar])
00938 {
00939 LCLMOVECHAR ();
00940 }
00941 }
00942 if (currentChar == 'f' ||
00943 currentChar == 'l' ||
00944 currentChar == 'F' ||
00945 currentChar == 'L')
00946 {
00947 LCLMOVECHAR ();
00948 }
00949 break;
00950
00951 case 'e':
00952 case 'E':
00953 LCLMOVECHAR ();
00954 tokenCode = LLT_CFLOAT;
00955 if (currentChar == '+' || currentChar == '-')
00956 {
00957 LCLMOVECHAR ();
00958 }
00959 if (!isDigit[(int)currentChar])
00960 {
00961 LocalUserError ("digit must follow exponent");
00962 }
00963 while (isDigit[(int)currentChar])
00964 {
00965 LCLMOVECHAR ();
00966 }
00967 if (currentChar == 'f' ||
00968 currentChar == 'l' ||
00969 currentChar == 'F' ||
00970 currentChar == 'L')
00971 {
00972 LCLMOVECHAR ();
00973 }
00974 break;
00975
00976 default:
00977
00978 switch (currentChar)
00979 {
00980 case 'u':
00981 case 'U':
00982 LCLMOVECHAR ();
00983 if (currentChar == 'l' || currentChar == 'L')
00984 {
00985 LCLMOVECHAR ();
00986 }
00987 break;
00988 case 'l':
00989 case 'L':
00990 LCLMOVECHAR ();
00991 if (currentChar == 'u' || currentChar == 'U')
00992 {
00993 LCLMOVECHAR ();
00994 }
00995
00996 break;
00997 }
00998 break;
00999 }
01000 }
01001
01002
01003 switch (currentChar)
01004 {
01005 case 'u':
01006 case 'U':
01007 LCLMOVECHAR ();
01008 if (currentChar == 'l' || currentChar == 'L')
01009 {
01010 LCLMOVECHAR ();
01011 }
01012 break;
01013 case 'l':
01014 case 'L':
01015 LCLMOVECHAR ();
01016 if (currentChar == 'u' || currentChar == 'U')
01017 {
01018 LCLMOVECHAR ();
01019 }
01020 break;
01021 }
01022 break;
01023
01024 default:
01025 if (isDigit[(int)currentChar])
01026 {
01027 while (isDigit[(int)currentChar])
01028 {
01029 LCLMOVECHAR ();
01030 }
01031 switch (currentChar)
01032 {
01033 case '.':
01034 LCLMOVECHAR ();
01035 tokenCode = LLT_CFLOAT;
01036 while (isDigit[(int)currentChar])
01037 {
01038 LCLMOVECHAR ();
01039 }
01040 if (currentChar == 'e' || currentChar == 'E')
01041 {
01042 LCLMOVECHAR ();
01043 if (currentChar == '+' || currentChar == '-')
01044 {
01045 LCLMOVECHAR ();
01046 }
01047 if (!isDigit[(int)currentChar])
01048 {
01049 LocalUserError ("digit must follow exponent");
01050 }
01051 while (isDigit[(int)currentChar])
01052 {
01053 LCLMOVECHAR ();
01054 }
01055 }
01056 if (currentChar == 'f' ||
01057 currentChar == 'l' ||
01058 currentChar == 'F' ||
01059 currentChar == 'L')
01060 {
01061 LCLMOVECHAR ();
01062 }
01063 break;
01064
01065 case 'e':
01066 case 'E':
01067 LCLMOVECHAR ();
01068 tokenCode = LLT_CFLOAT;
01069 if (currentChar == '+' || currentChar == '-')
01070 {
01071 LCLMOVECHAR ();
01072 }
01073 if (!isDigit[(int)currentChar])
01074 {
01075 LocalUserError ("digit must follow exponent");
01076 }
01077 while (isDigit[(int)currentChar])
01078 {
01079 LCLMOVECHAR ();
01080 }
01081 if (currentChar == 'f' ||
01082 currentChar == 'l' ||
01083 currentChar == 'F' ||
01084 currentChar == 'L')
01085 {
01086 LCLMOVECHAR ();
01087 }
01088
01089 break;
01090 default:
01091 switch (currentChar)
01092 {
01093 case 'u':
01094 case 'U':
01095 LCLMOVECHAR ();
01096 if (currentChar == 'l' || currentChar == 'L')
01097 {
01098 LCLMOVECHAR ();
01099 }
01100 break;
01101 case 'l':
01102 case 'L':
01103 LCLMOVECHAR ();
01104 if (currentChar == 'u' || currentChar == 'U')
01105 {
01106 LCLMOVECHAR ();
01107 }
01108 break;
01109 }
01110 break;
01111 }
01112 }
01113 else
01114 {
01115 LocalUserError ("invalid C number");
01116 }
01117 break;
01118
01119
01120 }
01121
01122 *bufPtr = '\0';
01123 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01124 }
01125
01126 static void ScanOther (void)
01127 {
01128 switch (LCLScanCharClass (currentChar))
01129 {
01130 case CHC_NULL:
01131 tokenSym = lsymbol_fromChars ("E O L");
01132 tokenCode = LLT_EOL;
01133 break;
01134
01135
01136
01137 case IDCHAR:
01138
01139 while (LCLScanCharClass (currentChar) == IDCHAR)
01140 {
01141 LCLMOVECHAR ();
01142 }
01143
01144 *bufPtr = '\0';
01145 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01146 tokenCode = simpleId;
01147 break;
01148
01149
01150
01151 case SINGLECHAR:
01152 case PERMCHAR:
01153 LCLMOVECHAR ();
01154 *bufPtr = '\0';
01155 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01156 tokenCode = simpleOp;
01157 break;
01158
01159
01160
01161 case OPCHAR:
01162
01163 if (currentChar == '.' && LOOKAHEADCHAR () == '.' &&
01164 LOOKAHEADTWICECHAR () == '.')
01165 {
01166 LCLMOVECHAR ();
01167 LCLMOVECHAR ();
01168 LCLMOVECHAR ();
01169 *bufPtr = '\0';
01170 tokenSym = lsymbol_fromChars ("...");
01171 tokenCode = LLT_TELIPSIS;
01172 }
01173 else
01174 {
01175 if (currentChar == '/' && LOOKAHEADCHAR () == '\\')
01176 {
01177 LCLMOVECHAR ();
01178 LCLMOVECHAR ();
01179 }
01180 else
01181 {
01182 while (LCLScanCharClass (currentChar) == OPCHAR)
01183 {
01184 LCLMOVECHAR ();
01185 }
01186 }
01187
01188 *bufPtr = '\0';
01189 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01190 tokenCode = simpleOp;
01191 }
01192 break;
01193
01194
01195 case WHITECHAR:
01196
01197
01198 switch (currentChar)
01199 {
01200 case '\t':
01201 LCLMOVECHAR ();
01202 break;
01203
01204 case '\v':
01205 case '\f':
01206 LCLMOVECHAR ();
01207 colNumber--;
01208 break;
01209
01210 default:
01211 LCLMOVECHAR ();
01212 break;
01213 }
01214
01215
01216 *bufPtr = '\0';
01217 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01218 tokenCode = LLT_WHITESPACE;
01219 break;
01220
01221
01222
01223 case CHC_EXTENSION:
01224 LCLMOVECHAR ();
01225
01226
01227 switch (currentChar)
01228 {
01229
01230 case '(':
01231 LCLMOVECHAR ();
01232 while (LCLScanCharClass (currentChar) == IDCHAR)
01233 {
01234 LCLMOVECHAR ();
01235 }
01236 *bufPtr = '\0';
01237 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01238 tokenCode = openSym;
01239 break;
01240
01241 case ')':
01242 LCLMOVECHAR ();
01243 while (LCLScanCharClass (currentChar) == IDCHAR)
01244 {
01245 LCLMOVECHAR ();
01246 }
01247 *bufPtr = '\0';
01248 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01249 tokenCode = closeSym;
01250 break;
01251
01252
01253 case ',':
01254 LCLMOVECHAR ();
01255 while (LCLScanCharClass (currentChar) == IDCHAR)
01256 {
01257 LCLMOVECHAR ();
01258 }
01259 *bufPtr = '\0';
01260 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01261 tokenCode = sepSym;
01262 break;
01263
01264
01265 case ':':
01266 LCLMOVECHAR ();
01267 while (LCLScanCharClass (currentChar) == IDCHAR)
01268 {
01269 LCLMOVECHAR ();
01270 }
01271 *bufPtr = '\0';
01272 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01273 tokenCode = simpleId;
01274 break;
01275
01276 default:
01277 if (LCLScanCharClass (currentChar) == IDCHAR)
01278 {
01279 do
01280 {
01281 LCLMOVECHAR ();
01282 }
01283 while (LCLScanCharClass (currentChar) == IDCHAR);
01284 *bufPtr = '\0';
01285 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01286 tokenCode = simpleOp;
01287 }
01288 else
01289 {
01290
01291
01292
01293
01294
01295
01296
01297 LCLMOVECHAR ();
01298 *bufPtr = '\0';
01299 tokenSym = lsymbol_fromChars (&tokenBuffer[0]);
01300 tokenCode = simpleOp;
01301 }
01302 break;
01303
01304 }
01305 break;
01306
01307 default:
01308 LocalUserError ("unexpected character in input");
01309 return;
01310 }
01311
01312 }
01313
01314 static bool
01315 nextCanBeCharLiteral (ltokenCode c)
01316 {
01317 switch (c)
01318 {
01319
01320 case logicalOp:
01321 case equationSym:
01322 case eqSepSym:
01323 case openSym:
01324 case sepSym:
01325 case simpleOp:
01326 case LLT_COMMA:
01327 case LLT_EQUALS:
01328 case LLT_LBRACE:
01329 case LLT_LBRACKET:
01330 case LLT_LPAR:
01331 case eqOp:
01332 case LLT_BE:
01333 case LLT_ELSE:
01334 case LLT_ENSURES:
01335 case LLT_IF:
01336 case LLT_CONSTRAINT:
01337 case LLT_REQUIRES:
01338 case LLT_CHECKS:
01339 case LLT_BODY:
01340 case LLT_THEN:
01341 return (TRUE);
01342
01343
01344 case selectSym:
01345 case closeSym:
01346 case simpleId:
01347 case preSym:
01348 case anySym:
01349 case postSym:
01350 case LLT_QUOTE:
01351 case LLT_RBRACE:
01352 case LLT_RBRACKET:
01353 case LLT_RPAR:
01354 case LLT_RESULT:
01355 return (FALSE);
01356
01357
01358 case quantifierSym:
01359 case mapSym:
01360 case markerSym:
01361 case LLT_COLON:
01362 case LLT_SEMI:
01363 case LLT_VERTICALBAR:
01364 case LLT_MULOP:
01365 case LLT_CCHAR:
01366 case LLT_CFLOAT:
01367 case LLT_CINTEGER:
01368 case LLT_LCSTRING:
01369 case LLT_ALL:
01370 case LLT_ANYTHING:
01371 case LLT_CONSTANT:
01372 case LLT_FOR:
01373 case LLT_IMMUTABLE:
01374 case LLT_OBJ:
01375 case LLT_OUT:
01376 case LLT_IMPORTS:
01377 case LLT_ISSUB:
01378 case LLT_LET:
01379 case LLT_MODIFIES:
01380 case LLT_CLAIMS:
01381 case LLT_MUTABLE:
01382 case LLT_FRESH:
01383 case LLT_NOTHING:
01384 case LLT_PRIVATE:
01385 case LLT_SPEC:
01386 case LLT_SIZEOF:
01387 case LLT_TAGGEDUNION:
01388 case LLT_TYPE:
01389 case LLT_UNCHANGED:
01390 case LLT_USES:
01391 case LLT_CHAR:
01392 case LLT_CONST:
01393 case LLT_DOUBLE:
01394 case LLT_ENUM:
01395 case LLT_FLOAT:
01396 case LLT_INT:
01397 case LLT_TYPEDEF_NAME:
01398 case LLT_LONG:
01399 case LLT_SHORT:
01400 case LLT_STRUCT:
01401 case LLT_SIGNED:
01402 case LLT_UNKNOWN:
01403 case LLT_UNION:
01404 case LLT_UNSIGNED:
01405 case LLT_VOID:
01406 case LLT_VOLATILE:
01407 return (FALSE);
01408
01409
01410 case NOTTOKEN:
01411 case commentSym:
01412 case LLT_WHITESPACE:
01413 case LLT_EOL:
01414 case LEOFTOKEN:
01415 llcontbuglit ("scanline: nextCanBeChar");
01416 return FALSE;
01417 BADDEFAULT;
01418 }
01419
01420 BADEXIT;
01421 }
01422
01423 void
01424 LCLScanLine (char *line)
01425 {
01426 ltoken newToken;
01427 lsymbol CCommentSym = lsymbol_fromChars ("/*");
01428 size_t linelength = strlen (line);
01429 static bool inSpecComment = FALSE;
01430
01431 line[(int)linelength] = '\n';
01432
01433 currentLine = line;
01434 currentChar = *currentLine++;
01435 context_processedSpecLine ();
01436
01437 incLine ();
01438 colNumber = 1;
01439
01440 if (inComment)
01441 {
01442 ScanCComment ();
01443
01444 if (reportComments)
01445 {
01446 *bufPtr = '\0';
01447 newToken = ltoken_createRaw (simpleId, lsymbol_fromChars (&tokenBuffer[0]));
01448 LCLScanFreshToken (newToken);
01449 }
01450 }
01451
01452 if (inSpecComment)
01453 {
01454 if (currentChar == '*' &&
01455 LOOKAHEADCHAR () == '/')
01456 {
01457 LCLMOVECHAR ();
01458 LCLMOVECHAR ();
01459 inSpecComment = FALSE;
01460 }
01461 }
01462
01463
01464 for (;;)
01465 {
01466 if (inSpecComment && currentChar == '*' && LOOKAHEADCHAR () == '/')
01467 {
01468 LCLMOVECHAR ();
01469 LCLMOVECHAR ();
01470 inSpecComment = FALSE;
01471 }
01472
01473 bufPtr = &tokenBuffer[0];
01474 startCol = colNumber;
01475
01476
01477
01478 switch (startClass[(int)currentChar])
01479 {
01480 case STARTCNUM:
01481 ScanCNumber ();
01482 break;
01483
01484 case STARTCNUMDOT:
01485 if (isDigit[(int) LOOKAHEADCHAR ()])
01486 {
01487 ScanCNumber ();
01488 }
01489 else
01490 {
01491 ScanOther ();
01492 }
01493 break;
01494
01495 case STARTCSTR:
01496 ScanCString ();
01497 break;
01498
01499 case STARTCCHAR:
01500 if (nextCanBeCharLiteral (prevTokenCode))
01501 {
01502 ScanCChar ();
01503 }
01504 else
01505 {
01506 ScanOther ();
01507 }
01508 break;
01509
01510 case STARTWIDE:
01511 if (LOOKAHEADCHAR () == 'L' && LOOKAHEADTWICECHAR () == '\"')
01512 {
01513 ScanCString ();
01514 }
01515 else if (LOOKAHEADCHAR () == 'L' && LOOKAHEADTWICECHAR () == '\'')
01516 {
01517 ScanCChar ();
01518 }
01519 else
01520 {
01521 ScanOther ();
01522 }
01523 break;
01524
01525 case STARTSLASH:
01526 if (LOOKAHEADCHAR () == '*')
01527 {
01528 LCLMOVECHAR ();
01529 LCLMOVECHAR ();
01530
01531 if (currentChar == '@')
01532 {
01533 char *s = mstring_createEmpty ();
01534
01535 LCLMOVECHAR ();
01536
01537 while (currentChar != '\0' && currentChar != ' '
01538 && currentChar != '*' && currentChar != '\t' &&
01539 currentChar != '\n')
01540 {
01541 s = mstring_append (s, currentChar);
01542 LCLMOVECHAR ();
01543 }
01544
01545 if (mstring_equal (s, "alt"))
01546 {
01547 tokenCode = LLT_VERTICALBAR;
01548 tokenSym = lsymbol_fromChars ("|");
01549 inSpecComment = TRUE;
01550 }
01551 else
01552 {
01553 ScanCComment ();
01554 tokenCode = commentSym;
01555 tokenSym = CCommentSym;
01556 }
01557
01558 sfree (s);
01559 break;
01560 }
01561 else
01562 {
01563 ScanCComment ();
01564 tokenCode = commentSym;
01565 tokenSym = CCommentSym;
01566 break;
01567 }
01568 }
01569 else
01570 {
01571 ScanOther ();
01572 } break;
01573
01574 case STARTOTHER:
01575 ScanOther ();
01576 break;
01577
01578 default:
01579 llcontbuglit ("LCLScanLine: bad case");
01580 break;
01581
01582 }
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592 newToken = LCLInsertToken (tokenCode, tokenSym, lsymbol_undefined, FALSE);
01593
01594
01595 if (LCLIsSyn (ltoken_getText (newToken)))
01596 {
01597
01598
01599
01600
01601
01602 newToken = ltoken_copy (LCLGetTokenForSyn (ltoken_getText (newToken)));
01603
01604 ltoken_setRawText (newToken, tokenSym);
01605 }
01606 else
01607 {
01608 newToken = ltoken_copy (newToken);
01609 }
01610
01611 ltoken_setCol (newToken, startCol);
01612 ltoken_setLine (newToken, tsource_thisLineNumber (LCLScanSource ()));
01613 ltoken_setFileName (newToken, tsource_fileName (LCLScanSource ()));
01614
01615 if (ltoken_getCode (newToken) == commentSym)
01616 {
01617 if (tokenSym == CCommentSym)
01618 {
01619 ltoken_free (commentTok);
01620 commentTok = ltoken_copy (newToken);
01621
01622 if (!inComment && reportComments)
01623 {
01624 *bufPtr = '\0';
01625 ltoken_setRawText (newToken,
01626 lsymbol_fromChars (&tokenBuffer[0]));
01627 LCLScanFreshToken (newToken);
01628 }
01629 else
01630 {
01631 ltoken_free (newToken);
01632 }
01633 }
01634 else
01635 {
01636 bufPtr = &tokenBuffer[0];
01637 while (!LCLIsEndComment (currentChar))
01638 {
01639 LCLMOVECHAR ();
01640 }
01641 if (LCLScanCharClass (currentChar) != CHC_NULL)
01642 {
01643
01644 LCLMOVECHAR ();
01645 }
01646
01647 if (reportComments)
01648 {
01649 *bufPtr = '\0';
01650 ltoken_setRawText (newToken,
01651 lsymbol_fromChars (&tokenBuffer[0]));
01652 LCLScanFreshToken (newToken);
01653 }
01654 else
01655 {
01656 ltoken_free (newToken);
01657 }
01658 }
01659 }
01660 else if (ltoken_getCode (newToken) == LLT_EOL)
01661 {
01662 if (reportEOL)
01663 {
01664 LCLScanFreshToken (newToken);
01665 }
01666 else
01667 {
01668 ltoken_free (newToken);
01669 }
01670
01671 line[(int) linelength] = '\0';
01672 return;
01673 }
01674 else if (ltoken_getCode (newToken) != LLT_WHITESPACE)
01675 {
01676 prevTokenCode = ltoken_getCode (newToken);
01677 LCLScanFreshToken (newToken);
01678 }
01679 else
01680 {
01681 ltoken_free (newToken);
01682 }
01683 }
01684 }
01685
01686 ltoken
01687 LCLScanEofToken (void)
01688 {
01689 ltoken t = LCLInsertToken (LEOFTOKEN, lsymbol_fromChars ("E O F"), 0, TRUE);
01690
01691 if (inComment)
01692 {
01693 lclerror (commentTok, cstring_makeLiteral ("Unterminated comment"));
01694 }
01695
01696 ltoken_setCol (t, colNumber);
01697 ltoken_setLine (t, tsource_thisLineNumber (LCLScanSource ()));
01698 ltoken_setFileName (t, tsource_fileName (LCLScanSource ()));
01699
01700 return t;
01701 }
01702
01703 void
01704 LCLReportEolTokens (bool setting)
01705 {
01706 reportEOL = setting;
01707 }
01708
01709 static void
01710 LocalUserError (char *msg)
01711 {
01712 tsource *s = LCLScanSource ();
01713 llfatalerror (message ("%s:%u,%u: %s",
01714 cstring_fromChars (tsource_fileName (s)),
01715 tsource_thisLineNumber (s),
01716 colNumber,
01717 cstring_fromChars (msg)));
01718 }
01719
01720 void
01721 LCLScanLineInit (void)
01722 {
01723 int i;
01724
01725 setCodePoint ();
01726 reportEOL = FALSE;
01727 reportComments = FALSE;
01728
01729 for (i = 0; i <= LASTCHAR; i++)
01730 {
01731 LCLcharClass[i] = charClassDef[i];
01732 }
01733
01734 setCodePoint ();
01735
01736
01737
01738
01739
01740
01741 firstReserved = lsymbol_fromChars (FIRSTRESERVEDNAME);
01742 setCodePoint ();
01743
01744
01745
01746 ltoken_forall = LCLReserveToken (quantifierSym, "\\forall");
01747 setCodePoint ();
01748 ltoken_exists = LCLReserveToken (quantifierSym, "\\exists");
01749 ltoken_implies = LCLReserveToken (logicalOp, "\\implies");
01750 ltoken_eqsep = LCLReserveToken (eqSepSym, "\\eqsep");
01751 ltoken_select = LCLReserveToken (selectSym, "\\select");
01752 ltoken_open = LCLReserveToken (openSym, "\\open");
01753 ltoken_sep = LCLReserveToken (sepSym, "\\,");
01754 ltoken_close = LCLReserveToken (closeSym, "\\close");
01755 ltoken_id = LCLReserveToken (simpleId, "\\:");
01756 ltoken_arrow = LCLReserveToken (mapSym, "\\arrow");
01757 ltoken_marker = LCLReserveToken (markerSym, "\\marker");
01758 ltoken_pre = LCLReserveToken (preSym, "\\pre");
01759 ltoken_post = LCLReserveToken (postSym, "\\post");
01760 ltoken_comment = LCLReserveToken (commentSym, "\\comment");
01761 ltoken_any = LCLReserveToken (anySym, "\\any");
01762
01763 ltoken_result = LCLReserveToken (LLT_RESULT, "result");
01764 ltoken_typename = LCLReserveToken (LLT_TYPEDEF_NAME, "TYPEDEF_NAME");
01765 ltoken_setIdType (ltoken_typename, SID_TYPE);
01766
01767
01768
01769
01770
01771
01772 ltoken_bool = LCLReserveToken (LLT_TYPEDEF_NAME, "bool");
01773
01774 ltoken_lbracked = LCLReserveToken (LLT_LBRACKET, "[");
01775 ltoken_rbracket = LCLReserveToken (LLT_RBRACKET, "]");
01776
01777 (void) LCLReserveToken (LLT_COLON, ":");
01778 (void) LCLReserveToken (LLT_COMMA, ",");
01779
01780 (void) LCLReserveToken (LLT_EQUALS, "=");
01781 (void) LCLReserveToken (LLT_LBRACE, "{");
01782 (void) LCLReserveToken (LLT_LPAR, "(");
01783 (void) LCLReserveToken (LLT_RBRACE, "}");
01784 (void) LCLReserveToken (LLT_RPAR, ")");
01785 (void) LCLReserveToken (LLT_SEMI, ";");
01786 (void) LCLReserveToken (LLT_VERTICALBAR, "|");
01787
01788 (void) LCLReserveToken (LLT_MULOP, "*");
01789
01790 (void) LCLReserveToken (LLT_WHITESPACE, " ");
01791 (void) LCLReserveToken (LLT_WHITESPACE, "\t");
01792 (void) LCLReserveToken (LLT_WHITESPACE, "\f");
01793 (void) LCLReserveToken (LLT_WHITESPACE, "\n");
01794
01795 (void) LCLReserveToken (LEOFTOKEN, "E O F");
01796 (void) LCLReserveToken (LLT_EOL, "E O L");
01797
01798
01799 ltoken_and = LCLReserveToken (logicalOp, "\\and");
01800 ltoken_or = LCLReserveToken (logicalOp, "\\or");
01801
01802 ltoken_equals = LCLReserveToken (equationSym, "\\equals");
01803
01804 ltoken_eq = LCLReserveToken (eqOp, "\\eq");
01805 ltoken_neq = LCLReserveToken (eqOp, "\\neq");
01806
01807 ltoken_not = LCLReserveToken (simpleOp, "\\not");
01808 ltoken_true = LCLReserveToken (simpleId, "true");
01809 ltoken_false = LCLReserveToken (simpleId, "false");
01810
01811
01812 (void) LCLReserveToken (LLT_ALL, "all");
01813 (void) LCLReserveToken (LLT_ANYTHING, "anything");
01814 (void) LCLReserveToken (LLT_BE, "be");
01815 (void) LCLReserveToken (LLT_CONSTANT, "constant");
01816 (void) LCLReserveToken (LLT_CHECKS, "checks");
01817 (void) LCLReserveToken (LLT_ELSE, "else");
01818 (void) LCLReserveToken (LLT_ENSURES, "ensures");
01819 (void) LCLReserveToken (LLT_FOR, "for");
01820 (void) LCLReserveToken (LLT_IF, "if");
01821 (void) LCLReserveToken (LLT_IMMUTABLE, "immutable");
01822 (void) LCLReserveToken (LLT_OBJ, "obj");
01823 (void) LCLReserveToken (LLT_OUT, "out");
01824 (void) LCLReserveToken (LLT_ITER, "iter");
01825 (void) LCLReserveToken (LLT_YIELD, "yield");
01826 (void) LCLReserveToken (LLT_PARTIAL, "partial");
01827 (void) LCLReserveToken (LLT_ONLY, "only");
01828 (void) LCLReserveToken (LLT_UNDEF, "undef");
01829 (void) LCLReserveToken (LLT_KILLED, "killed");
01830 (void) LCLReserveToken (LLT_OWNED, "owned");
01831 (void) LCLReserveToken (LLT_DEPENDENT, "dependent");
01832 (void) LCLReserveToken (LLT_PARTIAL, "partial");
01833 (void) LCLReserveToken (LLT_RELDEF, "reldef");
01834 (void) LCLReserveToken (LLT_KEEP, "keep");
01835 (void) LCLReserveToken (LLT_KEPT, "kept");
01836 (void) LCLReserveToken (LLT_TEMP, "temp");
01837 (void) LCLReserveToken (LLT_SHARED, "shared");
01838 (void) LCLReserveToken (LLT_RELNULL, "relnull");
01839 (void) LCLReserveToken (LLT_RELDEF, "reldef");
01840 (void) LCLReserveToken (LLT_CHECKED, "checked");
01841 (void) LCLReserveToken (LLT_UNCHECKED, "unchecked");
01842 (void) LCLReserveToken (LLT_CHECKEDSTRICT, "checkedstrict");
01843 (void) LCLReserveToken (LLT_CHECKMOD, "checkmod");
01844 (void) LCLReserveToken (LLT_TRUENULL, "truenull");
01845 (void) LCLReserveToken (LLT_FALSENULL, "falsenull");
01846 (void) LCLReserveToken (LLT_LNULL, "null");
01847 (void) LCLReserveToken (LLT_LNOTNULL, "notnull");
01848 (void) LCLReserveToken (LLT_RETURNED, "returned");
01849 (void) LCLReserveToken (LLT_OBSERVER, "observer");
01850 (void) LCLReserveToken (LLT_EXPOSED, "exposed");
01851 (void) LCLReserveToken (LLT_REFCOUNTED, "refcounted");
01852 (void) LCLReserveToken (LLT_REFS, "refs");
01853 (void) LCLReserveToken (LLT_NEWREF, "newref");
01854 (void) LCLReserveToken (LLT_TEMPREF, "tempref");
01855 (void) LCLReserveToken (LLT_KILLREF, "killref");
01856 (void) LCLReserveToken (LLT_EXITS, "exits");
01857 (void) LCLReserveToken (LLT_MAYEXIT, "mayexit");
01858 (void) LCLReserveToken (LLT_TRUEEXIT, "trueexit");
01859 (void) LCLReserveToken (LLT_FALSEEXIT, "falseexit");
01860 (void) LCLReserveToken (LLT_NEVEREXIT, "neverexit");
01861 (void) LCLReserveToken (LLT_SEF, "sef");
01862 (void) LCLReserveToken (LLT_UNUSED, "unused");
01863 (void) LCLReserveToken (LLT_UNIQUE, "unique");
01864 (void) LCLReserveToken (LLT_IMPORTS, "imports");
01865 (void) LCLReserveToken (LLT_CONSTRAINT, "constraint");
01866 (void) LCLReserveToken (LLT_LET, "let");
01867 (void) LCLReserveToken (LLT_MODIFIES, "modifies");
01868 (void) LCLReserveToken (LLT_CLAIMS, "claims");
01869 (void) LCLReserveToken (LLT_BODY, "body");
01870 (void) LCLReserveToken (LLT_MUTABLE, "mutable");
01871 (void) LCLReserveToken (LLT_FRESH, "fresh");
01872 (void) LCLReserveToken (LLT_NOTHING, "nothing");
01873 (void) LCLReserveToken (LLT_INTERNAL, "internalState");
01874 (void) LCLReserveToken (LLT_FILESYS, "fileSystem");
01875 (void) LCLReserveToken (LLT_PRIVATE, "private");
01876 (void) LCLReserveToken (LLT_SPEC, "spec");
01877 (void) LCLReserveToken (LLT_REQUIRES, "requires");
01878 (void) LCLReserveToken (LLT_SIZEOF, "sizeof");
01879 (void) LCLReserveToken (LLT_TAGGEDUNION, "taggedunion");
01880 (void) LCLReserveToken (LLT_THEN, "then");
01881 (void) LCLReserveToken (LLT_TYPE, "type");
01882 (void) LCLReserveToken (LLT_TYPEDEF, "typedef");
01883 (void) LCLReserveToken (LLT_UNCHANGED, "unchanged");
01884 (void) LCLReserveToken (LLT_USES, "uses");
01885 (void) LCLReserveToken (LLT_PRINTFLIKE, "printflike");
01886 (void) LCLReserveToken (LLT_SCANFLIKE, "scanflike");
01887 (void) LCLReserveToken (LLT_MESSAGELIKE, "messagelike");
01888
01889
01890 (void) LCLReserveToken (LLT_CHAR, "char");
01891 (void) LCLReserveToken (LLT_CONST, "const");
01892 (void) LCLReserveToken (LLT_DOUBLE, "double");
01893 (void) LCLReserveToken (LLT_ENUM, "enum");
01894
01895
01896
01897
01898
01899
01900 (void) LCLReserveToken (LLT_INT, "int");
01901 (void) LCLReserveToken (LLT_LONG, "long");
01902 (void) LCLReserveToken (LLT_SHORT, "short");
01903 (void) LCLReserveToken (LLT_STRUCT, "struct");
01904 (void) LCLReserveToken (LLT_SIGNED, "signed");
01905 (void) LCLReserveToken (LLT_UNION, "union");
01906 (void) LCLReserveToken (LLT_UNKNOWN, "__unknown");
01907 (void) LCLReserveToken (LLT_UNSIGNED, "unsigned");
01908 (void) LCLReserveToken (LLT_VOID, "void");
01909 (void) LCLReserveToken (LLT_VOLATILE, "volatile");
01910 setCodePoint ();
01911 }
01912
01913 void
01914 LCLScanLineReset (void)
01915 {
01916 inComment = FALSE;
01917 prevTokenCode = LLT_LPAR;
01918 }
01919
01920 void
01921 LCLScanLineCleanup (void)
01922 {
01923 }
01924
01925 bool LCLIsEndComment (char c)
01926 {
01927 return LCLcharClass[(int)(c)].endCommentChar;
01928 }
01929
01930 charCode LCLScanCharClass (char c)
01931 {
01932 return LCLcharClass[(int)(c)].code;
01933 }
01934
01935 void LCLSetCharClass (char c, charCode cod)
01936 {
01937 LCLcharClass[(int)(c)].code = (cod);
01938 }
01939
01940 void LCLSetEndCommentChar (char c, bool flag)
01941 {
01942 LCLcharClass[(int)(c)].endCommentChar = flag;
01943 }
01944