- Works with JavaCC 4.0
- Preprocessor directives are now simply SKIP'd, so no need to run C files through GCC first
- */
+31/8/10: Modified heavily by Christian Grothoff
+- No more tracking of type names (so we can run without preprocessing)
+- Support certain gcc-isms (unsigned long long, 33LL, etc.)
+- No support for certain older C constructs
+- Support for magic "GNUNET_PACKED" construct (extra "IDENTIFIER" in struct)
+*/
PARSER_BEGIN(CParser)
public static void main ( String args [ ] ) {
CParser parser ;
-
if(args.length == 0){
System.out.println("C Parser Version 0.1Alpha: Reading from standard input . . .");
parser = new CParser(System.in);
TOKEN : {
- <INTEGER_LITERAL: <DECIMAL_LITERAL> (["l","L"])? | <HEX_LITERAL> (["l","L"])? | <OCTAL_LITERAL> (["l","L"])?>
-| <#DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])*>
+ <INTEGER_LITERAL: <DECIMAL_LITERAL> (["l","L"])? (["l","L"])? | <HEX_LITERAL> (["l","L"])? (["l","L"])? | <OCTAL_LITERAL> (["l","L"])? (["l","L"])?>
+| <#DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* >
| <#HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+>
| <#OCTAL_LITERAL: "0" (["0"-"7"])*>
| <FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? (["f","F","d","D"])? | "." (["0"-"9"])+ (<EXPONENT>)? (["f","F","d","D"])? | (["0"-"9"])+ <EXPONENT> (["f","F","d","D"])? | (["0"-"9"])+ (<EXPONENT>)? ["f","F","d","D"]>
| <#EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+>
| <CHARACTER_LITERAL: "\'" (~["\'","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"])) "\'">
-| <STRING_LITERAL: "\"" ( ~["\"","\\","\n","\r"] | "\\" ( ["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"] | ( ["\n","\r"] | "\r\n")))* "\"">
+| <STRING_LITERAL: "\"" ( ~["\"","\\","\n","\r"] | "\\" ( ["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"] | ( ["\n","\r"] | "\r\n")))* "\"" ( ( ["\r","\n"," "] )* "\"" ( ~["\"","\\","\n","\r"] | "\\" ( ["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"] | ( ["\n","\r"] | "\r\n")))* "\"" )* >
}
TOKEN : {
void ExternalDeclaration() : {}
{
- ( LOOKAHEAD( FunctionDefinition() ) FunctionDefinition() | Declaration())
+ (StorageClassSpecifier())*
+ (
+ LOOKAHEAD (FunctionDeclaration()) FunctionDeclaration() |
+ LOOKAHEAD (StructOrUnionSpecifier()) StructOrUnionSpecifier() |
+ LOOKAHEAD (VariableDeclaration()) VariableDeclaration() |
+ LOOKAHEAD (TypeDeclaration()) TypeDeclaration ()
+ )
}
-void FunctionDefinition() : {}
+void FunctionDeclaration() : {}
{
- [LOOKAHEAD(DeclarationSpecifiers()) DeclarationSpecifiers()] Declarator() [ DeclarationList() ]
- CompoundStatement()
+ TypeSpecifier ()
+ <IDENTIFIER>
+ "(" [ ParameterList () ] ")"
+ ( ";" | CompoundStatement() )
}
-void Declaration() : {}
+void StorageClassSpecifier() : {}
{
- DeclarationSpecifiers() [ InitDeclaratorList() ] ";"
+ ( <STATIC> | <EXTERN> )
}
-void DeclarationList() : {}
+void TypeDeclaration() : {}
{
- ( LOOKAHEAD(Declaration()) Declaration() )+
+ <TYPEDEF>
+ ( LOOKAHEAD (DataType() ";") DataType () | FunctionType() ) ";"
}
-void DeclarationSpecifiers() : {}
+void DataType() : {}
{
- StorageClassSpecifier() [ LOOKAHEAD(DeclarationSpecifiers())
- DeclarationSpecifiers() ] |
- TypeSpecifier() [ LOOKAHEAD(DeclarationSpecifiers())
- DeclarationSpecifiers() ] |
- TypeQualifier() [ LOOKAHEAD(DeclarationSpecifiers())
- DeclarationSpecifiers() ]
+ StructOrUnionSpecifier () <IDENTIFIER>
}
-void StorageClassSpecifier() : {}
+void FunctionType() : {}
{
- ( <AUTO> | <REGISTER> | <STATIC> | <EXTERN> | <TYPEDEF>
- )
+ TypeSpecifier () "(" "*" <IDENTIFIER> ")" "(" [ ParameterList() ] ")"
}
-void TypeSpecifier() : {}
+void ParameterList() : {}
{
- ( <VOID> | <CHAR> | <SHORT> | <INT> | <LONG> | <FLOAT> | <DOUBLE> | <SIGNED> |
- <UNSIGNED> | StructOrUnionSpecifier() | EnumSpecifier() | TypedefName() )
+ ParameterDeclaration() ( LOOKAHEAD (2) "," ParameterDeclaration() )* [ "," "..." ]
}
-void TypeQualifier() : {}
+void ParameterDeclaration() : {}
{
- ( <CONST> | <VOLATILE> )
+ TypeSpecifier() <IDENTIFIER> [ Array () ]
}
-void StructOrUnionSpecifier() : {}
+void VariableDeclaration() : {}
{
- StructOrUnion() ( LOOKAHEAD(3) [ <IDENTIFIER> ] "{" StructDeclarationList() "}" | <IDENTIFIER> )
+ VariableClassSpecifier ()
+ TypeSpecifier ()
+ InitDeclaratorList() ";"
+}
+void LocalVariableDeclaration() : {}
+{
+ [ <STATIC> ] VariableDeclaration ()
}
-void StructOrUnion() : {}
+void VariableClassSpecifier() : {}
{
- ( <STRUCT> | <UNION> )
+ ( <AUTO> | <REGISTER> )*
}
-void StructDeclarationList() : {}
+void TypeSpecifier() : {}
{
- (StructDeclaration())+
+ [ <CONST> ]
+ ( <VOID>
+ | <CHAR>
+ | <SHORT> [ <INT> ]
+ | <INT>
+ | <LONG> [ <LONG> ]
+ | <FLOAT> | <DOUBLE>
+ | (<SIGNED> | <UNSIGNED>) [ <CHAR>
+ | <SHORT> [ <INT> ]
+ | <INT>
+ | <LONG> [ <LONG> ] ]
+ | StructOrUnionSpecifier()
+ | EnumSpecifier()
+ | <IDENTIFIER>
+ )
+ [ Pointer () ]
+ [ Array () ]
+}
+
+/* this is needed for 'va_arg' where a type is an argument
+ -- and we cannot disambiguate the use of 'FOO'
+ after a 'typedef int FOO' from the variable 'FOO';
+ hence this hack */
+void NoIdentifierTypeSpecifier() : {}
+{
+ [ <CONST> ]
+ ( <VOID>
+ | <CHAR>
+ | <SHORT> [ <INT> ]
+ | <INT>
+ | <LONG> [ <LONG> ]
+ | <FLOAT> | <DOUBLE>
+ | (<SIGNED> | <UNSIGNED>) [ <CHAR>
+ | <SHORT> [ <INT> ]
+ | <INT>
+ | <LONG> [ <LONG> ] ]
+ | StructOrUnionSpecifier()
+ | EnumSpecifier()
+ )
+ [ Pointer () ]
+ [ Array () ]
}
-void InitDeclaratorList() : {}
+void StructOrUnionSpecifier() : {}
{
- InitDeclarator() ("," InitDeclarator())*
+ LOOKAHEAD (3)
+ StructOrUnion() [ <IDENTIFIER> ] "{" StructDeclarationList() "}" |
+ StructOrUnion() <IDENTIFIER>
}
-void InitDeclarator() : {}
+void StructOrUnion() : {}
{
- Declarator() [ "=" Initializer() ]
+ ( <STRUCT> | <UNION> )
}
-void StructDeclaration() : {}
+void StructDeclarationList() : {}
{
- SpecifierQualifierList() StructDeclaratorList() ";"
+ (StructDeclaration())+
}
-void SpecifierQualifierList() : {}
+void InitDeclaratorList() : {}
{
- TypeSpecifier() [ LOOKAHEAD(SpecifierQualifierList())
- SpecifierQualifierList() ]|
- TypeQualifier() [ LOOKAHEAD(SpecifierQualifierList())
- SpecifierQualifierList() ]
+ InitDeclarator() ("," InitDeclarator())*
}
-void StructDeclaratorList() : {}
+void InitDeclarator() : {}
{
- StructDeclarator() ( "," StructDeclarator() )*
+ <IDENTIFIER> [ Array () ] [ "=" Initializer() ]
}
-void StructDeclarator() : {}
+void StructDeclaration() : {}
{
- ( LOOKAHEAD(3) Declarator() | [ Declarator() ] ":" ConstantExpression() )
+ TypeSpecifier() <IDENTIFIER> [ Array() | ":" ConstantExpression() ] [ <IDENTIFIER> ] ";"
}
void EnumSpecifier() : {}
<IDENTIFIER> [ "=" ConstantExpression() ]
}
-void Declarator() : {}
-{
- [ Pointer() ] DirectDeclarator()
-}
-
-void DirectDeclarator() : {}
-{
- ( <IDENTIFIER>
- | "(" Declarator() ")" )
-
- ( "[" [ ConstantExpression() ] "]" |
- LOOKAHEAD(3) "(" ParameterTypeList() ")" |
- "(" [ IdentifierList() ] ")" )*
-}
-
void Pointer() : {}
{
- "*" [ TypeQualifierList() ] [ Pointer() ]
-}
-
-void TypeQualifierList() : {}
-{
- (TypeQualifier())+
-}
-
-void ParameterTypeList() : {}
-{
- ParameterList() ["," "..." ]
-}
-
-void ParameterList() : {}
-{
- ParameterDeclaration() (LOOKAHEAD(2) "," ParameterDeclaration())*
-}
-
-void ParameterDeclaration() : {}
-{
- DeclarationSpecifiers() ( LOOKAHEAD(Declarator()) Declarator() | [ AbstractDeclarator() ] )
+ "*" [ <CONST> ] [ Pointer() ]
}
void IdentifierList() : {}
Initializer() (LOOKAHEAD(2) "," Initializer())*
}
-void TypeName() : {}
-{
- SpecifierQualifierList() [ AbstractDeclarator() ]
-
-}
-
-void AbstractDeclarator() : {}
-{
- ( LOOKAHEAD(3) Pointer() |
- [Pointer()] DirectAbstractDeclarator() )
-}
-
-void DirectAbstractDeclarator() : {}
-{
- ( LOOKAHEAD(2) "(" AbstractDeclarator() ")" |
- "[" [ConstantExpression()] "]" |
- "(" [ParameterTypeList()] ")" )
-
- ( "[" [ ConstantExpression() ] "]" | "(" [ ParameterTypeList() ] ")" )*
-}
-void TypedefName() : {}
+void Array() : {}
{
- <IDENTIFIER>
+ "[" [ConstantExpression()] "]"
}
void Statement() : {}
void CompoundStatement() : {}
{
- "{" [ LOOKAHEAD(DeclarationList()) DeclarationList() ]
- [ StatementList() ]
+ "{" ( LOOKAHEAD (LocalVariableDeclaration()) LocalVariableDeclaration () |
+ Statement() )*
"}"
}
-void StatementList() : {}
-{
- (Statement())+
-}
-
void SelectionStatement() : {}
{
( <IF> "(" Expression() ")" Statement() [ LOOKAHEAD(2) <ELSE> Statement() ] |
void Expression() : {}
{
- AssignmentExpression() ( "," AssignmentExpression() )*
+ AssignmentExpression() ( "," AssignmentExpression() )*
}
void AssignmentExpression() : {}
void CastExpression() : {}
{
- ( LOOKAHEAD("(" TypeName() ")" CastExpression() ) "(" TypeName() ")" CastExpression() |
+ ( LOOKAHEAD("(" TypeSpecifier() ")" CastExpression() ) "(" TypeSpecifier() ")" CastExpression() |
UnaryExpression() )
}
"++" UnaryExpression() |
"--" UnaryExpression() |
UnaryOperator() CastExpression() |
- <SIZEOF> ( LOOKAHEAD(UnaryExpression() ) UnaryExpression() | "(" TypeName() ")" ) )
+ <SIZEOF> ( LOOKAHEAD(UnaryExpression() ) UnaryExpression() | "(" TypeSpecifier() ")" ) )
}
void UnaryOperator() : {}
void PrimaryExpression() : {}
{
- ( <IDENTIFIER> |
+ <IDENTIFIER> |
Constant() |
- "(" Expression() ")" )
+ "(" Expression() ")"
}
void ArgumentExpressionList() : {}
{
- AssignmentExpression() ( "," AssignmentExpression() )*
+ AssignmentOrTypeExpression() ( "," AssignmentOrTypeExpression() )*
+}
+
+
+void AssignmentOrTypeExpression() : {}
+{
+ NoIdentifierTypeSpecifier() |
+ AssignmentExpression()
}
void Constant() : {}