2014-02-07 1 views
1

Я пытаюсь использовать эту JavaCC грамматику https://java.net/downloads/javacc/contrib/grammars/C.jj разобрать код C, содержащий bit fieldsjavacc C грамматика и C «Поля бит»; ParseException

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 для обработки бит полей?

+0

Можете ли вы попытаться разобрать эту недопустимую структуру? 'struct T {int w;: 2};' – dasblinkenlight

+0

получил: 'ParseException: Encountered" "2" "в строке 6, колонка 8. Ожидал один из: "} "... "} "... ' – Pierre

+0

Как насчет 'struct T {: 2};', это порождает и ошибку? Я смотрю на строку 312, я думаю, что это неправильно. – dasblinkenlight

ответ

1

Попробуйте исправить эту проблему путем изменения StructDeclarator() правил на линии 310..313 следующими образом:

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

Идея заключается в том, чтобы устранить необходимость в опережающем просмотре, позволяя анализатор принимать решение, проверяя, если структуру описатель начинается с двоеточия ":".