From 8d7803fd5301ec405c20b6555812f2119ace71cd Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 31 Aug 2010 23:26:41 +0000 Subject: [PATCH] C grammar --- src/monkey/C.jj | 238 ++++++++++++++++++------------------- src/monkey/gnunet-monkey.c | 3 +- 2 files changed, 120 insertions(+), 121 deletions(-) diff --git a/src/monkey/C.jj b/src/monkey/C.jj index 34e2c4f86..ba10f4261 100644 --- a/src/monkey/C.jj +++ b/src/monkey/C.jj @@ -40,7 +40,12 @@ - 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) @@ -52,7 +57,6 @@ import java.util.*; 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); @@ -113,14 +117,14 @@ SKIP : { TOKEN : { - (["l","L"])? | (["l","L"])? | (["l","L"])?> -| <#DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])*> + (["l","L"])? (["l","L"])? | (["l","L"])? (["l","L"])? | (["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"])*> | )? (["f","F","d","D"])? | "." (["0"-"9"])+ ()? (["f","F","d","D"])? | (["0"-"9"])+ (["f","F","d","D"])? | (["0"-"9"])+ ()? ["f","F","d","D"]> | <#EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+> | -| +| } TOKEN : { @@ -171,99 +175,146 @@ void TranslationUnit() : {} 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 () + + "(" [ ParameterList () ] ")" + ( ";" | CompoundStatement() ) } -void Declaration() : {} +void StorageClassSpecifier() : {} { - DeclarationSpecifiers() [ InitDeclaratorList() ] ";" + ( | ) } -void DeclarationList() : {} +void TypeDeclaration() : {} { - ( LOOKAHEAD(Declaration()) Declaration() )+ + + ( LOOKAHEAD (DataType() ";") DataType () | FunctionType() ) ";" } -void DeclarationSpecifiers() : {} +void DataType() : {} { - StorageClassSpecifier() [ LOOKAHEAD(DeclarationSpecifiers()) - DeclarationSpecifiers() ] | - TypeSpecifier() [ LOOKAHEAD(DeclarationSpecifiers()) - DeclarationSpecifiers() ] | - TypeQualifier() [ LOOKAHEAD(DeclarationSpecifiers()) - DeclarationSpecifiers() ] + StructOrUnionSpecifier () } -void StorageClassSpecifier() : {} +void FunctionType() : {} { - ( | | | | - ) + TypeSpecifier () "(" "*" ")" "(" [ ParameterList() ] ")" } -void TypeSpecifier() : {} +void ParameterList() : {} { - ( | | | | | | | | - | StructOrUnionSpecifier() | EnumSpecifier() | TypedefName() ) + ParameterDeclaration() ( LOOKAHEAD (2) "," ParameterDeclaration() )* [ "," "..." ] } -void TypeQualifier() : {} +void ParameterDeclaration() : {} { - ( | ) + TypeSpecifier() [ Array () ] } -void StructOrUnionSpecifier() : {} +void VariableDeclaration() : {} { - StructOrUnion() ( LOOKAHEAD(3) [ ] "{" StructDeclarationList() "}" | ) + VariableClassSpecifier () + TypeSpecifier () + InitDeclaratorList() ";" +} +void LocalVariableDeclaration() : {} +{ + [ ] VariableDeclaration () } -void StructOrUnion() : {} +void VariableClassSpecifier() : {} { - ( | ) + ( | )* } -void StructDeclarationList() : {} +void TypeSpecifier() : {} { - (StructDeclaration())+ + [ ] + ( + | + | [ ] + | + | [ ] + | | + | ( | ) [ + | [ ] + | + | [ ] ] + | StructOrUnionSpecifier() + | EnumSpecifier() + | + ) + [ 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() : {} +{ + [ ] + ( + | + | [ ] + | + | [ ] + | | + | ( | ) [ + | [ ] + | + | [ ] ] + | StructOrUnionSpecifier() + | EnumSpecifier() + ) + [ Pointer () ] + [ Array () ] } -void InitDeclaratorList() : {} +void StructOrUnionSpecifier() : {} { - InitDeclarator() ("," InitDeclarator())* + LOOKAHEAD (3) + StructOrUnion() [ ] "{" StructDeclarationList() "}" | + StructOrUnion() } -void InitDeclarator() : {} +void StructOrUnion() : {} { - Declarator() [ "=" Initializer() ] + ( | ) } -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() )* + [ Array () ] [ "=" Initializer() ] } -void StructDeclarator() : {} +void StructDeclaration() : {} { - ( LOOKAHEAD(3) Declarator() | [ Declarator() ] ":" ConstantExpression() ) + TypeSpecifier() [ Array() | ":" ConstantExpression() ] [ ] ";" } void EnumSpecifier() : {} @@ -281,44 +332,9 @@ void Enumerator() : {} [ "=" ConstantExpression() ] } -void Declarator() : {} -{ - [ Pointer() ] DirectDeclarator() -} - -void DirectDeclarator() : {} -{ - ( - | "(" 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() ] ) + "*" [ ] [ Pointer() ] } void IdentifierList() : {} @@ -337,30 +353,10 @@ void InitializerList() : {} 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() : {} { - + "[" [ConstantExpression()] "]" } void Statement() : {} @@ -387,16 +383,11 @@ void ExpressionStatement() : {} void CompoundStatement() : {} { - "{" [ LOOKAHEAD(DeclarationList()) DeclarationList() ] - [ StatementList() ] + "{" ( LOOKAHEAD (LocalVariableDeclaration()) LocalVariableDeclaration () | + Statement() )* "}" } -void StatementList() : {} -{ - (Statement())+ -} - void SelectionStatement() : {} { ( "(" Expression() ")" Statement() [ LOOKAHEAD(2) Statement() ] | @@ -420,7 +411,7 @@ void JumpStatement() : {} void Expression() : {} { - AssignmentExpression() ( "," AssignmentExpression() )* + AssignmentExpression() ( "," AssignmentExpression() )* } void AssignmentExpression() : {} @@ -496,7 +487,7 @@ void MultiplicativeExpression() : {} void CastExpression() : {} { - ( LOOKAHEAD("(" TypeName() ")" CastExpression() ) "(" TypeName() ")" CastExpression() | + ( LOOKAHEAD("(" TypeSpecifier() ")" CastExpression() ) "(" TypeSpecifier() ")" CastExpression() | UnaryExpression() ) } @@ -506,7 +497,7 @@ void UnaryExpression() : {} "++" UnaryExpression() | "--" UnaryExpression() | UnaryOperator() CastExpression() | - ( LOOKAHEAD(UnaryExpression() ) UnaryExpression() | "(" TypeName() ")" ) ) + ( LOOKAHEAD(UnaryExpression() ) UnaryExpression() | "(" TypeSpecifier() ")" ) ) } void UnaryOperator() : {} @@ -526,14 +517,21 @@ void PostfixExpression() : {} void PrimaryExpression() : {} { - ( | + | Constant() | - "(" Expression() ")" ) + "(" Expression() ")" } void ArgumentExpressionList() : {} { - AssignmentExpression() ( "," AssignmentExpression() )* + AssignmentOrTypeExpression() ( "," AssignmentOrTypeExpression() )* +} + + +void AssignmentOrTypeExpression() : {} +{ + NoIdentifierTypeSpecifier() | + AssignmentExpression() } void Constant() : {} diff --git a/src/monkey/gnunet-monkey.c b/src/monkey/gnunet-monkey.c index b03f1497e..fe2b91415 100644 --- a/src/monkey/gnunet-monkey.c +++ b/src/monkey/gnunet-monkey.c @@ -16,7 +16,8 @@ #include "platform.h" #include "gnunet_common.h" -extern void sendMail(const char *messageContents); + +extern void sendMail (const char *messageContents); void cb_console(const char *str, void *data) { -- 2.25.1