C grammar
authorChristian Grothoff <christian@grothoff.org>
Tue, 31 Aug 2010 23:26:41 +0000 (23:26 +0000)
committerChristian Grothoff <christian@grothoff.org>
Tue, 31 Aug 2010 23:26:41 +0000 (23:26 +0000)
src/monkey/C.jj
src/monkey/gnunet-monkey.c

index 34e2c4f86e61fa5c674df26cf49271abc650ef7a..ba10f4261fce956890fc7b8b69dc4b22032efbcd 100644 (file)
 - 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 : {
- <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 : {
@@ -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 () 
+        <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() : {}
@@ -281,44 +332,9 @@ void Enumerator() : {}
        <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() : {}
@@ -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() : {}
 {
-       <IDENTIFIER>
+   "[" [ConstantExpression()] "]" 
 }
 
 void Statement() : {}
@@ -387,16 +383,11 @@ void ExpressionStatement() : {}
 
 void CompoundStatement() : {}
 {
-       "{" [ LOOKAHEAD(DeclarationList()) DeclarationList() ]
-           [ StatementList() ]
+       "{"   ( LOOKAHEAD (LocalVariableDeclaration()) LocalVariableDeclaration () |
+               Statement() )*
        "}"
 }
 
-void StatementList() : {}
-{
-       (Statement())+
-}
-
 void SelectionStatement() : {}
 {
        ( <IF> "(" Expression() ")" Statement() [ LOOKAHEAD(2) <ELSE> 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() |
-         <SIZEOF> ( LOOKAHEAD(UnaryExpression() ) UnaryExpression() | "(" TypeName() ")" ) )
+         <SIZEOF> ( LOOKAHEAD(UnaryExpression() ) UnaryExpression() | "(" TypeSpecifier() ")" ) )
 }
 
 void UnaryOperator() : {}
@@ -526,14 +517,21 @@ void PostfixExpression() : {}
 
 void PrimaryExpression() : {}
 {
-       ( <IDENTIFIER> |
+        <IDENTIFIER> |
          Constant() |
-         "(" Expression() ")" )
+         "(" Expression() ")" 
 }
 
 void ArgumentExpressionList() : {}
 {
-       AssignmentExpression() ( "," AssignmentExpression() )*
+       AssignmentOrTypeExpression() ( "," AssignmentOrTypeExpression() )*
+}
+
+
+void AssignmentOrTypeExpression() : {}
+{
+       NoIdentifierTypeSpecifier() |
+       AssignmentExpression() 
 }
 
 void Constant() : {}
index b03f1497e33cbd632df1a4c96327f9dd27a3d008..fe2b914156acfd7e1d5e83a7f5f2eaed52adb01f 100644 (file)
@@ -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)
 {