shell.slex
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:22k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* shell.slex - small lex description for VxWorks shell */
  2. /*
  3. modification history
  4. --------------------
  5. 02i,27nov01,pch  Provide floating-point exclusion based on _WRS_NO_TGT_SHELL_FP
  6.  definition instead of testing a specific CPU type.
  7. 02h,02mar95,yao  make floating point conditional for PPC403.
  8. 02g,29aug94,ism  added ^M to nl char class so that PC scripts run (SPR#2899)
  9. 02f,29aug94,ism  added v and a ansi escape sequences for strings (SPR#3690)
  10. 02e,19aug92,jmm  fixed incorrect recognition of DATA symbols as TEXT
  11. 02d,01aug92,srh  added check to match identifier against mangled C++ symbols.
  12. 02c,30jul92,wmd  use N_TEXT to compare when checking for TEXT type symbol.
  13. 02b,13dec91,gae  more ANSI cleanup.
  14. 02a,19nov91,rrr  shut up some ansi warnings.
  15. 01z,19nov91,rrr  shut up some warnings.
  16. 01y,07oct91,rrr  added forward declaration for lexInit() (more forward).
  17. 01x,10aug90,dnw  added forward declaration for lexInit().
  18. 01w,08aug90,dnw  changed "%F" to "%lf" for ANSI compatibility.
  19. 01v,10dec89,jcf  symbol table type now SYM_TYPE.
  20. 01u,15oct88,dnw  improved support for Ada identifiers.
  21.  made it conditional on sysAdaEnable.
  22. 01t,09nov88,rdc  modifications to support ada identifiers.
  23. 01s,30may88,dnw  changed to v4 names.
  24. 01r,28may88,dnw  changed calls to atoi() and atof() to sscanf().
  25. 01q,18mar88,gae  allowed '^' to occur in strings.
  26. 01p,18nov87,gae  added T_UNKNOWN for undefined symbols.
  27.  made shell float types default to double.
  28. 01o,28oct87,gae  got rid of string type.
  29. 01n,20oct87,gae  fixed lexScan() bug - used MAX_SHELL_LINE for temp. buffer.
  30.    added scanning of octal chars, eg. '377'.
  31. 01m,07aug87,gae  fixed final state of octal.
  32.  changed type specifiers to conventional C type casting.
  33. 01l,01jun87,gae  added interpretation of bytes, words, floats, doubles.
  34.  added type specifiers a la assembler, .[bwfdls].
  35.  fixed table for "*=".
  36. 01k,09jan87,gae  fixed '^', and '^'.
  37. 01j,24dec86,gae  added '->' back into table accidentally removed in 01h.
  38. 01i,24nov86,llk  deleted SYSTEM conditional compiles.
  39. 01h,08oct86,gae  added C assignment operators.
  40. 01g,04jun86,dnw  changed sstLib calls to symLib.
  41. 01f,11oct85,dnw  de-linted.
  42. 01e,19jun85,dnw  added conditional compilation for BSD 4.2 load modules.
  43. 01d,10sep84,dnw  included routines from lexLib directly in this module.
  44.  fixed bug in automatic parens insertion.
  45. 01c,29aug84,jlf  changed to treat "_" as a normal alphabetic character.
  46. 01b,18aug84,dnw  changed to recognize and discard "/ * .... " style comments.
  47.  changed to treat ';' like a NL for automatic insertion of ().
  48. 01a,02aug84,dnw  written
  49. */
  50. IMPORT BOOL sysAdaEnable; /* TRUE = enable Ada support */
  51. IMPORT BOOL sysCplusEnable; /* TRUE = enable C++ support */
  52. typedef enum /* states for automatic insertion of parens in yylex */
  53.     {
  54.     FIRST_LEXEME,
  55.     NORMAL,
  56.     P_OPEN,
  57.     P_OPEN_DONE,
  58.     P_CLOSE,
  59.     P_CLOSE_DONE
  60.     } AUTO_STATE;
  61. LOCAL AUTO_STATE autoState; /* state of auto parens mods */
  62. LOCAL char *nextChar; /* ptr to next input char in line */
  63. LOCAL char tempStrings [MAX_SHELL_LINE];/* storage for strings while parsing */
  64. LOCAL char *nextTempString; /* ptr to free space in tempStrings */
  65. /* forward declaration */
  66. static void lexNewLine (char *line);
  67. static int yylex (void);
  68. static char *addTempString (char *string);
  69. static void lexError (char *string, char *errmsg);
  70. static int getNum (char *string, char *fmtString, VALUE *pValue);
  71. static int getFloat (char *string, VALUE *pValue);
  72. static int getString (char *string, int nChars, VALUE *pValue);
  73. static int getChar (char *string, int nChars, VALUE *pValue);
  74. static int getId (char *string, VALUE *pValue);
  75. static int numAdaIdMatches (char *string, SYM_TYPE *pType, int *pValue);
  76. static BOOL countAdaIdMatch (char *symbol, int val, SYM_TYPE type, int arg);
  77. static BOOL printAdaIdMatch (char *symbol, int val, SYM_TYPE type, int arg);
  78. static BOOL adaIdMatch (char *symbol, char *id);
  79. static int typeCast (char *string);
  80. static int strToChar (char *string, char *pChar);
  81. static void lexInit (void);
  82. static int lexScan (void);
  83. static void lexRetract (void);
  84. CHAR CLASSES: /* generates lexClass[] and lexNclasses */
  85. /* name  definition */
  86. /* ----  ---------- */
  87.     ws   SP t
  88.     1-7  1-7
  89.     8-9  8 9
  90.     a-f  a-f A-F
  91.     xX   x X
  92.     g-z  g-w G-W y Y z Z _
  93.     eof  ^D EOF
  94.     nl  n ^M EOS
  95. /* char class 0 is always "other" */
  96. END
  97. #define RETRACT lexRetract (); string[--nChars] = EOS
  98. FINAL STATES:  /* generates lexActions() */
  99. /* name action */
  100. /* ---- ---------------------- */
  101.     WS { RETRACT; }
  102.     O { RETRACT; return (string[0]); }
  103.     I {  return (string[0]); }
  104.     EN {  lexError(string, "invalid number"); return(LEX_ERROR); }
  105.     ES { lexError(string, "invalid string"); return(LEX_ERROR); }
  106.     EC { lexError(string, "invalid char");   return(LEX_ERROR); }
  107.     ON { RETRACT; return (getNum (string, "%o", &yylval)); }
  108.     XN { RETRACT; return (getNum (&string[2], "%x", &yylval)); }
  109.     $N { RETRACT; return (getNum (&string[1], "%x", &yylval)); }
  110.     DN { RETRACT; return (getNum (string, "%d", &yylval)); }
  111.     FN { RETRACT; return (getFloat (string, &yylval)); }
  112.     ID { RETRACT; return (getId (string, &yylval)); }
  113.     ST { return (getString (string, nChars, &yylval)); }
  114.     CH { return (getChar (string, nChars, &yylval)); }
  115.     || { return (OR); }
  116.     && { return (AND); }
  117.     == { return (EQ); }
  118.     != { return (NE); }
  119.     >= { return (GE); }
  120.     <= { return (LE); }
  121.     >> { RETRACT; return (ROT_RIGHT); }
  122.     << { RETRACT; return (ROT_LEFT); }
  123.     -> { return (PTR); }
  124.     ++ { return (INCR); }
  125.     -- { return (DECR); }
  126.     += { return (ADDA); }
  127.     -= { return (SUBA); }
  128.     *= { return (MULA); }
  129.     /= { return (DIVA); }
  130.     %= { return (MODA); }
  131.     <A { return (SHLA); }
  132.     >A { return (SHRA); }
  133.     &= { return (ANDA); }
  134.     |= { return (ORA); }
  135.     ^= { return (XORA); }
  136.     NL { return (NL); }
  137.     EOF { return (ENDFILE); }
  138. END
  139. STATE TABLE: /* generates lexStateTable[] */
  140. /*   0   1      2   3   4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 */
  141.  other ws  0  1-7 8-9 a-f xX g-z .    "  '  $  |  &  =  !  >  <  -  +  /  *  %   ^ nl eof
  142. /*  -- -- --- --- --- --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  -- -- ---*/
  143. ini  I ws  0  dec dec  id id id .D  I  "  '  $  |  &  =  !  >  <  -  +  s  *  %   ^ NL EOF
  144. ws  WS  .  WS  WS  WS  WS WS WS WS WS WS WS WS WS WS WS WS WS WS WS WS WS WS WS WS WS WS
  145. 0   DN DN oct oct  EN  EN 0x EN .N DN DN DN DN DN DN DN DN DN DN DN DN DN DN DN DN DN DN
  146. oct ON ON  .   .   EN  EN EN EN ON ON ON ON ON ON ON ON ON ON ON ON ON ON ON ON ON ON ON
  147. 0x  EN EN 0xh 0xh 0xh 0xh EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN
  148. 0xh XN XN  .   .   .   .  EN EN EN XN XN XN XN XN XN XN XN XN XN XN XN XN XN XN XN XN XN
  149. $   EN EN  $h  $h  $h  $h EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN EN
  150. $h  $N $N  .   .   .   .  EN EN EN $N $N $N $N $N $N $N $N $N $N $N $N $N $N $N $N $N $N
  151. dec DN DN  .   .   .   EN EN EN .N DN DN DN DN DN DN DN DN DN DN DN DN DN DN DN DN DN DN
  152. .D FN  FN  .N  .N  .N  EN EN EN EN FN FN FN FN FN FN FN FN FN FN FN FN FN FN FN FN FN FN
  153. .N  FN FN  .   .   .   EN EN EN EN FN FN FN FN FN FN FN FN FN FN FN FN FN FN FN FN FN FN
  154. id  ID ID  .   .   .   .   .  . ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID ID
  155. "    .  .  .   .   .   .   .  .  . " ST  .  .  .  .  .  .  .  .  .  .  .  .  .  . ES ES
  156. "   "  "  "   "   "   "   "  "  "  "  "  "  "  "  "  "  "  "  "  "  "  "  "  "  . ES ES
  157. '    .  .  .   .   .   .   .  .  . '  . CH  .  .  .  .  .  .  .  .  .  .  .  .  . EC EC
  158. '   '  '  '   '   '   '   '  '  '  '  '  '  '  '  '  '  '  '  '  '  '  '  '  '  ' EC EC
  159. s    O  O  O   O   O   O   O  O  O  O  O  O  O  O  O /=  O  O  O  O  O  O s*  O  O  O  O
  160. s*   .  .  .   .   .   .   .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . s+  .  .  .  .
  161. s+  s* s* s*  s*  s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* s* ini s* s* s* s* s*
  162. |    O  O  O   O   O  O   O  O  O  O  O  O  O ||  O |=  O  O  O  O  O  O  O  O  O  O  O
  163. &    O  O  O   O   O  O   O  O  O  O  O  O  O  O && &=  O  O  O  O  O  O  O  O  O  O  O
  164. =    O  O  O   O   O  O   O  O  O  O  O  O  O  O  O ==  O  O  O  O  O  O  O  O  O  O  O
  165. !    O  O  O   O   O  O   O  O  O  O  O  O  O  O  O !=  O  O  O  O  O  O  O  O  O  O  O
  166. >    O  O  O   O   O  O   O  O  O  O  O  O  O  O  O >=  O >X  O  O  O  O  O  O  O  O  O
  167. <    O  O  O   O   O  O   O  O  O  O  O  O  O  O  O <=  O  O <X  O  O  O  O  O  O  O  O
  168. -    O  O  O   O   O  O   O  O  O  O  O  O  O  O  O -=  O ->  O --  O  O  O  O  O  O  O
  169. +    O  O  O   O   O  O   O  O  O  O  O  O  O  O  O +=  O  O  O  O ++  O  O  O  O  O  O
  170. *    O  O  O   O   O  O   O  O  O  O  O  O  O  O  O *=  O  O  O  O  O  O  O  O  O  O  O
  171. %    O  O  O   O   O  O   O  O  O  O  O  O  O  O  O %=  O  O  O  O  O  O  O  O  O  O  O
  172. ^    O  O  O   O   O  O   O  O  O  O  O  O  O  O  O ^=  O  O  O  O  O  O  O  O  O  O  O
  173. >X  >> >> >>  >>  >> >>  >> >> >> >> >> >> >> >> >> >A >> >> >> >> >> >> >> >> >> >> >>
  174. <X  << << <<  <<  << <<  << << << << << << << << << <A << << << << << << << << << << <<
  175. END
  176. EJECT:
  177. END
  178. /*******************************************************************************
  179. *
  180. * lexNewLine - initialize for lexical scan of new line
  181. *
  182. * RETURNS: N/A
  183. */
  184. LOCAL void lexNewLine
  185.     (
  186.     char *line
  187.     )
  188.     {
  189.     lexInit ();
  190.     nextChar = line;
  191.     nextTempString = tempStrings;
  192.     autoState = FIRST_LEXEME;
  193.     }
  194. /*******************************************************************************
  195. *
  196. * yylex - get next lexeme for yacc
  197. *
  198. * This routine is called by yacc to get the next input lexeme.
  199. * In addition to simply calling lexScan to do the scan, this routine
  200. * also handles the automatic insertion of parens around the arguements
  201. * of a "top-level" routine call.  If the first lexeme scanned from a new
  202. * line is a T_SYMBOL (text id) and the second lexeme is NOT a '(',
  203. * then the second lexeme is withheld and a '(' returned instead.
  204. * The withheld lexeme is returned next.  Scanning then proceeds normally
  205. * until a NL (newline) lexeme is scanned.  The NL is withheld and a
  206. * ')' is returned instead, with the NL being returned next.
  207. *
  208. * RETURNS: next lexeme.
  209. */
  210. LOCAL int yylex (void)
  211.     {
  212.     static int heldCode;
  213.     FAST int code;
  214.     switch (autoState)
  215. {
  216.         case FIRST_LEXEME: /* first lex scan of new line */
  217.     code = lexScan ();
  218.     autoState = (code == T_SYMBOL) ? P_OPEN : NORMAL;
  219.     break;
  220. case NORMAL: /* parens not required to be inserted */
  221.     code = lexScan ();
  222.     if (code == ';')
  223. autoState = FIRST_LEXEME;
  224.     break;
  225. case P_OPEN: /* looking for '(' */
  226.     code = lexScan ();
  227.     if (code == '(')
  228. autoState = NORMAL;
  229.     else
  230. {
  231. heldCode = code;
  232. code = '(';
  233. autoState = P_OPEN_DONE;
  234. }
  235.     break;
  236. case P_OPEN_DONE: /* artificial '(' has been returned */
  237.     if ((heldCode == NL) || (heldCode == ';'))
  238. {
  239. code = ')';
  240. autoState = P_CLOSE_DONE;
  241. }
  242.     else
  243. {
  244. code = heldCode;
  245. autoState = P_CLOSE;
  246. }
  247.     break;
  248. case P_CLOSE: /* looking for NL or ';' */
  249.     code = lexScan ();
  250.     if ((code == NL) || (code == ';'))
  251. {
  252. heldCode = code;
  253. code = ')';
  254. autoState = P_CLOSE_DONE;
  255. }
  256.     break;
  257. case P_CLOSE_DONE: /* artificial ')' has been returned */
  258.     code = heldCode;
  259.     autoState = FIRST_LEXEME;
  260.     break;
  261. default:
  262.     printf ("yylex: invalid state %#xn", autoState);
  263.     code = 0; /* invalid? */
  264.     break;
  265. }
  266.     return (code);
  267.     }
  268. /*******************************************************************************
  269. *
  270. * addTempString - add string to temporary storage
  271. *
  272. * This routine adds the specified string to the during-parse temporary
  273. * string storage.
  274. *
  275. * RETURNS: pointer to new string appended to temporary area.
  276. */
  277. LOCAL char *addTempString
  278.     (
  279.     char *string
  280.     )
  281.     {
  282.     char *newString = nextTempString;
  283.     while (*string != EOS)
  284. string += strToChar (string, nextTempString++);
  285.     *(nextTempString++) = EOS;
  286.     return (newString);
  287.     }
  288. /*******************************************************************************
  289. *
  290. * lexError - report error in lex scan
  291. *
  292. * RETURNS: N/A
  293. */
  294. LOCAL void lexError
  295.     (
  296.     char *string,
  297.     char *errmsg
  298.     )
  299.     {
  300.     printf ("%s: %sn", errmsg, string);
  301.     }
  302. /*******************************************************************************
  303. *
  304. * getNum - interpret scanned string as integer
  305. *
  306. * RETURNS: NUMBER
  307. */
  308. LOCAL int getNum
  309.     (
  310.     char *string,
  311.     char *fmtString,
  312.     VALUE *pValue
  313.     )
  314.     {
  315.     pValue->side = RHS;
  316.     pValue->type = T_INT;
  317.     sscanf (string, fmtString, &pValue->value.rv);
  318.     return (NUMBER);
  319.     }
  320. /*******************************************************************************
  321. *
  322. * getFloat - interpret scanned string as float
  323. *
  324. * RETURNS: FLOAT
  325. */
  326. LOCAL int getFloat
  327.     (
  328.     char *string,
  329.     VALUE *pValue
  330.     )
  331.     {
  332. #ifndef _WRS_NO_TGT_SHELL_FP
  333.     pValue->side = RHS;
  334.     pValue->type = T_DOUBLE;
  335.     sscanf (string, "%lf", &pValue->value.dp);
  336. #endif /* _WRS_NO_TGT_SHELL_FP */
  337.     return (FLOAT);
  338.     }
  339. /*******************************************************************************
  340. *
  341. * getString - interpret scanned string as quoted string
  342. *
  343. * RETURNS: STRING
  344. */
  345. LOCAL int getString
  346.     (
  347.     char *string,
  348.     int nChars,
  349.     VALUE *pValue
  350.     )
  351.     {
  352.     pValue->side = RHS;
  353.     pValue->type = T_INT;
  354.     string [nChars - 1] = EOS;
  355.     pValue->value.rv = (int)addTempString (&string[1]);
  356.     return (STRING);
  357.     }
  358. /*******************************************************************************
  359. *
  360. * getChar - interpret scanned string as quoted character
  361. *
  362. * RETURNS: CHAR
  363. */
  364. LOCAL int getChar
  365.     (
  366.     char *string,
  367.     int nChars,
  368.     VALUE *pValue
  369.     )
  370.     {
  371.     char ch;
  372.     int n = strToChar (&string [1], &ch);
  373.     if (nChars != (n + 2))
  374. {
  375. lexError (string, "invalid char"); 
  376. return (LEX_ERROR);
  377. }
  378.     pValue->side       = RHS;
  379.     pValue->type       = T_BYTE;
  380.     pValue->value.byte = ch;
  381.     return (CHAR);
  382.     }
  383. /*******************************************************************************
  384. *
  385. * getId - interpret scanned string as identifier or keyword
  386. *
  387. * RETURNS: TYPECAST, {T,D,U}_SYMBOL
  388. */
  389. LOCAL int getId
  390.     (
  391.     char *string,
  392.     FAST VALUE *pValue
  393.     )
  394.     {
  395.     char     tempString [MAX_SHELL_LINE + 1];
  396.     SYM_TYPE type;
  397.     char     *value;
  398.     int      t = typeCast (string);
  399.     if (t != ERROR)
  400. {
  401. pValue->type = (TYPE)t;
  402. return (TYPECAST);
  403. }
  404.     tempString[0] = '_';
  405.     strncpy (&tempString[1], string, MAX_SHELL_LINE);
  406.     tempString [MAX_SHELL_LINE] = EOS;
  407.     if ((symFindByName (sysSymTbl, &tempString[1], &value, &type) == OK) ||
  408.         (symFindByName (sysSymTbl, &tempString[0], &value, &type) == OK) ||
  409.         (type = N_TEXT, value = (char *) taskNameToId (&tempString[1]),
  410.  (int) value != ERROR))
  411. {
  412. pValue->value.lv = (int *) value;
  413. pValue->type     = T_INT;
  414. pValue->side     = LHS;
  415. if ((type & 0xe) == N_TEXT) /* only need to check three bits of type*/
  416.     return (T_SYMBOL);
  417. else
  418.     return (D_SYMBOL);
  419. }
  420.     if (sysAdaEnable)
  421. {
  422. /* check for ada names of the form "_A_<symbolname>.<anything>"
  423.  * a match occurs only if the result is unambiguous. */
  424. switch (numAdaIdMatches (string, &type, (int *) &pValue->value.lv))
  425.     {
  426.     case 0:
  427. break;
  428.     case 1:
  429. pValue->type = T_INT;
  430. pValue->side = LHS;
  431. if (type & N_TEXT)
  432.     return (T_SYMBOL);
  433. else
  434.     return (D_SYMBOL);
  435.     default:
  436. printf ("%s: ambiguous Ada identifier - Possibilities include:n", string);
  437. symEach (sysSymTbl, (FUNCPTR)printAdaIdMatch, (int)string);
  438.     }
  439. }
  440.     if (sysCplusEnable)
  441. {
  442. /* check for mangled C++ names; return unique match or nothing */
  443. if (cplusMatchMangled(sysSymTbl, string, &type,
  444.     (int *) &pValue->value.lv))
  445.     {
  446.     pValue->type = T_INT;
  447.     pValue->side = LHS;
  448.       if ((type & N_TYPE) == N_TEXT)
  449. return T_SYMBOL;
  450.     else
  451. return D_SYMBOL;
  452.     }
  453. }
  454.     /* identifier not found */
  455.     pValue->side = RHS;
  456.     pValue->type = T_UNKNOWN;
  457.     pValue->value.rv = (int)addTempString (string);
  458.     return (U_SYMBOL);
  459.     }
  460. /* HIDDEN */
  461. typedef struct
  462.     {
  463.     char *string;
  464.     int numOccurrences;
  465.     SYM_TYPE type;
  466.     int value;
  467.     } ADA_MATCH;
  468. /* END HIDDEN */
  469. /*******************************************************************************
  470. *
  471. * numAdaIdMatches - attempt to match id with bizarre ada names
  472. *
  473. * RETURNS: number of potential matches
  474. */
  475. LOCAL int numAdaIdMatches
  476.     (
  477.     char *string,
  478.     SYM_TYPE *pType,
  479.     int *pValue
  480.     )
  481.     {
  482.     ADA_MATCH adaMatch;
  483.     adaMatch.string = string;
  484.     adaMatch.numOccurrences = 0;
  485.     symEach (sysSymTbl, (FUNCPTR)countAdaIdMatch, (int)&adaMatch);
  486.     *pType = adaMatch.type;
  487.     *pValue = adaMatch.value;
  488.     return (adaMatch.numOccurrences);
  489.     }
  490. /*******************************************************************************
  491. *
  492. * countAdaIdMatch - count number of symbols that match id as Ada symbol
  493. *
  494. * count ada names of the form "_A_<id>.<anything>"
  495. * called via symEach.
  496. *
  497. * RETURNS: TRUE
  498. */
  499. LOCAL BOOL countAdaIdMatch
  500.     (
  501.     char *symbol, /* symbol from symbol table */
  502.     int val,
  503.     SYM_TYPE type,
  504.     int arg
  505.     )
  506.     {
  507.     FAST ADA_MATCH *pAdaMatch = (ADA_MATCH *) arg;
  508.     if (adaIdMatch (symbol, pAdaMatch->string))
  509. {
  510. pAdaMatch->numOccurrences++;
  511. pAdaMatch->type = type;
  512. pAdaMatch->value = val;
  513. }
  514.     return (TRUE);
  515.     }
  516. /*******************************************************************************
  517. *
  518. * printAdaIdMatch - print a symbol if it is a potential ada name match
  519. *
  520. * called via symEach
  521. *
  522. * RETURNS: TRUE
  523. *
  524. * ARGSUSED2
  525. */
  526. LOCAL BOOL printAdaIdMatch
  527.     (
  528.     char *symbol, /* symbol from symbol table */
  529.     int val,
  530.     SYM_TYPE type,
  531.     int arg /* id being sought */
  532.     )
  533.     {
  534.     if (adaIdMatch (symbol, (char *) arg))
  535. printf ("%sn", symbol);
  536.     return (TRUE);
  537.     }
  538. /*******************************************************************************
  539. *
  540. * adaIdMatch - determine if a symbol is an Ada match for an id.
  541. *
  542. * RETURNS: TRUE if symbol is of form "_A_<id>" or "_A_<id>.<anything>".
  543. */
  544. LOCAL BOOL adaIdMatch
  545.     (
  546.     FAST char *symbol,
  547.     FAST char *id
  548.     )
  549.     {
  550.     if ((symbol [0] != '_') || (symbol [1] != 'A') || (symbol [2] != '_'))
  551. return (FALSE);
  552.     symbol += 3; /* skip "_A_" */
  553.     while ((*id != EOS) && (*symbol != EOS) && (*id == *symbol))
  554. {
  555. ++id;
  556. ++symbol;
  557. }
  558.     return ((*id == EOS) && ((*symbol == EOS) || (*symbol == '.')));
  559.     }
  560. /*******************************************************************************
  561. *
  562. * typeCast - determine if string is a keyword type cast
  563. *
  564. * RETURNS: T_{BYTE,WORD,INT,FLOAT,DOUBLE}, or ERROR
  565. */
  566. LOCAL int typeCast
  567.     (
  568.     FAST char *string
  569.     )
  570.     {
  571.     static char *typen [] =
  572. #ifndef _WRS_NO_TGT_SHELL_FP
  573. {"char", "short", "int", "long", "float", "double"};
  574. #else /* _WRS_NO_TGT_SHELL_FP */
  575. {"char", "short", "int", "long"};
  576. #endif /* _WRS_NO_TGT_SHELL_FP */
  577.     static TYPE  typet [] =
  578. #ifndef _WRS_NO_TGT_SHELL_FP
  579. {T_BYTE, T_WORD, T_INT, T_INT, T_FLOAT, T_DOUBLE};
  580. #else /* _WRS_NO_TGT_SHELL_FP */
  581. {T_BYTE, T_WORD, T_INT, T_INT};
  582. #endif /* _WRS_NO_TGT_SHELL_FP */
  583.     FAST int ix;
  584.     for (ix = 0; ix < NELEMENTS (typet); ix++)
  585. {
  586. if (strcmp (string, typen [ix]) == 0)
  587.     return ((int)typet [ix]);
  588. }
  589.     return (ERROR);
  590.     }
  591. /*******************************************************************************
  592. *
  593. * strToChar - get a possibly escaped character from a string
  594. *
  595. * RETURNS: number of characters parsed and character in <pChar>.
  596. */
  597. LOCAL int strToChar
  598.     (
  599.     FAST char *string,
  600.     char *pChar
  601.     )
  602.     {
  603.     FAST int nchars = 1;
  604.     int num;
  605.     FAST char ch;
  606.     if (*string != '\')
  607. {
  608. *pChar = *string;
  609. return (nchars);
  610. }
  611.     string++;
  612.     if ((*string >= '0') && (*string <= '7'))
  613. {
  614. sscanf (string, "%o", &num);
  615. ch = num % 0400;
  616. while ((*string >= '0') && (*string <= '7'))
  617.     {
  618.     ++string;
  619.     ++nchars;
  620.     }
  621. }
  622.     else
  623. {
  624. nchars++;
  625. switch (*string)
  626.     {
  627.     case 'n':  ch = 'n'; break;
  628.     case 't':  ch = 't'; break;
  629.     case 'b':  ch = 'b'; break;
  630.     case 'r':  ch = 'r'; break;
  631.     case 'f':  ch = 'f'; break;
  632.     case '\': ch = '\'; break;
  633.     case ''': ch = '''; break;
  634.     case '"':  ch = '"'; break;
  635.     case 'a':  ch = (char)0x07; break;
  636.     case 'v':  ch = (char)0x0b; break;
  637.     default:   ch = *string; break;
  638.     }
  639. }
  640.     *pChar = ch;
  641.     return (nchars);
  642.     }
  643. /* lexeme scan routines */
  644. #define EMPTY -2
  645. LOCAL int retractChar;
  646. LOCAL int lastChar;
  647. /*******************************************************************************
  648. *
  649. * lexInit - initialize lex scan routines
  650. *
  651. * RETURNS: N/A
  652. */
  653. LOCAL void lexInit (void)
  654.     {
  655.     retractChar = EMPTY;
  656.     }
  657. /*******************************************************************************
  658. *
  659. * lexScan - scan input for next lexeme
  660. *
  661. * RETURNS: next lexeme.
  662. */
  663. LOCAL int lexScan (void)
  664.     {
  665.     FAST int ch;
  666.     FAST int state;
  667.     int nChars;
  668.     int code;
  669.     BOOL scanContinue;
  670.     char string [MAX_SHELL_LINE + 1];
  671.     do
  672. {
  673. /* get first character; use any retracted character first */
  674. if (retractChar != EMPTY)
  675.     {
  676.     ch = retractChar;
  677.     retractChar = EMPTY;
  678.     }
  679. else
  680.     ch = *(nextChar++);
  681. /* consume characters until final state reached */
  682. state = 0;
  683. for (nChars = 0; nChars < MAX_SHELL_LINE; nChars++)
  684.     {
  685.     /* consume character and make state transition */
  686.     string [nChars] = ch;
  687.     state = lexStateTable [state * lexNclasses + lexClass [ch + 1]];
  688.     /* if final state reached, quit; otherwise get next character */
  689.     if (state < 0)
  690. {
  691. nChars++;
  692. break;
  693. }
  694.     ch = *(nextChar++);
  695.     }
  696. /* final state reached */
  697. state = -state;
  698. string [nChars] = EOS;
  699. lastChar = ch;
  700. code = lexActions (state, string, nChars, &scanContinue);
  701. }
  702.     while (scanContinue);
  703.     return (code);
  704.     }
  705. /*******************************************************************************
  706. *
  707. * lexRetract - retract last character consumed
  708. *
  709. * RETURNS: N/A
  710. */
  711. LOCAL void lexRetract (void)
  712.     {
  713.     retractChar = lastChar;
  714.     }