2012-02-07 57 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?正确的。