ANTLR грамматика для препроцессора C - PullRequest
0 голосов
/ 07 февраля 2012

Я загружаю грамматику препроцессора ac на веб-сайте antlr. Но в ней есть ошибка, и я понятия не имею, как ее исправить.

     macroExpansion  
: id=IDENTIFIER WS? LPAREN WS?   RPAREN -> ^(EXPAND $id)
| id=IDENTIFIER WS? LPAREN WS? macArgs  WS? RPAREN -> ^(EXPAND $id macArgs?)

rule macroExpansion пойдет не так для кода ниже:

      typedef VOID (WINAPI *PFIBER_START_ROUTINE)( LPVOID lpFiberParameter );

Поскольку токены, следующие за VOID, будут рассматриваться как аргументы, а на самом деле VOID - это просто макрос, а не функция marco.

Как я могу изменить грамматику? Надеюсь, кто-нибудь может мне помочь. Спасибо!

1 Ответ

0 голосов
/ 07 февраля 2012

Поскольку правило должно начинаться с IDENTIFIER, за которым следует LPAREN, я не вижу, чтобы оно когда-либо совпадало с вводом, например typedef VOID (, поскольку typedef не учитывается.

Только глядя на macroExpansion:

macroExpansion  
 : id=IDENTIFIER WS? LPAREN WS?   RPAREN -> ^(EXPAND $id)
 | id=IDENTIFIER WS? LPAREN WS? macArgs  WS? RPAREN -> ^(EXPAND $id macArgs?)
 ;                            //   ^                                   ^
                              //   |                                   |
                              //  not optional                        optional

Я бы немного скептически отнесся к остальной части грамматики: macArgs? сделан необязательным в правиле перезаписи, но это неверно: левая часть не является обязательной. Это можно переписать так:

macroExpansion  
 : id=IDENTIFIER WS? LPAREN WS? (macArgs WS?)? RPAREN -> ^(EXPAND $id macArgs?)
 ;

В этом случае macArgs? является правильным.

...