Changeset 269 for trunk/idl-compiler


Ignore:
Timestamp:
Mar 25, 2007, 2:35:35 PM (18 years ago)
Author:
cinc
Message:

IDL file parsing more or less working.

Location:
trunk/idl-compiler
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/idl-compiler/Makefile

    r266 r269  
    3434                        $(OBJDIR)/hash_parser.o \
    3535                        $(OBJDIR)/lineinfo_parser.o \
     36                        $(OBJDIR)/metaclass_parser.o \
    3637                        $(OBJDIR)/printdata.o
    3738
  • trunk/idl-compiler/c/nom-idl-compiler.c

    r267 r269  
    8383  {"NOMOVERRIDE", IDL_SYMBOL_OVERRIDE, KIND_UNKNOWN},
    8484  {"NOMREGISTEREDIFACE", IDL_SYMBOL_REGINTERFACE, KIND_TYPESPEC},
     85  {"NOMCLASSNAME", IDL_SYMBOL_CLSNAME, KIND_UNKNOWN},
     86  {"NOMMETACLASS", IDL_SYMBOL_OLDMETACLASS, KIND_UNKNOWN},
     87  {"MetaClass", IDL_SYMBOL_METACLASS, KIND_UNKNOWN},
    8588  {"native", IDL_SYMBOL_NATIVE, KIND_UNKNOWN},
    8689  {"gulong", IDL_SYMBOL_GULONG, KIND_TYPESPEC},
     
    9295
    9396  {"boolean", IDL_SYMBOL_BOOLEAN, KIND_TYPESPEC},
    94   {"String", IDL_SYMBOL_STRING, KIND_TYPESPEC},
     97  {"string", IDL_SYMBOL_STRING, KIND_TYPESPEC},
     98  {"long", IDL_SYMBOL_LONG, KIND_TYPESPEC},
     99  {"unsigned", IDL_SYMBOL_LONG, KIND_TYPESPEC},
    95100
    96101  {"in", IDL_SYMBOL_IN, KIND_DIRECTION},
     
    172177    }
    173178  return "unknown";
     179}
     180
     181/**
     182   This function is only for removing the NOMCLASSNAME() definition from
     183   the input stream. When everything is moved to the new IDL compiler
     184   those statements will be removed and this parsing function eventually
     185   removed.
     186
     187   The current token is the NOMCLASSNAME keyword.
     188
     189   CN:= G_TOKEN_SYMBOL '(' INDENT ')' ';'
     190 */
     191static void parseClassName(void)
     192{
     193
     194  if(!matchNext('('))
     195    {
     196      getNextToken(); /* Make sure error references the correct token */
     197      g_scanner_unexp_token(gScanner,
     198                            '(',
     199                            NULL,
     200                            NULL,
     201                            NULL,
     202                            "Error in NOMCLASSNAME()",
     203                            TRUE); /* is_error */
     204      exit(1);
     205    }
     206
     207  /* Identifier. We discard it. */
     208  if(!matchNext(G_TOKEN_IDENTIFIER))
     209    {
     210      g_scanner_unexp_token(gScanner,
     211                            G_TOKEN_IDENTIFIER,
     212                            NULL,
     213                            NULL,
     214                            NULL,
     215                            "Class name is not a valid identifier.",
     216                            TRUE); /* is_error */
     217      exit(1);
     218    }
     219
     220  if(!matchNext(')'))
     221    {
     222      getNextToken(); /* Make sure error references the correct token */
     223      g_scanner_unexp_token(gScanner,
     224                            ')',
     225                            NULL,
     226                            NULL,
     227                            NULL,
     228                            "Error in NOMCLASSNAME().",
     229                            TRUE); /* is_error */
     230      exit(1);
     231    }
     232
     233    if(!matchNext(';'))
     234      {
     235        getNextToken(); /* Make sure error references the correct token */
     236        g_scanner_unexp_token(gScanner,
     237                              ';',
     238                              NULL,
     239                              NULL,
     240                              NULL,
     241                              "Error in NOMCLASSNAME() definition, Missing semicolon at the end.",
     242                              TRUE); /* is_error */
     243        exit(1);
     244      }
     245}
     246
     247/**
     248   This function is only for removing the NOMMETACLASS() definition from
     249   the input stream. When everything is moved to the new IDL compiler
     250   those statements will be removed and this parsing function eventually
     251   removed.
     252
     253   The current token is the NOMMETACLASS keyword.
     254
     255   CN:= G_TOKEN_SYMBOL '(' INDENT ')' ';'
     256 */
     257static void parseOldMetaClass(void)
     258{
     259
     260  if(!matchNext('('))
     261    {
     262      getNextToken(); /* Make sure error references the correct token */
     263      g_scanner_unexp_token(gScanner,
     264                            '(',
     265                            NULL,
     266                            NULL,
     267                            NULL,
     268                            "Error in NOMMETACLASS()",
     269                            TRUE); /* is_error */
     270      exit(1);
     271    }
     272
     273  /* Identifier. We discard it. */
     274  if(!matchNext(G_TOKEN_IDENTIFIER))
     275    {
     276      g_scanner_unexp_token(gScanner,
     277                            G_TOKEN_IDENTIFIER,
     278                            NULL,
     279                            NULL,
     280                            NULL,
     281                            "Class name is not a valid identifier.",
     282                            TRUE); /* is_error */
     283      exit(1);
     284    }
     285
     286  if(!matchNext(')'))
     287    {
     288      getNextToken(); /* Make sure error references the correct token */
     289      g_scanner_unexp_token(gScanner,
     290                            ')',
     291                            NULL,
     292                            NULL,
     293                            NULL,
     294                            "Error in NOMMETACLASS().",
     295                            TRUE); /* is_error */
     296      exit(1);
     297    }
     298
     299    if(!matchNext(';'))
     300      {
     301        getNextToken(); /* Make sure error references the correct token */
     302        g_scanner_unexp_token(gScanner,
     303                              ';',
     304                              NULL,
     305                              NULL,
     306                              NULL,
     307                              "Error in NOMMETACLASS() definition, Missing semicolon at the end.",
     308                              TRUE); /* is_error */
     309        exit(1);
     310      }
    174311}
    175312
     
    278415              parseNative();
    279416              break;
     417            case IDL_SYMBOL_CLSNAME:
     418              parseClassName();
     419              break;
     420            case IDL_SYMBOL_OLDMETACLASS:
     421              parseOldMetaClass();
     422              break;
    280423            default:
    281424              break;
     
    378521void funcMsgHandler(GScanner *gScanner, gchar *message, gboolean error)
    379522{
    380   g_printf("In file %s, line %d:\n\t%s\n", parseInfo.chrCurrentSourceFile,
    381            g_scanner_cur_line(gScanner)-parseInfo.uiLineCorrection, message);
     523  g_printf("%s:%d: error: %s (%d %d)\n", parseInfo.chrCurrentSourceFile,
     524           g_scanner_cur_line(gScanner)-parseInfo.uiLineCorrection, message,
     525           g_scanner_cur_line(gScanner), parseInfo.uiLineCorrection);
    382526}
    383527
     
    485629
    486630  g_scanner_input_file(gScanner, fd);
     631  gScanner->config->case_sensitive=TRUE;
    487632  /* No single line comments */
    488633  gScanner->config->skip_comment_single=FALSE;
  • trunk/idl-compiler/include/parser.h

    r267 r269  
    8080{
    8181  gchar* chrName;    /* Name of this interface   */
    82   gchar *chrParent;  /* Name of parent interface */
     82  gchar* chrParent;  /* Name of parent interface */
    8383  gulong ulMajor;    /* Class version            */
    8484  gulong ulMinor;    /* Class version            */
    8585  gboolean fIsForwardDeclaration;
     86  gchar* chrMetaClass; /* Pointer to metaclass name or NULL*/
    8687  GPtrArray *pMethodArray;
    8788  GPtrArray *pOverrideArray;
     
    129130  IDL_SYMBOL_OVERRIDE,
    130131  IDL_SYMBOL_REGINTERFACE,  /* Used for registered interfaces */
     132  IDL_SYMBOL_CLSNAME,
     133  IDL_SYMBOL_OLDMETACLASS,
     134  IDL_SYMBOL_METACLASS,
    131135  IDL_SYMBOL_NATIVE,
    132136  /* Some GLib types */
     
    140144  IDL_SYMBOL_BOOLEAN,
    141145  IDL_SYMBOL_STRING,
     146  IDL_SYMBOL_LONG,
     147  IDL_SYMBOL_UNSIGNED,
    142148  /* Direction of method parameters */
    143149  IDL_SYMBOL_IN,
     
    172178void parseHash(void);
    173179void parsePreprocLineInfo(void);
    174 
     180void parseMetaClass(void);
  • trunk/idl-compiler/parser_c/interface_parser.c

    r266 r269  
    6363  g_scanner_scope_add_symbol(gScanner, ID_SCOPE, pNewSymbol->chrSymbolName,
    6464                             pNewSymbol);
     65  /* For legacy support and convenience we automatically register a pointer type
     66     to the interface. */
     67  pNewSymbol=g_malloc0(sizeof(SYMBOL));
     68  pNewSymbol->uiKind=KIND_TYPESPEC;
     69  pNewSymbol->uiSymbolToken=IDL_SYMBOL_REGINTERFACE;
     70  pNewSymbol->chrSymbolName=g_strconcat("P", pCurInterface->chrName, NULL);
     71  g_message("%s: %s", __FUNCTION__, pNewSymbol->chrSymbolName);
     72  g_tree_insert(parseInfo.pSymbolTree, pNewSymbol, pNewSymbol->chrSymbolName);
     73  g_scanner_scope_add_symbol(gScanner, ID_SCOPE, pNewSymbol->chrSymbolName,
     74                             pNewSymbol);
    6575}
    6676
     
    98108        parseMethod();
    99109      }
     110    else if(matchNext('#'))
     111      parseHash();
    100112    else if(matchNext(G_TOKEN_SYMBOL))
    101113      {
  • trunk/idl-compiler/parser_c/method_parser.c

    r265 r269  
    119119
    120120    //pParam->chrType=getTypeSpecStringFromCurToken();
     121    //g_printf("%s %d", __FUNCTION__, __LINE__);
     122    //printToken(curToken);
    121123
    122124    if(!matchNext(G_TOKEN_IDENTIFIER))
    123125      {
    124126        getNextToken(); /* Make sure error references the correct token */
     127        //g_printf("%s %d", __FUNCTION__, __LINE__);
     128        //printToken(curToken);
    125129        g_scanner_unexp_token(gScanner,
    126130                              G_TOKEN_IDENTIFIER,
  • trunk/idl-compiler/parser_c/typespec_parser.c

    r267 r269  
    4747
    4848  TS:= TYPE_SPEC
     49    |  TYPE_SPEC TYPE_SPEC      // This is for something like 'unsigned long'
    4950    |  TYPE_SPEC '*'
     51    |  TYPE_SPEC TYPE_SPEC '*'  // This is for something like 'unsigned long*'
    5052*/
    5153void parseTypeSpec(PMETHODPARAM pMethodParam)
    5254{
    53   /* Return type  */
    54   pMethodParam->chrType=getTypeSpecStringFromCurToken();
     55  char *chrTemp;
     56
     57  /* Return type part 1 */
     58  chrTemp=getTypeSpecStringFromCurToken();
     59
     60  /* A second typespec part (e.g. 'unsigned long')? */
     61  if(matchNextKind(KIND_TYPESPEC))
     62    {
     63      char *chrTemp2=getTypeSpecStringFromCurToken();
     64      pMethodParam->chrType=g_strconcat(chrTemp, " ", chrTemp2 ,NULL);
     65      g_free(chrTemp2);
     66      g_free(chrTemp);
     67    }
     68  else{
     69    /* Return type  */
     70    pMethodParam->chrType=chrTemp;
     71  }
    5572
    5673  /* Do we return a pointer (check for '*') */
     
    6178
    6279
     80
     81
Note: See TracChangeset for help on using the changeset viewer.