ANTLR4 C语法不支持_cdecl?

ANTLR4 C语法不支持_cdecl?,c,antlr,antlr4,C,Antlr,Antlr4,我正在运行ANTLR 4.2,并使用以下标准C语法: 我正在执行以下步骤:(使用ANTLR4手册中的批处理文件) antlr C.g4 javac*.java grun C CompliationUnit-令牌测试.C 其中,test.c具有以下代码: 传球: typedef void (*EFI_SET_MEM) ( void *Buffer, UINTN Size, UINT8 Value ); 失败: 错误是:第3:9行输入“typedefvo

我正在运行ANTLR 4.2,并使用以下标准C语法:

我正在执行以下步骤:(使用ANTLR4手册中的批处理文件)

  • antlr C.g4
  • javac*.java
  • grun C CompliationUnit-令牌测试.C
  • 其中,test.c具有以下代码:

    传球:

    typedef
    void
    (*EFI_SET_MEM) (
       void     *Buffer,
       UINTN    Size,
       UINT8    Value
      );
    
    失败: 错误是:第3:9行输入“typedefvoid(uu cdecl*”处没有可行的替代方案”

    唯一的区别是。我尝试了几个更改来修复此问题,例如:

    functionSpecifier
        :   ('inline'
        |   '_Noreturn'
        |   '__inline__' // GCC extension
        |   '__cdecl'
        |   '__stdcall')
        |   gccAttributeSpecifier
        |   '__declspec' '(' Identifier ')'
        ;
    
    …但这不起作用。有没有关于如何解决此问题的想法?因为我所做的不关心调用约定,创建此lexer规则可以解决此问题:

    Cdecl
        :   '__cdecl'
            -> skip
        ;
    

    <>我希望我有一个真正的解决方案。

    < p> <代码> cDECL>代码>,用C++来声明接口,使用链接的C++调用约定(明确地用未修饰的名称等)。<代码>
    我不确定您提出的修复方案为什么不起作用,tho。

    谢谢JohnH。我同意它是特定于供应商的,我看到Microsoft和IBM都在使用它。我使用的是Microsoft编译器,它用在C(不是C++)代码中。
    Cdecl
        :   '__cdecl'
            -> skip
        ;