[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