我想使用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 ++编译器进行编译。
如@Jason在对我的问题的评论中所建议,我可以使用sed
替换关键字。因此,我最终要做的是将以下命令包装在shell脚本中:
sed "s/behavior/class/g" <file>.sc | clang-format -style=Mozilla | sed "s/class/behavior/g" > <file>.sc
您是否考虑过将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”并添加它。
只是一个想法