Question

I'm trying to use this javacc grammar https://java.net/downloads/javacc/contrib/grammars/C.jj to parse a C code containing bit fields

struct T{
    int w:2;
    };
struct T a;

The generated parser cannot parse this code:

$ javacc -DEBUG_PARSER=true C.jj && javac CParser.java && gcc -E input.c | java CParser 
Java Compiler Compiler Version 5.0 (Parser Generator)
(type "javacc" with no arguments for help)
Reading from file C.jj . . .
File "TokenMgrError.java" is being rebuilt.
File "ParseException.java" is being rebuilt.
File "Token.java" is being rebuilt.
File "SimpleCharStream.java" is being rebuilt.
Parser generated successfully.
Note: CParser.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
C Parser Version 0.1Alpha:  Reading from standard input . . .
Call:   TranslationUnit
  Call:   ExternalDeclaration
    Call:   Declaration
      Call:   DeclarationSpecifiers
        Call:   TypeSpecifier
          Call:   StructOrUnionSpecifier
            Call:   StructOrUnion
              Consumed token: <"struct" at line 5 column 1>
            Return: StructOrUnion
            Consumed token: <<IDENTIFIER>: "T" at line 5 column 8>
            Consumed token: <"{" at line 5 column 9>
            Call:   StructDeclarationList
              Call:   StructDeclaration
                Call:   SpecifierQualifierList
                  Call:   TypeSpecifier
                    Consumed token: <"int" at line 6 column 2>
                  Return: TypeSpecifier
                Return: SpecifierQualifierList
                Call:   StructDeclaratorList
                  Call:   StructDeclarator
                    Call:   Declarator
                      Call:   DirectDeclarator
                        Consumed token: <<IDENTIFIER>: "w" at line 6 column 6>
                      Return: DirectDeclarator
                    Return: Declarator
                  Return: StructDeclarator
                Return: StructDeclaratorList
              Return: StructDeclaration
            Return: StructDeclarationList
          Return: StructOrUnionSpecifier
        Return: TypeSpecifier
      Return: DeclarationSpecifiers
    Return: Declaration
  Return: ExternalDeclaration
Return: TranslationUnit
C Parser Version 0.1Alpha:  Encountered errors during parse.
ParseException: Encountered " ":" ": "" at line 6, column 7.
Was expecting one of:
    ";" ...
    "," ...
    "(" ...
    "[" ...
    "[" ...
    "(" ...
    "(" ...
    "," ...
    ";" ...
    ";" ...
    ";" ...
    "[" ...
    "(" ...
    "(" ...

    at CParser.generateParseException(CParser.java:4279)
    at CParser.jj_consume_token(CParser.java:4154)
    at CParser.StructDeclaration(CParser.java:433)
    at CParser.StructDeclarationList(CParser.java:372)
    at CParser.StructOrUnionSpecifier(CParser.java:328)
    at CParser.TypeSpecifier(CParser.java:274)
    at CParser.DeclarationSpecifiers(CParser.java:182)
    at CParser.Declaration(CParser.java:129)
    at CParser.ExternalDeclaration(CParser.java:96)
    at CParser.TranslationUnit(CParser.java:77)
    at CParser.main(CParser.java:63)

I tried to change (line 245)

(...) LOOKAHEAD( { isType(getToken(1).image) } )TypedefName() )

to

 LOOKAHEAD( { isType(getToken(1).image) } ) TypedefName2()

(...)

void TypedefName2() : {}
 {
    TypedefName()   (LOOKAHEAD(2) ":" <INTEGER_LITERAL> )?
  }

but it doesn't work (same error) .

Is there a simple way to fix the javaCC grammar to handle Bit Fields ?

Was it helpful?

Solution

Try fixing this by modifying the StructDeclarator() rule on lines 310..313 as follows:

void StructDeclarator() : {}
{
    ( Declarator() [ ":" ConstantExpression() ] | ":" ConstantExpression() )
}

The idea is to remove the need of lookahead by letting the parser make a decision by checking if the struct declarator starts with a colon ":".

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top