Инструмент для бесшумного, непрозрачного синтаксиса Си

Сейчас я пишу C, и потому, что мне нравится синтаксис с прописными буквами, я хотел бы написать его вот так:

#include <stdio.h>

int main(void)
  printf("Hello, world!")
  return 0

Вместо этого:

#include <stdio.h>

int main(void) {
  printf("Hello, world!");
  return 0; 
}

Кто-нибудь знает инструмент, который преобразует первое в последнее?

Изменить: мне действительно не интересно спорить с теми, кто считает, что это плохая идея. Во что бы то ни стало продолжайте думать, что у вас есть свои причины. Но, по крайней мере, знаю это: я знаю, что Python - это язык, чувствительный к пробелам, но я его не использовал. Почему я? Я уже знаю Руби. Также знаю: я не просто изучаю C в первый раз, и я использовал PHP и JavaScript более четырех лет, поэтому я не требую этого из-за каких-то личных трудностей, отсутствия знакомства с блочным синтаксисом или догматической принадлежностью. Я также знаю, что было бы связано с написанием одного из них и не выходящего за рамки моих возможностей, но я не хочу, чтобы этого было достаточно, чтобы оправдать расходы на время написания.

Ответ 1

PythoidC - бессердечный язык C http://pythoidc.googlecode.com

c.include(c.h.stdio) 
c.include(c.h.stdlib) 

int fib(int n): 
    if (n<=2): 
        return 1 
    else:
        return fib(n-1) + fib(n-2) 

int main(int argc, char **argv): 
    int n //C style annotation 
    n=c.stdlib.atoi(argv[1]) 
    c.stdio.printf('fibonacci(%d)=%d\n', n, fib(n))

PythoidC автоматически генерирует следующий код C:

int fib(int n){ 
    if (n<=2){ 
        return 1;} 
    else{ 
        return fib(n-1) + fib(n-2);}} 

int main(int argc, char **argv){ 
    int n ;//C style annotation 
    n=atoi(argv[1]); 
    printf("fibonacci(%d)=%d\n", n, fib(n)); 
} 

Ответ 2

Даже если бы был такой инструмент, я бы настоятельно рекомендовал вам пересмотреть эту идею. Вот несколько проблем, которые, я думаю, вы найдете при этом:

  • Ваш код больше не будет стандартным.
  • Это означает, что у вас будет проблема с другими программистами, читающими ваш код.
  • Вы также не сможете использовать инструменты анализа кода, так как они не поймут ваш синтаксис.
  • Если у вас есть какой-то инструмент, который будет конвертировать, скажем, каждый компилятор, это все равно означает, что вы будете писать другой код, чем будете читать. Мне бы очень хотелось использовать инструмент, который меня постоянно меняет код.

Это действительно похоже на то, что приспосабливать свои привычки ко всем остальным - это более разумный подход.

Надеюсь, это заставит вас пересмотреть.

Ответ 3

Если вы действительно хотите это сделать, это не будет возможно без реализации парсера языка, и даже тогда я не уверен, как будет применяться соглашение о кодировании для некоторых из случаев на вашем "новом языке, который выглядит например, C, но не имеет брекетов". Например, возьмите следующий код C:

struct a {
    int i;
};

int main(void) {
    ...
}

Вы можете записать его как

struct a
    int i

int main(void)
    ...

Но он должен быть преобразован в исходный код, а не:

struct a {
    int i;
} /* Note the missing semicolon! */

int main(void) {
    ...
}

Кроме того, приведенные ниже фрагменты:

/* declare b of type struct a */
struct a {
    int i;
} b;

/* a struct typedef */
typedef struct a {
    int i;
} b;

Как вы собираетесь указывать их на своем языке?

Вы, похоже, не хотите использовать точки с запятой на вашем языке. Это немного ограничивает ваш код и делает инструмент преобразования сложным, потому что вы не можете иметь продолжения без лишних усилий:

i = j +
k;

является законным C, но

i = j + ;
k;

нет.

Итак, во-первых, вам нужно более точно определить грамматику вашего "бесцельного C". Как говорили другие, подобные вещи чреваты опасностью.

Ответ 5

Нет инструмента, но псевдокод:

last_spc_count = 0
For all lines in input file check number of trailing spaces spc_count
  Print old line
  If spc_count > last_spc_count print "{\n" (last_spc_count-spc_count)/2 times
  Else If spc_count < last_spc_count print "}\n" (last_spc_count-spc_count)/2 times
  Else print "\n"
  last_spc_count = spc_count
print "}\n" last_spc_count/2 times

Ответ 6

Да, там мне очень нравится. Они называют это Python.

Ответ 7

http://www.cython.org/

Но это другой язык... это в основном диалект на языке Python с характеристиками производительности C.

Не сворачивайте свой язык, используйте что-то стандартное.

Ответ 8

Я не считаю, что такой инструмент существует. Существуют инструменты для очистки форматирования, но код уже должен быть отформатирован C.

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