当前位置: 首页 > 知识库问答 >
问题:

ANTLR4 C语法不支持__CDECL?

牧甫
2023-03-14

我正在运行ANTLR4.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

其中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
    ;

我还是希望我有一个真正的解决方案。

共有1个答案

南宫正阳
2023-03-14

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

我不知道为什么你提出的解决办法不起作用。

 类似资料:
  • render函数在setup语法糖情况下不调用

  • 本文向大家介绍ANTLR语言支持,包括了ANTLR语言支持的使用技巧和注意事项,需要的朋友参考一下 示例 ANTLR能够为多种编程语言生成解析器: C#目标 Python目标 JavaScript目标 Java目标 默认情况下,ANTLR将使用Java编程语言从命令行生成解析器: 要更改目标语言,可以从OS终端/命令行运行以下命令: 不必每次都在命令行/终端上使用“ -Dlanguage”参数来为

  • 为您的 Flarum 添加新的界面语言很简单。按照下面的说明,下载并安装语言包即可。 在您安装并启用一个语言包后,您可以将其 设置为您论坛的默认语言。当您可以 随时禁用 用不到的语言。如果您有使用任何第三方扩展,请务必在开始前 阅读社区扩展说明。 欲开始,请访问 Flarum 社区上的 Extensions > Languages 标签,并找到您想要安装的语言包。 语言包的安装方式与 扩展 相同。

  • 我们在第十章介绍过国际化和本地化,开发了一个go-i18n库,这小节我们将把该库集成到beego框架里面来,使得我们的框架支持国际化和本地化。 i18n集成 beego中设置全局变量如下: Translation i18n.IL Lang string //设置语言包,zh、en LangPath string //设置语言包所在位置 初始化多语言函数: fu

  • 语言支持 JavaScript 语言特性 Creator 3D 支持的 JavaScript 语言规范为 ES6。 此外,以下几项更新于 ES6 规范的语言特性或提案仍旧在支持之列: 类字段 Promise 对象 可选链操作符 空值合并操作符 全局对象 globalThis 以下语言特性同样支持,但需要开启相关的编译选项: 异步函数 特别地,Creator 3D 目前支持 “Legacy” 装饰器

  • antl4是否支持允许用户指定新规则的自适应语法,例如强制函数声明中指定的参数数量? 示例:基本语言包括以下标记定义: 令牌#1定义为[a-z][0-9]* 大写为函数名保留,小写为传递给函数的变量保留。 用户可以“声明”Fxy,下面的每个F实例都必须有两个变量。我希望解析器执行“新规则”。 也许这是编译器中的标准公平,我知道我在C、python等中使用的编译器。当我没有为我在别处声明的函数传递正