我正在运行ANTLR 4.2并使用规范C语法:
https://github.com/antlr/grammars-v4/tree/master/c
我正在执行以下步骤:(使用ANTLR4书中的批处理文件)
其中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
;
我仍然希望我有一个真正的解决方案。
答案 0 :(得分:1)
__cdecl
在C ++中用于将接口声明为使用C调用约定进行链接(显式地使用未修饰的名称等)。 __cdecl
是C ++(我认为特定于某些编译器),而不是C,所以C语法没有指定它。
我不确定你提出的解决方案为什么不起作用,等等。