[cfe-commits] r38803 - in /cfe/cfe/trunk: Parse/Parser.cpp include/clang/Parse/Parser.h

sabre at cs.uiuc.edu sabre at cs.uiuc.edu
Wed Jul 11 09:24:46 PDT 2007


Author: sabre
Date: Wed Jul 11 11:24:46 2007
New Revision: 38803

URL: http://llvm.org/viewvc/llvm-project?rev=38803&view=rev
Log:
Add initial very-incomplete support for parsing declarations.  We just manage
to be able to parse "int x;" now.

Modified:
    cfe/cfe/trunk/Parse/Parser.cpp
    cfe/cfe/trunk/include/clang/Parse/Parser.h

Modified: cfe/cfe/trunk/Parse/Parser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Parse/Parser.cpp?rev=38803&r1=38802&r2=38803&view=diff

==============================================================================
--- cfe/cfe/trunk/Parse/Parser.cpp (original)
+++ cfe/cfe/trunk/Parse/Parser.cpp Wed Jul 11 11:24:46 2007
@@ -24,10 +24,12 @@
   Diags.Report(Tok.getLocation(), DiagID, Msg);
 }
 
-
+//===----------------------------------------------------------------------===//
+// C99 6.9: External Definitions.
+//===----------------------------------------------------------------------===//
 
 /// ParseTranslationUnit:
-///       translation-unit: [C99 6.9p1]
+///       translation-unit: [C99 6.9]
 ///         external-declaration 
 ///         translation-unit external-declaration 
 void Parser::ParseTranslationUnit() {
@@ -40,7 +42,7 @@
 }
 
 /// ParseExternalDeclaration:
-///       external-declaration: [C99 6.9p1]
+///       external-declaration: [C99 6.9]
 ///         function-definition        [TODO]
 ///         declaration                [TODO]
 /// [EXT]   ';'
@@ -67,15 +69,174 @@
 }
 
 /// ParseDeclarationOrFunctionDefinition - Parse either a function-definition or
-/// a declaration.  We can't tell which we have until we read the common
-/// declaration-specifiers portion.
+/// a declaration.  We can't tell which we have until we read up to the
+/// compound-statement in function-definition.
 ///
-///       function-definition: [C99 6.9.1p1]
-///         declaration-specifiers declarator declaration-list[opt] 
-///                 compound-statement [TODO]
-///       declaration: [C99 6.7p1]
+///       function-definition: [C99 6.9.1]
+///         declaration-specifiers[opt] declarator declaration-list[opt] 
+///                 compound-statement                           [TODO]
+///       declaration: [C99 6.7]
 ///         declaration-specifiers init-declarator-list[opt] ';' [TODO]
