C预处理器的ANTLR语法

时间:2012-02-07 12:16:00

标签: antlr c-preprocessor

我在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只是一个宏而不是函数marco。

我怎样才能改变语法?希望有人能帮助我。谢谢!

1 个答案:

答案 0 :(得分: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? 是正确的。