2012-02-07 83 views
0

我在antlr網站上下載了一個c預處理器語法。但它有一個錯誤,我不知道如何糾正它。C預處理器的ANTLR語法

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

規則宏擴展就會出問題了下面的代碼:

 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?正確的。