-/// [OMP]   threadprivate-directive [TODO]
+/// [!C99]  init-declarator-list ';' [TODO]
+/// [OMP]   threadprivate-directive                              [TODO]
+///
+///       init-declarator-list: [C99 6.7]
+///         init-declarator
+///         init-declarator-list ',' init-declarator
+///       init-declarator: [C99 6.7]
+///         declarator
+///         declarator '=' initializer
+///
 void Parser::ParseDeclarationOrFunctionDefinition() {
-  ConsumeToken();
+  // Parse the common declaration-specifiers piece.
+  // NOTE: this can not be missing for C99 declaration's.
+  ParseDeclarationSpecifiers();
+  
+  // Parse the common declarator piece.
+  ParseDeclarator();
+
+  // If the declarator was a function type...
+  
+  switch (Tok.getKind()) {
+  case tok::equal:   // must be: decl-spec[opt] declarator init-declarator-list
+  case tok::comma:   // must be: decl-spec[opt] declarator init-declarator-list
+  default:
+    assert(0 && "unimp!");
+  case tok::semi:
+    ConsumeToken();
+    break;
+  }
+}
+
+//===----------------------------------------------------------------------===//
+// C99 6.7: Declarations.
+//===----------------------------------------------------------------------===//
+
+/// ParseDeclarationSpecifiers
+///       declaration-specifiers: [C99 6.7]
+///         storage-class-specifier declaration-specifiers [opt] [TODO]
+///         type-specifier declaration-specifiers [opt]
+///         type-qualifier declaration-specifiers [opt]          [TODO]
+/// [C99]   function-specifier declaration-specifiers [opt]      [TODO]
+///
+///       type-specifier: [C99 6.7.2]
+///         'void'
+///         'char'
+///         'short'
+///         'int'
+///         'long'
+///         'float'
+///         'double'
+///         'signed'
+///         'unsigned'
+/// [C99]   '_Bool'
+/// [C99]   '_Complex'
+/// [C99]   '_Imaginary'
+///         struct-or-union-specifier [TODO]
+///         enum-specifier [TODO]
+///         typedef-name [TODO]
+
+void Parser::ParseDeclarationSpecifiers() {
+  while (1) {
+    switch (Tok.getKind()) {
+    default: return;  // Not a declaration specifier token.
+    // type-specifiers
+    case tok::kw_void:       //  SetTypeSpecifier(); break;
+    case tok::kw_char:
+    case tok::kw_short:     // Width
+    case tok::kw_int:
+    case tok::kw_long:      // Width
+    case tok::kw_float:     // Type specifier
+    case tok::kw_double:
+    case tok::kw_signed:    // Signedness
+    case tok::kw_unsigned:  // Signedness
+    case tok::kw__Bool:
+    case tok::kw__Complex:   // Complexity
+    case tok::kw__Imaginary: // Complexity
+      // FIXME: Read these, handle them!
+      ConsumeToken();
+      break;
+      
+    //case tok::kw_struct:
+    //case tok::kw_union:
+    //case tok::kw_enum:
+    }
+  }
+}
+
+/// ParseDeclarator
+///       declarator: [C99 6.7.5]
+///         pointer[opt] direct-declarator
+///
+///       pointer: [C99 6.7.5]
+///         '*' type-qualifier-list[opt]
+///         '*' type-qualifier-list[opt] pointer
+///
+void Parser::ParseDeclarator() {
+  while (Tok.getKind() == tok::star) {  // '*' -> pointer.
+    ConsumeToken();  // Eat the *.
+    ParseTypeQualifierListOpt();
+  }
+  
+  ParseDirectDeclarator();
+}
+
+/// ParseTypeQualifierListOpt
+///       type-qualifier-list: [C99 6.7.5]
+///         type-qualifier
+/// [GNU]   attributes                         [TODO]
+///         type-qualifier-list type-qualifier
+/// [GNU]   type-qualifier-list attributes     [TODO]
+///
+void Parser::ParseTypeQualifierListOpt() {
+  while (1) {
+    switch (Tok.getKind()) {
+    default: break;
+    // TODO: attributes.
+    case tok::kw_const:
+    case tok::kw_volatile:
+    case tok::kw_restrict:
+      ConsumeToken();
+      break;
+    }
+  }
+}
+
+
+/// ParseDirectDeclarator
+///       direct-declarator: [C99 6.7.5]
+///         identifier
+///         '(' declarator ')'
+/// [GNU]   '(' attributes declarator ')'
+///         direct-declarator array-declarator
+///         direct-declarator '(' parameter-type-list ')'
+///         direct-declarator '(' identifier-list[opt] ')'
+/// [GNU]   direct-declarator '(' parameter-forward-declarations
+///                    parameter-type-list[opt] ')'
+///
+///       parameter-type-list: [C99 6.7.5]
+///         parameter-list
+///         parameter-list ',' '...'
+///
+///       parameter-list: [C99 6.7.5]
+///         parameter-declaration
+///         parameter-list ',' parameter-declaration
+///
+///       parameter-declaration: [C99 6.7.5]
+///         declaration-specifiers declarator
+/// [GNU]   declaration-specifiers declarator attributes
+///         declaration-specifiers abstract-declarator[opt] 
+/// [GNU]   declaration-specifiers abstract-declarator[opt] attributes
+///
+///       identifier-list: [C99 6.7.5]
+///         identifier
+///         identifier-list ',' identifier
+///
+void Parser::ParseDirectDeclarator() {
+  if (Tok.getKind() == tok::identifier) {
+    ConsumeToken();
+    return;
+  }
+  // FIXME: missing most stuff.
+  assert(0 && "Unknown token!");
 }

Modified: cfe/cfe/trunk/include/clang/Parse/Parser.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/include/clang/Parse/Parser.h?rev=38803&r1=38802&r2=38803&view=diff

==============================================================================
--- cfe/cfe/trunk/include/clang/Parse/Parser.h (original)
+++ cfe/cfe/trunk/include/clang/Parse/Parser.h Wed Jul 11 11:24:46 2007
@@ -60,14 +60,21 @@
     return Tok.getKind();
   }
   
-  
 private:
   //===--------------------------------------------------------------------===//
-
-  // Top level forms.
+  // C99 6.9: External Definitions.
   void ParseExternalDeclaration();
   void ParseDeclarationOrFunctionDefinition();
-    
+
+  
+  //===--------------------------------------------------------------------===//
+  // C99 6.7: Declarations.
+  void ParseDeclarationSpecifiers();
+  
+  void ParseDeclarator();
+  void ParseTypeQualifierListOpt();
+  void ParseDirectDeclarator();
+  
 };
 
 }  // end namespace clang





More information about the cfe-commits mailing list