Changeset 265 for trunk/idl-compiler/c


Ignore:
Timestamp:
Mar 24, 2007, 9:08:34 PM (18 years ago)
Author:
cinc
Message:

Rewrote symbol handling.

Location:
trunk/idl-compiler/c
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/idl-compiler/c/nom-idl-compiler.c

    r264 r265  
    7878/* Symbols defined for our IDL language.
    7979   Keep this in synch with the defined enums! */
    80 const SYMBOL idlSymbols[]={
     80SYMBOL idlSymbols[]={
    8181  {"interface", IDL_SYMBOL_INTERFACE, KIND_UNKNOWN}, /* 71 */
    8282  {"NOMCLASSVERSION", IDL_SYMBOL_CLSVERSION, KIND_UNKNOWN},
     
    103103SYMBOLINFO curSymbol;
    104104
     105/* Holding the current state of parsing and pointers to necessary lists. */
     106PARSEINFO parseInfo={0};
    105107
    106108PINTERFACE findInterfaceFromName(gchar* chrName)
     
    123125  GTokenValue value;
    124126
    125   if(G_TOKEN_IDENTIFIER==curToken)
    126     return g_strdup(value.v_identifier);
    127   else
    128     {
    129       /* It's one of our symbols. */
    130       PSYMBOLINFO psi;
    131 
    132       if(curToken<=G_TOKEN_LAST)
    133         g_scanner_unexp_token(gScanner,
    134                               G_TOKEN_SYMBOL,
    135                               NULL,
    136                               NULL,
    137                               NULL,
    138                               "Error in NOMINSTANCEVAR()",
    139                               TRUE); /* is_error */
    140 
    141       psi=(PSYMBOLINFO)gScanner->user_data;
    142       return psi->pSymbols[curToken-G_TOKEN_LAST-1].chrSymbolName;
    143     }
     127  value=gScanner->value;
     128
     129  switch(curToken)
     130    {
     131    case G_TOKEN_IDENTIFIER:
     132      return g_strdup(value.v_identifier);
     133      break;
     134    case G_TOKEN_SYMBOL:
     135      {
     136        /* It's one of our symbols. */
     137        PSYMBOL pCurSymbol;
     138
     139        pCurSymbol=value.v_symbol;
     140        return g_strdup(pCurSymbol->chrSymbolName);
     141        break;
     142      }
     143    default:
     144      g_scanner_unexp_token(gScanner,
     145                            G_TOKEN_SYMBOL,
     146                            NULL,
     147                            NULL,
     148                            NULL,
     149                            "",
     150                            TRUE); /* is_error */
     151
     152      break;
     153    }
     154  return "unknown";
    144155}
    145156
     
    159170    switch(curToken)
    160171      {
    161       case IDL_SYMBOL_INTERFACE:
    162         parseInterface(token);
    163         break;
    164172      case '#':
    165173        parseHash();
    166174        break;
    167 
     175      case G_TOKEN_SYMBOL:
     176        {
     177          PSYMBOL pCurSymbol=value.v_symbol;
     178          switch(pCurSymbol->uiSymbolToken)
     179            {
     180            case IDL_SYMBOL_INTERFACE:
     181              parseInterface(token);
     182              break;
     183            default:
     184              break;
     185            }
     186          break;
     187        }
    168188#if 0
    169189      case G_TOKEN_IDENTIFIER:
     
    226246}
    227247
     248static gint funcSymbolCompare(gconstpointer a, gconstpointer b)
     249{
     250  if(a==b)
     251    return 0;
     252
     253  if(a<b)
     254    return -1;
     255
     256  return 1;
     257};
    228258/*
    229259
     
    291321  g_printf("\n");
    292322
     323
     324
    293325  gScanner=g_scanner_new(NULL);
    294326  gScanner->user_data=(gpointer)&curSymbol;
     
    306338  g_scanner_set_scope(gScanner, idScope);
    307339  /* Load our own symbols into the scanner. We use the default scope for now. */
     340  parseInfo.pSymbolTree=g_tree_new((GCompareFunc) funcSymbolCompare);
    308341  while(pSymbols->chrSymbolName)
    309342    {
    310       g_scanner_scope_add_symbol(gScanner, idScope, pSymbols->chrSymbolName, GINT_TO_POINTER(pSymbols->uiSymbolToken));
     343      g_scanner_scope_add_symbol(gScanner, idScope, pSymbols->chrSymbolName,
     344                                 pSymbols);
     345      g_tree_insert(parseInfo.pSymbolTree, pSymbols, pSymbols->chrSymbolName);
    311346      pSymbols++;
    312347    }
    313   gScanner->config->symbol_2_token=TRUE;
     348  //  gScanner->config->symbol_2_token=TRUE;
    314349
    315350  parseIt();
    316351
    317   //if(pInterfaceArray->len)
    318   //  printInterface();
     352  if(pInterfaceArray->len)
     353    printInterface();
    319354
    320355  g_scanner_destroy(gScanner);
  • trunk/idl-compiler/c/token.c

    r264 r265  
    4646  is e.g. a typespec or just a var name.
    4747 */
    48 void setSymbolInfo(GTokenType token)
     48void setCurSymbolInfo(void)
    4949{
    5050  PSYMBOLINFO psi;
     
    5252  psi=(PSYMBOLINFO)gScanner->user_data;
    5353
    54   switch(token)
     54  switch(curToken)
    5555    {
    5656    case G_TOKEN_IDENTIFIER:
     
    6161      break;
    6262    }
    63   if(token>G_TOKEN_LAST)
    64     {
    65       psi->uiCurSymbolKind=psi->pSymbols[token-G_TOKEN_LAST-1].uiKind;
     63  if(curToken==G_TOKEN_SYMBOL)
     64    {
     65      GTokenValue value;
     66      PSYMBOL pCurSymbol;
     67     
     68      value=gScanner->value;
     69      pCurSymbol=value.v_symbol;
     70
     71      psi->uiCurSymbolKind=pCurSymbol->uiKind;
    6672    }
    6773}
     
    7581}
    7682
    77 static guint getKindFromTokenType(GTokenType token)
    78 {
    79   if(token>G_TOKEN_LAST)
    80     {
    81       PSYMBOLINFO psi;
     83/* This token is not necessarily the current token! */
     84static guint getKindOfNextToken()
     85{
     86  /* Load info into gScanner */
     87  g_scanner_peek_next_token(gScanner);
     88
     89  if(gScanner->next_token==G_TOKEN_SYMBOL)
     90    {
     91      GTokenValue value;
     92      PSYMBOL pCurSymbol;
     93
     94      value=gScanner->next_value;
     95      pCurSymbol=value.v_symbol;
    8296     
    83       psi=(PSYMBOLINFO)gScanner->user_data;
    84       return psi->pSymbols[token-G_TOKEN_LAST-1].uiKind;
    85     }
    86   switch(token)
     97      return pCurSymbol->uiKind;
     98    }
     99  switch(gScanner->next_token)
    87100    {
    88101    case G_TOKEN_IDENTIFIER:
     
    98111}
    99112
     113#if 0
    100114guint queryNextTokensKind(void)
    101115{
    102116  return getKindFromTokenType(gScanner->next_token);
    103117}
    104 
     118#endif
    105119
    106120/* Well, the name says all... */
     
    108122{
    109123  curToken = g_scanner_get_next_token(gScanner);
    110   setSymbolInfo(curToken);
     124  setCurSymbolInfo();
    111125}
    112126
    113127gboolean matchNextKind(guint uiKind)
    114128{
    115   GTokenType token;
    116 
    117   token=g_scanner_peek_next_token(gScanner);
    118   if(uiKind==getKindFromTokenType(token))
     129  if(uiKind==getKindOfNextToken())
    119130    {
    120131      getNextToken();
     
    158169  switch(token)
    159170    {
    160     case IDL_SYMBOL_INTERFACE:
    161       g_message("Token: %d (IDL_SYMBOL_INTERFACE)\t\t\t (LINE %d)", token, g_scanner_cur_line(gScanner));
    162       break;
     171    case G_TOKEN_SYMBOL:
     172      {
     173        PSYMBOL pCurSymbol=value.v_symbol;
     174
     175        switch(pCurSymbol->uiSymbolToken)
     176          {
     177          case IDL_SYMBOL_INTERFACE:
     178            g_message("Token: %d (IDL_SYMBOL_INTERFACE)\t\t\t (LINE %d)",
     179                      pCurSymbol->uiSymbolToken, g_scanner_cur_line(gScanner));
     180            break;
     181          case IDL_SYMBOL_DEFINE:
     182            g_message("Token: %d (IDL_SYMBOL_DEFINE)\t\t\t", pCurSymbol->uiSymbolToken);
     183            break;
     184          case IDL_SYMBOL_IFDEF:
     185            g_message("Token: %d (IDL_SYMBOL_IFDEF)\t\t\t", pCurSymbol->uiSymbolToken);
     186            break;
     187          case IDL_SYMBOL_ENDIF:
     188            g_message("Token: %d (IDL_SYMBOL_ENDIF)\t\t\t", pCurSymbol->uiSymbolToken);
     189            break;
     190          default:
     191            {
     192              PSYMBOLINFO psi;
     193              psi=(PSYMBOLINFO)gScanner->user_data;         
     194           
     195              g_message("Token: %d (%s)\t\t\t (LINE %d)", pCurSymbol->uiSymbolToken,
     196                        pCurSymbol->chrSymbolName, g_scanner_cur_line(gScanner));
     197
     198            break;
     199            }
     200          }/* switch */
     201        break;
     202      }
    163203    case G_TOKEN_IDENTIFIER:
    164204      g_message("Token: %d (G_TOKEN_IDENTIFIER)\t\t%s (LINE %d)",
     
    198238      g_message("Token: %d (G_TOKEN_INT)\t\t\t%ld", token, value.v_int);
    199239      break;
    200     case IDL_SYMBOL_DEFINE:
    201       g_message("Token: %d (IDL_SYMBOL_DEFINE)\t\t\t", token);
    202       break;
    203     case IDL_SYMBOL_IFDEF:
    204       g_message("Token: %d (IDL_SYMBOL_IFDEF)\t\t\t", token);
    205       break;
    206     case IDL_SYMBOL_ENDIF:
    207       g_message("Token: %d (IDL_SYMBOL_ENDIF)\t\t\t", token);
    208       break;
    209240    default:
    210       {
    211         PSYMBOLINFO psi;
    212         psi=(PSYMBOLINFO)gScanner->user_data;
    213 
    214         if(token>G_TOKEN_LAST)
    215           g_message("Token: %d (%s)\t\t\t (LINE %d)", token,
    216                     psi->pSymbols[token-G_TOKEN_LAST-1].chrSymbolName, g_scanner_cur_line(gScanner));
    217         else
    218           g_message("Token: %d (---)\t\t\t (LINE %d)", token, g_scanner_cur_line(gScanner));
     241      {       
     242        g_message("Token: %d (---)\t\t\t (LINE %d)", token, g_scanner_cur_line(gScanner));
    219243        break;
    220244      } /* default */
Note: See TracChangeset for help on using the changeset viewer.