LINUX.ORG.RU

Формат, описывающий coding style

 , , , ,


0

1

Если кто-нибудь занимался разработкой IDE, подскажите, есть ли какие-то форматы, описывающие coding style?
Вот пример K&R:

int main(int argc, char *argv[]) {
	int c;
	c = getchar();
	while (c != EOF) {
		putchar(c);
		c = getchar();
	}
}
По этому коду можно многое сказать о стиле кода. Можно представить приведённый код в xml-подобном виде и написать CSS, описывающий, как нужно его отображать.
<i class="type">int</i><i class="funcname">main</i>
<ul class="args">
  <li><i class="type">int</i><i class="varname">argc</i></li>
  <li><i class="type">char</i><i class="varname">*argv[]</i></li>
</ul>
<div class="funcbody">
  <i class="type">int</i><i class="varname">c</i><i class="s"></i>
  <i class="varname">c</i><i class="op">=</i><i class="funcname">getchar</i>
  <ul class="args"></ul>
  <i class="s"></i>
  <i class="st">while</i>
  <ul class="args">
    <li><i class="varname">c</i><i class="op">!=</i><i class="varname">EOF</i></li>
  </ul>
  <div class="stbody">
    <i class="funcname">putchar</i>
    <ul class="args">
      <li><i class="varname">c</i></li>
    </ul>
    <i class="s"></i>
    <i class="varname">c</i><i class="op">=</i><i class="funcname">getchar</i>
    <ul class="args"></ul>
    <i class="s"></i>
  </div>
</div>
* {
    margin: 0;
    padding: 0;
}
div, i, ul, li {
    white-space: pre;
    display: inline;
    font-style: normal;
}
li:after {
    content: ', ';
}
li:last-child:after {
    content: '';
}
.stbody:before, .funcbody:before {
    content: ' {\A';
}
.stbody:after, .funcbody:after {
    content: '}\A';
}
.type:after {
    content: ' ';
}
.args:before {  
    content: '(';
}
.args:after {
    content: ')';
}
.st:after {
    content: ' ';
}
.s:after {
    content: ';\A';
}
.op:after, .op:before {
    content: ' ';
}
(jsfiddle)
Выглядит противно и жутко. Но своё дело делает — пробелы расставлены, где нужно (отступов нет, их можно сделать при помощи сдвига дивов).
Есть ли уже существующие форматы для описания форматирования кода?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 6)
Ответ на: комментарий от aol

Пробелы != отступы.
Я имею ввиду пробелы перед блоками и те, которые окружают операторы.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от expelled

Где?

/usr/share/vim/
├── addons
│   └── syntax
│       ├── llvm-3.5.vim
│       ├── llvm-3.6.vim
│       ├── tablegen-3.5.vim
│       └── tablegen-3.6.vim
├── vim74
│   ├── debian.vim
│   └── doc
│       ├── help.txt
│       ├── README.Debian
│       └── tags
├── vimfiles -> /etc/vim
├── vimrc -> /etc/vim/vimrc
└── vimrc.tiny -> /etc/vim/vimrc.tiny

5 directories, 10 files

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от aol

Отступы в блоках могут многие текстовые редакторы расставлять. А пробелы и переносы строк немногие.
Интерес в том, чтобы найти/придумать формат для описания, где и как расставлять переносы строк.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

почему бы не GNU indent?
обязательно нужен велосипед? :)

aol ★★★★★
()
Ответ на: комментарий от CYB3R

Пример такого формата, как я его себе представляю:

def $args(array[1]):
  0..[n-1]: print '$args[i], '
  n: print '$args[n]'

def $targs(array[2]):
  0..[n-1]: print '$targs[0][i] $targs[1][i], '
  n: print '$targs[0][n] $targs[1][n]'

deffunc:
  print '$type $name($targs) {\n→$body\n}\n'

callfunc:
  print '$name($args);\n'

...

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

вим должен быть полным (huge), а не обрезок вонючий (tiny), кое-какой синтаксис лежит здесь:

/usr/share/vim/vimfiles/syntax/
остальное и основное, здесь:
/usr/share/vim/vim74/syntax/

kep
()

Я бы представил код в виде дерева, у каждого типа вершины (объявление функции, объявление переменной етц) будет один или несколько способов отображения, скажем

sprintf(buffer, "%s %s(%s) {\n%s\n}\n", return_type, func_name, func_args, func_body)

или

sprintf(buffer, "%s %s(%s)\n{\n%s\n}\n", return_type, func_name, func_args, func_body)

или

sprintf(buffer, "%s %s(%s)\n\t{\n%s\n\t}\n", return_type, func_name, func_args, func_body)

Получилось три варианта положения скобок в объявлении функции. Эти настройки можно вынести в файл в любом формате, скажем

function_declaration {
  braces_position: next_line;
}
while_loop, if_condition {
  braces_position: same_line;
}

Итд. Нутыпонял.

observable
()
Ответ на: комментарий от observable

Да, понял. Я этим, наверное, и буду заниматься. Я думал, что уже есть готовые форматы.

CYB3R ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.