如何添加自定义关键字以clang格式视为“类”?

问题描述 投票:2回答:2

我想使用clang-format格式化特定代码<file>.sc

[Specc具有一些预定义的关键字,可以用用C ++格式化class的方式来格式化:

  • 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 ++编译器进行编译。

c++ c clang-format
2个回答
0
投票

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

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

0
投票

您是否考虑过将SpecC支持开发/贡献为clang格式,作为一流的语言?

因为它主要是C风格的语言,所以我认为添加它不会那么困难。

[我最近开始增加C#支持(我想可能会更糟),并且在格式化方面遇到了类似的问题,我希望关键字在C#和C ++中表现不同(公开是其中之一)

作为示例,一种机制是将关键字转换为其他关键字类型(或令牌类型),然后可在以后将其用于对不同语言的代码进行不同格式设置。

在此示例中,我将“行为”令牌转换为认为它们是“类”

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;
}

虽然我无法获得您的确切示例来工作,但(Main(void))似乎使clang格式令人困惑

[仅进行此更改(并在Lexing期间调用它),我就能使clang格式认为“ 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”并添加它。

只是一个想法

© www.soinside.com 2019 - 2024. All rights reserved.