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

Rewrote symbol handling.

File:
1 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);
Note: See TracChangeset for help on using the changeset viewer.