2012-02-07 2 views
0

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

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

правило macroExpansion ошибется для кода ниже:

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

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

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

ответ

0

Поскольку правило должно начинаться с 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?является правильно.

Смежные вопросы