我运行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/