c++ 如何在clang格式中添加一个自定义关键字作为“class”处理?

lqfhib0f  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(120)

我想使用clang-format规格代码<file>.sc
Specc有一些预定义的关键字,它们的格式与class在C++中的格式相同:

  • behavior
  • interface

我可以在.clang-format文件中实现这一点吗?
带有behavior关键字的输入文件:

#include <stdio.h>

behavior Main(void)
{
    int main(void)
    {
        printf("Hello World!\n");
        return(0);
    }
};

clang-format -style=Mozilla hello.sc的输出

#include <stdio.h>

behavior Main(void) 
{
    int main(void) 
    {
        printf("Hello World!\n");
        return (0);
    }
}
;

如果我使用关键字class而不是behavior,则会得到以下输出,这也是我想要的:

#include <stdio.h>

class Main(void) 
{
    int main(void) 
    {
      printf("Hello World!\n");
      return (0);
    }
};

TLDR:我希望clang-format处理来自specc的关键字behavior,就像它处理关键字class一样。
注意,我只想格式化这个文件,我不打算用C/C++编译器编译它。

nxowjjhe

nxowjjhe1#

您是否考虑过将SpecC支持开发/贡献为clang格式,作为一种一流的语言?
由于它主要是一种C风格的语言,我不认为它很难添加。
我最近开始努力添加C#支持(我猜这可能更糟),并且在格式化方面遇到了类似的问题,我希望关键字在C#和C++中的行为有所不同(public就是其中之一)
例如,一种机制是将关键字转换为其他关键字类型(或Token类型),然后可以使用这些关键字类型为不同的语言设置不同的代码格式。
在本例中,我将“行为”标记转换为“类”标记

bool FormatTokenLexer::tryMergeSpeccCBehavior() {
  if (Tokens.size() < 1)
    return false;
  auto &Identifier = *(Tokens.end() - 1);
  if (!Identifier->is(tok::identifier))
    return false;

  if ((Identifier->TokenText == "behavior"))
    Identifier->Tok.setKind(tok::kw_class);
  return true;
}

虽然我不能让你的确切例子工作的(主要(空))似乎是混乱的clang格式
通过这个改变(并在Lexing期间调用它),我能够使clang-format认为“behavior”关键字是“class”关键字,而不仅仅是一个返回类型(我认为它认为它是这样的)
这意味着当它看到行为时,它将应用任何正在寻找类的格式规则,这将倾向于做更多正确的事情。
您可能需要更多的管道来允许一些SpecC特定的规则,但这不会超出可能性的范围。

$ clang-format -style=Mozilla hello.sc
#include <stdio.h>

behavior Main
{
  int main(void)
  {
    printf("Hello World!\n");
    return (0);
  }
};

behavior B(in int p1, out int p2)
{

  int a, b;

  int f(int x) { return (x * x); }

  void main(void)
  {
    a = p1;
    b = f(a);
    p2 = b;
  }
};

LLVM对于他们允许的内容有一个相当高的标准,但是我想如果这是一个标准语言,并且有很大的兴趣,并且有人愿意支持它,你至少可以要求他们考虑它(特别是如果有人提供补丁),或者你总是可以“简单地派生LLVM”并添加它。
只是一个想法

9gm1akwq

9gm1akwq2#

正如@Jason在对我的问题的评论中所建议的那样,我可以使用sed来替换关键字,因此我最终所做的就是将以下命令 Package 在shell脚本中:

sed "s/behavior/class/g" <file>.sc | clang-format -style=Mozilla | sed "s/class/behavior/g" > <file>.sc

相关问题