SEARCHKW.C
上传用户:hlzzc88
上传日期:2007-01-06
资源大小:220k
文件大小:4k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1997, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and either the original sources or derived sources 
  11.  * are distributed along with any executables derived from the originals.
  12.  *
  13.  * The author is not responsible for any damages that may arise from use
  14.  * of this software, either idirect or consequential.
  15.  *
  16.  * v1.35 March 1997
  17.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  18.  *
  19.  * Credits to Mathew Brandt for original K&R C compiler
  20.  *
  21.  */
  22. /*
  23.  * keyword module
  24.  */
  25. #include        <stdio.h>
  26. #include <malloc.h>
  27. #include        "expr.h"
  28. #include        "c.h"
  29. #define KWHASHSIZE 253
  30. extern int asmline;
  31. extern ASMNAME oplst[];
  32. extern ASMREG reglst[];
  33. extern char lastid[];
  34. extern enum e_sym lastst;
  35. extern int prm_cplusplus,prm_cmangle;
  36. extern KEYWORDS prockeywords[];
  37. extern ASMNAME *keyimage;
  38. static HASHREC **hashtable=0;
  39. KEYWORDS keywords[] = {
  40.  
  41.         {0,"int", kw_int}, {0,"char", kw_char}, {0,"long", kw_long},
  42.         {0,"float", kw_float}, {0,"double", kw_double}, {0,"return", kw_return},
  43.         {0,"struct", kw_struct}, {0,"union", kw_union}, {0,"typedef", kw_typedef},
  44.         {0,"enum", kw_enum}, {0,"static", kw_static}, {0,"auto", kw_auto},
  45.         {0,"sizeof", kw_sizeof}, {0,"do", kw_do}, {0,"if", kw_if},
  46.         {0,"else", kw_else}, {0,"for", kw_for},{0,"switch", kw_switch},
  47.         {0,"while", kw_while},{0,"short", kw_short}, {0,"extern", kw_extern},
  48.         {0,"case", kw_case}, {0,"goto", kw_goto}, {0,"default", kw_default},
  49.         {0,"register", kw_register}, {0,"unsigned", kw_unsigned},
  50. {0,"signed", kw_signed },
  51.         {0,"break", kw_break}, {0,"continue", kw_continue}, {0,"void", kw_void},
  52. {0,"volatile", kw_volatile}, {0,"const", kw_const},
  53. #ifdef CPLUSPLUS
  54. {0,"public",kw_public,1}, {0,"private",kw_private,1},
  55. {0,"protected",kw_protected,1}, { 0, "class", kw_class,1 },
  56. {0,"friend",kw_friend,1}, {0,"this",kw_this,1}, {0,"operator",kw_operator,1},
  57. {0,"new",kw_new,1}, {0,"delete",kw_delete,1},{0,"inline",kw_inline,1},
  58. {0,"try",kw_try,1}, {0,"catch",kw_catch,1}, {0,"template",kw_template,1},
  59. {0,"throw",kw_throw,1},
  60. #endif
  61. #ifdef INLINEASM
  62. {0,"asm",kw_asm,0},
  63. #endif
  64.         {0, 0, 0} };
  65. void kwini(void) 
  66. /*
  67.  * create a keyword hash table
  68.  */
  69. {
  70. struct kwblk *q = keywords;
  71. ASMNAME *r;
  72. ASMREG *s;
  73. if (!hashtable) {
  74.    hashtable = (HASHREC *)malloc(KWHASHSIZE * sizeof(HASHREC *));
  75.    memset(hashtable,0,KWHASHSIZE * sizeof(HASHREC *));
  76. while (q->word) {
  77. if (prm_cplusplus || !q->flags)
  78. AddHash(q,hashtable,KWHASHSIZE);
  79. q++;
  80. }
  81. q = prockeywords;
  82. while (q->word) {
  83. if (prm_cplusplus || !q->flags)
  84. AddHash(q,hashtable,KWHASHSIZE);
  85. q++;
  86. }
  87. #ifdef INLINEASM
  88. r = oplst;
  89. while (r->word) {
  90. if (r->atype) {
  91. q = malloc(sizeof(struct kwblk));
  92. q->next=0;
  93. q->word=r->word;
  94. q->stype = kw_asminst;
  95. q->flags=KW_INLINEASM;
  96. q->data = r;
  97. AddHash(q,hashtable,KWHASHSIZE);
  98. }
  99. r++;
  100. }
  101. s = reglst;
  102. while (s->word) {
  103. if (s->regtype ) {
  104. q = malloc(sizeof(struct kwblk));
  105. q->next=0;
  106. q->word=s->word;
  107. q->stype = kw_asmreg;
  108. q->flags=KW_INLINEASM;
  109. q->data = s;
  110. AddHash(q,hashtable,KWHASHSIZE);
  111. }
  112. s++;
  113. }
  114. #endif
  115. }
  116. }
  117. int searchkw(void)
  118. /*
  119.  * see if the current symbol is a keyword
  120.  */
  121. {
  122. char *ident = lastid;
  123. struct kwblk    **kwbp;
  124. if (lastst != id)
  125. return 0;
  126. if (prm_cmangle)
  127. ident++;
  128. kwbp = LookupHash(ident,hashtable,KWHASHSIZE);
  129. if (kwbp) {
  130. #ifdef INLINEASM
  131. if (((*kwbp)->flags==KW_INLINEASM) && !asmline)
  132. return 0;
  133. keyimage = (*kwbp)->data;
  134. #endif 
  135. return lastst = (*kwbp)->stype;
  136. }
  137.   return(0);
  138. }