我运行ANTLR 4.2并使用规范的C语法:
https://github.com/antlr/grammars-v4/tree/master/c
我正在执行以下步骤:(使用ANTLR4书籍中的批处理文件)
安特尔C.g4
javac*.java语言
grun C compileationunit-tokens test.C
其中test.c具有以下代码:
经过:

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

弱点:
错误是:行3:9在输入“typedefvoid(\uu 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 ')'
    ;

……但这不管用。关于如何解决这个问题有什么想法吗?因为我所做的并不关心调用约定,所以创建这个lexer规则可以解决问题:
Cdecl
    :   '__cdecl'
        -> skip
    ;

我还是希望我有一个真正的解决办法。

最佳答案

C++中使用__cdecl来声明接口,如使用链接的C调用约定(显式地使用未修饰的名称等)。__cdecl是C++(我相信它上面的某些编译器是特定的),而不是C,所以C语法没有指定它。
我不知道你提议的解决方案为什么不起作用,tho。

关于c - ANTLR4 C语法不支持__cdecl吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23069062/

10-10 16:52