shell_slex_c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:23k
源码类别:

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. int lexNclasses;
  85. #define RETRACT lexRetract (); string[--nChars] = EOS
  86. int lexActions (state, string, nChars, pContinue)
  87.     int state; char *string; int nChars; BOOL*pContinue;
  88.     {
  89.     *pContinue = FALSE;
  90.     switch (state)
  91.         {
  92.         case 1:
  93.             { RETRACT; } break;
  94.         case 2:
  95.             { RETRACT; return (string[0]); } break;
  96.         case 3:
  97.             {  return (string[0]); } break;
  98.         case 4:
  99.             {  lexError(string, "invalid number"); return(LEX_ERROR); } break;
  100.         case 5:
  101.             { lexError(string, "invalid string"); return(LEX_ERROR); } break;
  102.         case 6:
  103.             { lexError(string, "invalid char");   return(LEX_ERROR); } break;
  104.         case 7:
  105.             { RETRACT; return (getNum (string, "%o", &yylval)); } break;
  106.         case 8:
  107.             { RETRACT; return (getNum (&string[2], "%x", &yylval)); } break;
  108.         case 9:
  109.             { RETRACT; return (getNum (&string[1], "%x", &yylval)); } break;
  110.         case 10:
  111.             { RETRACT; return (getNum (string, "%d", &yylval)); } break;
  112.         case 11:
  113.             { RETRACT; return (getFloat (string, &yylval)); } break;
  114.         case 12:
  115.             { RETRACT; return (getId (string, &yylval)); } break;
  116.         case 13:
  117.             { return (getString (string, nChars, &yylval)); } break;
  118.         case 14:
  119.             { return (getChar (string, nChars, &yylval)); } break;
  120.         case 15:
  121.             { return (OR); } break;
  122.         case 16:
  123.             { return (AND); } break;
  124.         case 17:
  125.             { return (EQ); } break;
  126.         case 18:
  127.             { return (NE); } break;
  128.         case 19:
  129.             { return (GE); } break;
  130.         case 20:
  131.             { return (LE); } break;
  132.         case 21:
  133.             { RETRACT; return (ROT_RIGHT); } break;
  134.         case 22:
  135.             { RETRACT; return (ROT_LEFT); } break;
  136.         case 23:
  137.             { return (PTR); } break;
  138.         case 24:
  139.             { return (INCR); } break;
  140.         case 25:
  141.             { return (DECR); } break;
  142.         case 26:
  143.             { return (ADDA); } break;
  144.         case 27:
  145.             { return (SUBA); } break;
  146.         case 28:
  147.             { return (MULA); } break;
  148.         case 29:
  149.             { return (DIVA); } break;
  150.         case 30:
  151.             { return (MODA); } break;
  152.         case 31:
  153.             { return (SHLA); } break;
  154.         case 32:
  155.             { return (SHRA); } break;
  156.         case 33:
  157.             { return (ANDA); } break;
  158.         case 34:
  159.             { return (ORA); } break;
  160.         case 35:
  161.             { return (XORA); } break;
  162.         case 36:
  163.             { return (NL); } break;
  164.         case 37:
  165.             { return (ENDFILE); } break;
  166.         }
  167.     *pContinue = TRUE;
  168.     return (0);
  169.     }
  170. int lexNclasses = 27;
  171. signed char lexClass [] =
  172.     {
  173.     26,
  174.     25,  0,  0,  0, 26,  0,  0,  0,  0,  1, 25,  0,  0, 25,  0,  0, 
  175.      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
  176.      1, 16, 10,  0, 12, 23, 14, 11,  0,  0, 22, 20,  0, 19,  8, 21, 
  177.      2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  0,  0, 18, 15, 17,  0, 
  178.      0,  5,  5,  5,  5,  5,  5,  7,  7,  7,  7,  7,  7,  7,  7,  7, 
  179.      7,  7,  7,  7,  7,  7,  7,  7,  6,  7,  7,  0,  9,  0, 24,  7, 
  180.      0,  5,  5,  5,  5,  5,  5,  7,  7,  7,  7,  7,  7,  7,  7,  7, 
  181.      7,  7,  7,  7,  7,  7,  7,  7,  6,  7,  7,  0, 13,  0,  0,  0, 
  182.     };
  183. signed char lexStateTable [] =
  184.     {
  185.     -3, 1, 2, 8, 8,11,11,11, 9,-3,12,14, 6,19,20,21,22,23,24,25,26,16,27,28,29,-36,-37,
  186.     -1, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  187.     -10,-10, 3, 3,-4,-4, 4,-4,10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,
  188.     -7,-7, 3, 3,-4,-4,-4,-4,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,
  189.     -4,-4, 5, 5, 5, 5,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
  190.     -8,-8, 5, 5, 5, 5,-4,-4,-4,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,
  191.     -4,-4, 7, 7, 7, 7,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,
  192.     -9,-9, 7, 7, 7, 7,-4,-4,-4,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,
  193.     -10,-10, 8, 8, 8,-4,-4,-4,10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,-10,
  194.     -11,-11,10,10,10,-4,-4,-4,-4,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,
  195.     -11,-11,10,10,10,-4,-4,-4,-4,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,-11,
  196.     -12,-12,11,11,11,11,11,11,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,
  197.     12,12,12,12,12,12,12,12,12,13,-13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,-5,-5,
  198.     12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,-5,-5,
  199.     14,14,14,14,14,14,14,14,14,15,14,-14,14,14,14,14,14,14,14,14,14,14,14,14,14,-6,-6,
  200.     14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,-6,-6,
  201.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-29,-2,-2,-2,-2,-2,-2,17,-2,-2,-2,-2,
  202.     17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,18,17,17,17,17,
  203.     17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, 0,17,17,17,17,17,
  204.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-15,-2,-34,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  205.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-16,-33,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  206.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-17,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  207.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-18,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  208.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-19,-2,30,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  209.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-20,-2,-2,31,-2,-2,-2,-2,-2,-2,-2,-2,
  210.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-27,-2,-23,-2,-25,-2,-2,-2,-2,-2,-2,-2,
  211.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-26,-2,-2,-2,-2,-24,-2,-2,-2,-2,-2,-2,
  212.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-28,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  213.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-30,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  214.     -2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-35,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,
  215.     -21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-32,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,-21,
  216.     -22,-22,-22,-22,-22,-22,-22,-22,-22,-22,-22,-22,-22,-22,-22,-31,-22,-22,-22,-22,-22,-22,-22,-22,-22,-22,-22,
  217.     };
  218. /*******************************************************************************
  219. *
  220. * lexNewLine - initialize for lexical scan of new line
  221. *
  222. * RETURNS: N/A
  223. */
  224. LOCAL void lexNewLine
  225.     (
  226.     char *line
  227.     )
  228.     {
  229.     lexInit ();
  230.     nextChar = line;
  231.     nextTempString = tempStrings;
  232.     autoState = FIRST_LEXEME;
  233.     }
  234. /*******************************************************************************
  235. *
  236. * yylex - get next lexeme for yacc
  237. *
  238. * This routine is called by yacc to get the next input lexeme.
  239. * In addition to simply calling lexScan to do the scan, this routine
  240. * also handles the automatic insertion of parens around the arguements
  241. * of a "top-level" routine call.  If the first lexeme scanned from a new
  242. * line is a T_SYMBOL (text id) and the second lexeme is NOT a '(',
  243. * then the second lexeme is withheld and a '(' returned instead.
  244. * The withheld lexeme is returned next.  Scanning then proceeds normally
  245. * until a NL (newline) lexeme is scanned.  The NL is withheld and a
  246. * ')' is returned instead, with the NL being returned next.
  247. *
  248. * RETURNS: next lexeme.
  249. */
  250. LOCAL int yylex (void)
  251.     {
  252.     static int heldCode;
  253.     FAST int code;
  254.     switch (autoState)
  255. {
  256.         case FIRST_LEXEME: /* first lex scan of new line */
  257.     code = lexScan ();
  258.     autoState = (code == T_SYMBOL) ? P_OPEN : NORMAL;
  259.     break;
  260. case NORMAL: /* parens not required to be inserted */
  261.     code = lexScan ();
  262.     if (code == ';')
  263. autoState = FIRST_LEXEME;
  264.     break;
  265. case P_OPEN: /* looking for '(' */
  266.     code = lexScan ();
  267.     if (code == '(')
  268. autoState = NORMAL;
  269.     else
  270. {
  271. heldCode = code;
  272. code = '(';
  273. autoState = P_OPEN_DONE;
  274. }
  275.     break;
  276. case P_OPEN_DONE: /* artificial '(' has been returned */
  277.     if ((heldCode == NL) || (heldCode == ';'))
  278. {
  279. code = ')';
  280. autoState = P_CLOSE_DONE;
  281. }
  282.     else
  283. {
  284. code = heldCode;
  285. autoState = P_CLOSE;
  286. }
  287.     break;
  288. case P_CLOSE: /* looking for NL or ';' */
  289.     code = lexScan ();
  290.     if ((code == NL) || (code == ';'))
  291. {
  292. heldCode = code;
  293. code = ')';
  294. autoState = P_CLOSE_DONE;
  295. }
  296.     break;
  297. case P_CLOSE_DONE: /* artificial ')' has been returned */
  298.     code = heldCode;
  299.     autoState = FIRST_LEXEME;
  300.     break;
  301. default:
  302.     printf ("yylex: invalid state %#xn", autoState);
  303.     code = 0; /* invalid? */
  304.     break;
  305. }
  306.     return (code);
  307.     }
  308. /*******************************************************************************
  309. *
  310. * addTempString - add string to temporary storage
  311. *
  312. * This routine adds the specified string to the during-parse temporary
  313. * string storage.
  314. *
  315. * RETURNS: pointer to new string appended to temporary area.
  316. */
  317. LOCAL char *addTempString
  318.     (
  319.     char *string
  320.     )
  321.     {
  322.     char *newString = nextTempString;
  323.     while (*string != EOS)
  324. string += strToChar (string, nextTempString++);
  325.     *(nextTempString++) = EOS;
  326.     return (newString);
  327.     }
  328. /*******************************************************************************
  329. *
  330. * lexError - report error in lex scan
  331. *
  332. * RETURNS: N/A
  333. */
  334. LOCAL void lexError
  335.     (
  336.     char *string,
  337.     char *errmsg
  338.     )
  339.     {
  340.     printf ("%s: %sn", errmsg, string);
  341.     }
  342. /*******************************************************************************
  343. *
  344. * getNum - interpret scanned string as integer
  345. *
  346. * RETURNS: NUMBER
  347. */
  348. LOCAL int getNum
  349.     (
  350.     char *string,
  351.     char *fmtString,
  352.     VALUE *pValue
  353.     )
  354.     {
  355.     pValue->side = RHS;
  356.     pValue->type = T_INT;
  357.     sscanf (string, fmtString, &pValue->value.rv);
  358.     return (NUMBER);
  359.     }
  360. /*******************************************************************************
  361. *
  362. * getFloat - interpret scanned string as float
  363. *
  364. * RETURNS: FLOAT
  365. */
  366. LOCAL int getFloat
  367.     (
  368.     char *string,
  369.     VALUE *pValue
  370.     )
  371.     {
  372. #ifndef _WRS_NO_TGT_SHELL_FP
  373.     pValue->side = RHS;
  374.     pValue->type = T_DOUBLE;
  375.     sscanf (string, "%lf", &pValue->value.dp);
  376. #endif /* _WRS_NO_TGT_SHELL_FP */
  377.     return (FLOAT);
  378.     }
  379. /*******************************************************************************
  380. *
  381. * getString - interpret scanned string as quoted string
  382. *
  383. * RETURNS: STRING
  384. */
  385. LOCAL int getString
  386.     (
  387.     char *string,
  388.     int nChars,
  389.     VALUE *pValue
  390.     )
  391.     {
  392.     pValue->side = RHS;
  393.     pValue->type = T_INT;
  394.     string [nChars - 1] = EOS;
  395.     pValue->value.rv = (int)addTempString (&string[1]);
  396.     return (STRING);
  397.     }
  398. /*******************************************************************************
  399. *
  400. * getChar - interpret scanned string as quoted character
  401. *
  402. * RETURNS: CHAR
  403. */
  404. LOCAL int getChar
  405.     (
  406.     char *string,
  407.     int nChars,
  408.     VALUE *pValue
  409.     )
  410.     {
  411.     char ch;
  412.     int n = strToChar (&string [1], &ch);
  413.     if (nChars != (n + 2))
  414. {
  415. lexError (string, "invalid char"); 
  416. return (LEX_ERROR);
  417. }
  418.     pValue->side       = RHS;
  419.     pValue->type       = T_BYTE;
  420.     pValue->value.byte = ch;
  421.     return (CHAR);
  422.     }
  423. /*******************************************************************************
  424. *
  425. * getId - interpret scanned string as identifier or keyword
  426. *
  427. * RETURNS: TYPECAST, {T,D,U}_SYMBOL
  428. */
  429. LOCAL int getId
  430.     (
  431.     char *string,
  432.     FAST VALUE *pValue
  433.     )
  434.     {
  435.     char     tempString [MAX_SHELL_LINE + 1];
  436.     SYM_TYPE type;
  437.     char     *value;
  438.     int      t = typeCast (string);
  439.     if (t != ERROR)
  440. {
  441. pValue->type = (TYPE)t;
  442. return (TYPECAST);
  443. }
  444.     tempString[0] = '_';
  445.     strncpy (&tempString[1], string, MAX_SHELL_LINE);
  446.     tempString [MAX_SHELL_LINE] = EOS;
  447.     if ((symFindByName (sysSymTbl, &tempString[1], &value, &type) == OK) ||
  448.         (symFindByName (sysSymTbl, &tempString[0], &value, &type) == OK) ||
  449.         (type = N_TEXT, value = (char *) taskNameToId (&tempString[1]),
  450.  (int) value != ERROR))
  451. {
  452. pValue->value.lv = (int *) value;
  453. pValue->type     = T_INT;
  454. pValue->side     = LHS;
  455. if ((type & 0xe) == N_TEXT) /* only need to check three bits of type*/
  456.     return (T_SYMBOL);
  457. else
  458.     return (D_SYMBOL);
  459. }
  460.     if (sysAdaEnable)
  461. {
  462. /* check for ada names of the form "_A_<symbolname>.<anything>"
  463.  * a match occurs only if the result is unambiguous. */
  464. switch (numAdaIdMatches (string, &type, (int *) &pValue->value.lv))
  465.     {
  466.     case 0:
  467. break;
  468.     case 1:
  469. pValue->type = T_INT;
  470. pValue->side = LHS;
  471. if (type & N_TEXT)
  472.     return (T_SYMBOL);
  473. else
  474.     return (D_SYMBOL);
  475.     default:
  476. printf ("%s: ambiguous Ada identifier - Possibilities include:n", string);
  477. symEach (sysSymTbl, (FUNCPTR)printAdaIdMatch, (int)string);
  478.     }
  479. }
  480.     if (sysCplusEnable)
  481. {
  482. /* check for mangled C++ names; return unique match or nothing */
  483. if (cplusMatchMangled(sysSymTbl, string, &type,
  484.     (int *) &pValue->value.lv))
  485.     {
  486.     pValue->type = T_INT;
  487.     pValue->side = LHS;
  488.       if ((type & N_TYPE) == N_TEXT)
  489. return T_SYMBOL;
  490.     else
  491. return D_SYMBOL;
  492.     }
  493. }
  494.     /* identifier not found */
  495.     pValue->side = RHS;
  496.     pValue->type = T_UNKNOWN;
  497.     pValue->value.rv = (int)addTempString (string);
  498.     return (U_SYMBOL);
  499.     }
  500. /* HIDDEN */
  501. typedef struct
  502.     {
  503.     char *string;
  504.     int numOccurrences;
  505.     SYM_TYPE type;
  506.     int value;
  507.     } ADA_MATCH;
  508. /* END HIDDEN */
  509. /*******************************************************************************
  510. *
  511. * numAdaIdMatches - attempt to match id with bizarre ada names
  512. *
  513. * RETURNS: number of potential matches
  514. */
  515. LOCAL int numAdaIdMatches
  516.     (
  517.     char *string,
  518.     SYM_TYPE *pType,
  519.     int *pValue
  520.     )
  521.     {
  522.     ADA_MATCH adaMatch;
  523.     adaMatch.string = string;
  524.     adaMatch.numOccurrences = 0;
  525.     symEach (sysSymTbl, (FUNCPTR)countAdaIdMatch, (int)&adaMatch);
  526.     *pType = adaMatch.type;
  527.     *pValue = adaMatch.value;
  528.     return (adaMatch.numOccurrences);
  529.     }
  530. /*******************************************************************************
  531. *
  532. * countAdaIdMatch - count number of symbols that match id as Ada symbol
  533. *
  534. * count ada names of the form "_A_<id>.<anything>"
  535. * called via symEach.
  536. *
  537. * RETURNS: TRUE
  538. */
  539. LOCAL BOOL countAdaIdMatch
  540.     (
  541.     char *symbol, /* symbol from symbol table */
  542.     int val,
  543.     SYM_TYPE type,
  544.     int arg
  545.     )
  546.     {
  547.     FAST ADA_MATCH *pAdaMatch = (ADA_MATCH *) arg;
  548.     if (adaIdMatch (symbol, pAdaMatch->string))
  549. {
  550. pAdaMatch->numOccurrences++;
  551. pAdaMatch->type = type;
  552. pAdaMatch->value = val;
  553. }
  554.     return (TRUE);
  555.     }
  556. /*******************************************************************************
  557. *
  558. * printAdaIdMatch - print a symbol if it is a potential ada name match
  559. *
  560. * called via symEach
  561. *
  562. * RETURNS: TRUE
  563. *
  564. * ARGSUSED2
  565. */
  566. LOCAL BOOL printAdaIdMatch
  567.     (
  568.     char *symbol, /* symbol from symbol table */
  569.     int val,
  570.     SYM_TYPE type,
  571.     int arg /* id being sought */
  572.     )
  573.     {
  574.     if (adaIdMatch (symbol, (char *) arg))
  575. printf ("%sn", symbol);
  576.     return (TRUE);
  577.     }
  578. /*******************************************************************************
  579. *
  580. * adaIdMatch - determine if a symbol is an Ada match for an id.
  581. *
  582. * RETURNS: TRUE if symbol is of form "_A_<id>" or "_A_<id>.<anything>".
  583. */
  584. LOCAL BOOL adaIdMatch
  585.     (
  586.     FAST char *symbol,
  587.     FAST char *id
  588.     )
  589.     {
  590.     if ((symbol [0] != '_') || (symbol [1] != 'A') || (symbol [2] != '_'))
  591. return (FALSE);
  592.     symbol += 3; /* skip "_A_" */
  593.     while ((*id != EOS) && (*symbol != EOS) && (*id == *symbol))
  594. {
  595. ++id;
  596. ++symbol;
  597. }
  598.     return ((*id == EOS) && ((*symbol == EOS) || (*symbol == '.')));
  599.     }
  600. /*******************************************************************************
  601. *
  602. * typeCast - determine if string is a keyword type cast
  603. *
  604. * RETURNS: T_{BYTE,WORD,INT,FLOAT,DOUBLE}, or ERROR
  605. */
  606. LOCAL int typeCast
  607.     (
  608.     FAST char *string
  609.     )
  610.     {
  611.     static char *typen [] =
  612. #ifndef _WRS_NO_TGT_SHELL_FP
  613. {"char", "short", "int", "long", "float", "double"};
  614. #else /* _WRS_NO_TGT_SHELL_FP */
  615. {"char", "short", "int", "long"};
  616. #endif /* _WRS_NO_TGT_SHELL_FP */
  617.     static TYPE  typet [] =
  618. #ifndef _WRS_NO_TGT_SHELL_FP
  619. {T_BYTE, T_WORD, T_INT, T_INT, T_FLOAT, T_DOUBLE};
  620. #else /* _WRS_NO_TGT_SHELL_FP */
  621. {T_BYTE, T_WORD, T_INT, T_INT};
  622. #endif /* _WRS_NO_TGT_SHELL_FP */
  623.     FAST int ix;
  624.     for (ix = 0; ix < NELEMENTS (typet); ix++)
  625. {
  626. if (strcmp (string, typen [ix]) == 0)
  627.     return ((int)typet [ix]);
  628. }
  629.     return (ERROR);
  630.     }
  631. /*******************************************************************************
  632. *
  633. * strToChar - get a possibly escaped character from a string
  634. *
  635. * RETURNS: number of characters parsed and character in <pChar>.
  636. */
  637. LOCAL int strToChar
  638.     (
  639.     FAST char *string,
  640.     char *pChar
  641.     )
  642.     {
  643.     FAST int nchars = 1;
  644.     int num;
  645.     FAST char ch;
  646.     if (*string != '\')
  647. {
  648. *pChar = *string;
  649. return (nchars);
  650. }
  651.     string++;
  652.     if ((*string >= '0') && (*string <= '7'))
  653. {
  654. sscanf (string, "%o", &num);
  655. ch = num % 0400;
  656. while ((*string >= '0') && (*string <= '7'))
  657.     {
  658.     ++string;
  659.     ++nchars;
  660.     }
  661. }
  662.     else
  663. {
  664. nchars++;
  665. switch (*string)
  666.     {
  667.     case 'n':  ch = 'n'; break;
  668.     case 't':  ch = 't'; break;
  669.     case 'b':  ch = 'b'; break;
  670.     case 'r':  ch = 'r'; break;
  671.     case 'f':  ch = 'f'; break;
  672.     case '\': ch = '\'; break;
  673.     case ''': ch = '''; break;
  674.     case '"':  ch = '"'; break;
  675.     case 'a':  ch = (char)0x07; break;
  676.     case 'v':  ch = (char)0x0b; break;
  677.     default:   ch = *string; break;
  678.     }
  679. }
  680.     *pChar = ch;
  681.     return (nchars);
  682.     }
  683. /* lexeme scan routines */
  684. #define EMPTY -2
  685. LOCAL int retractChar;
  686. LOCAL int lastChar;
  687. /*******************************************************************************
  688. *
  689. * lexInit - initialize lex scan routines
  690. *
  691. * RETURNS: N/A
  692. */
  693. LOCAL void lexInit (void)
  694.     {
  695.     retractChar = EMPTY;
  696.     }
  697. /*******************************************************************************
  698. *
  699. * lexScan - scan input for next lexeme
  700. *
  701. * RETURNS: next lexeme.
  702. */
  703. LOCAL int lexScan (void)
  704.     {
  705.     FAST int ch;
  706.     FAST int state;
  707.     int nChars;
  708.     int code;
  709.     BOOL scanContinue;
  710.     char string [MAX_SHELL_LINE + 1];
  711.     do
  712. {
  713. /* get first character; use any retracted character first */
  714. if (retractChar != EMPTY)
  715.     {
  716.     ch = retractChar;
  717.     retractChar = EMPTY;
  718.     }
  719. else
  720.     ch = *(nextChar++);
  721. /* consume characters until final state reached */
  722. state = 0;
  723. for (nChars = 0; nChars < MAX_SHELL_LINE; nChars++)
  724.     {
  725.     /* consume character and make state transition */
  726.     string [nChars] = ch;
  727.     state = lexStateTable [state * lexNclasses + lexClass [ch + 1]];
  728.     /* if final state reached, quit; otherwise get next character */
  729.     if (state < 0)
  730. {
  731. nChars++;
  732. break;
  733. }
  734.     ch = *(nextChar++);
  735.     }
  736. /* final state reached */
  737. state = -state;
  738. string [nChars] = EOS;
  739. lastChar = ch;
  740. code = lexActions (state, string, nChars, &scanContinue);
  741. }
  742.     while (scanContinue);
  743.     return (code);
  744.     }
  745. /*******************************************************************************
  746. *
  747. * lexRetract - retract last character consumed
  748. *
  749. * RETURNS: N/A
  750. */
  751. LOCAL void lexRetract (void)
  752.     {
  753.     retractChar = lastChar;
  754.     }