我正在运行ANTLR 4.2,并使用来自以下位置的规范C语法:
https://github.com/antlr/grammars-v4/tree/master/c
我正在做以下步骤:(使用ANTLR4书中的批处理文件)
- antlr C.g4
- javac C*.java
- grun C compilationUnit-令牌测试.C
其中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 ')'
;
但这不起作用。关于如何解决这个问题有什么想法吗?由于我所做的并不关心调用约定,因此创建这个lexer规则可以消除问题:
Cdecl
: '__cdecl'
-> skip
;
我仍然希望我有一个真正的解决方案。
__cdecl
在C++中用于将接口声明为使用C调用约定进行链接(显式地使用未修饰的名称等)。__cdecl
是C++(我相信这是特定于某些编译器的),而不是C,所以C语法没有指定它
我不知道为什么你提出的解决方案不起作用,tho。