Рассматривали ли вы разработку / внесение поддержки 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)), казалось, сбивает с толку лязг-format
Только с этим изменением (и вызывая его во время Lexing) я смог заставить clang-format думать, что ключевое слово «поведение» было ключевым словом «класс», а не просто возвращаемым типом (который являетсяя думаю, что так оно и есть)
Это означает, что когда он видит поведение, он применяет любое из правил форматирования, которое ищет класс, и этоимеет тенденцию делать больше правильных вещей.
Вам понадобится немного больше сантехники, чтобы учесть некоторые специфические правила 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» и добавить его.
Просто мысль