Инструмент для беспроблемного, чувствительного к пробелам синтаксиса C - PullRequest
10 голосов
/ 05 января 2010

Я сейчас пишу немного 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 более четырех лет, поэтому я не требую этого из-за каких-то личных трудностей, отсутствия знакомства с блочным синтаксисом или догматической принадлежности. Я также знаю о том, что может быть связано с написанием одного из них, и это не выходит за рамки моих возможностей, но я не хочу этого достаточно, чтобы оправдать тратить время на написание одного из них.

Ответы [ 8 ]

28 голосов
/ 05 января 2010

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

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

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

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

11 голосов
/ 05 января 2010

Если вы действительно хотите сделать это, это не будет возможно без реализации синтаксического анализатора языка, и даже тогда я не уверен, каким будет соглашение о кодировании для некоторых случаев в ваш "новый язык, который выглядит как 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". Как уже говорили другие, подобные вещи чреваты опасностью.

10 голосов
/ 08 марта 2010

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)); 
} 
3 голосов
/ 05 января 2010

Отступ в стиле Python для C .

Похоже, это то, что вы ищете.

2 голосов
/ 05 января 2010

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

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
1 голос
/ 05 января 2010

http://www.cython.org/

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

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

1 голос
/ 05 января 2010

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

0 голосов
/ 05 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...