ANTLR4 C语法不支持__cdecl?

时间:2014-04-14 19:52:41

标签: c antlr antlr4

我正在运行ANTLR 4.2并使用规范C语法:
https://github.com/antlr/grammars-v4/tree/master/c

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

  1. antlr C.g4
  2. javac C * .java
  3. grun C compilationUnit -tokens test.c
  4. 其中test.c具有以下代码:

    传:

    typedef
    void
    (*EFI_SET_MEM) (
       void     *Buffer,
       UINTN    Size,
       UINT8    Value
      );
    

    失败: 错误是:第3:9行输入' typedefvoid没有可行的选择(__ cdecl *'

    typedef
    void
    (__cdecl *EFI_SET_MEM) (
       void     *Buffer,
       UINTN    Size,
       UINT8    Value
      );
    

    唯一的区别是__cdecl。我尝试了几个修改来解决这个问题,例如:

    functionSpecifier
        :   ('inline'
        |   '_Noreturn'
        |   '__inline__' // GCC extension
        |   '__cdecl'
        |   '__stdcall')
        |   gccAttributeSpecifier
        |   '__declspec' '(' Identifier ')'
        ;
    

    ......但这不起作用。关于如何解决这个问题的任何想法?由于我所做的事情并不关心调用约定,因此创建此词法分析器规则会使问题消失:

    Cdecl
        :   '__cdecl'
            -> skip
        ;
    

    我仍然希望我有一个真正的解决方案。

1 个答案:

答案 0 :(得分:1)

__cdecl在C ++中用于将接口声明为使用C调用约定进行链接(显式地使用未修饰的名称等)。 __cdecl是C ++(我认为特定于某些编译器),而不是C,所以C语法没有指定它。

我不确定你提出的解决方案为什么不起作用,等等。

相关问题