我在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。
我怎样才能改变语法?希望有人能帮助我。谢谢!
答案 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?
是正确的。