javacc C语法和C“比特字段”; ParseException的

时间:2014-02-07 15:23:16

标签: c parsing bit-fields javacc

我正在尝试使用此javacc语法https://java.net/downloads/javacc/contrib/grammars/C.jj来解析包含bit fields的C代码

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

生成的解析器无法解析此代码:

$ 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)

我试图改变(第245行)

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

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

(...)

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

但它不起作用(同样的错误)。

有没有一种简单的方法来修复javaCC语法来处理位字段?

1 个答案:

答案 0 :(得分:1)

尝试通过修改第310..313行的StructDeclarator()规则来解决此问题,如下所示:

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

我们的想法是通过检查结构声明符是否以冒号":"开头来让解析器做出决定来消除前瞻性的需要。