2010-01-04 16 views
10

Sto scrivendo un po 'C in questo momento e perché mi piace la sintassi spazi sensibili, mi piacerebbe scrivere in questo modo:Strumento per braceless, spazi sensibili C sintassi

#include <stdio.h> 

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

Invece di questo:

#include <stdio.h> 

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

Qualcuno sa di uno strumento che convertirà il primo in quest'ultimo?

Edit: Non ho alcun interesse a discutere con coloro che pensano che questa sia una cattiva idea. Con ogni mezzo continua a pensarlo, hai le tue ragioni. Ma almeno lo so: sono consapevole che Python è un linguaggio sensibile agli spazi bianchi, ma non l'ho usato. Perché dovrei? Conosco già Ruby. Inoltre, so che non sto solo imparando C per la prima volta e ho utilizzato PHP e JavaScript per più di quattro anni, quindi non lo sto chiedendo per una certa difficoltà personale, mancanza di familiarità con la sintassi dei blocchi o affiliazione dogmatica. Sono anche consapevole di ciò che sarebbe coinvolto nella scrittura di uno di questi e che non è al di là delle mie capacità, ma non lo voglio abbastanza da giustificare il tempo di scriverne uno.

+3

Basta scrivere uno strumento in Python :) – sberry

+12

Allora non sarebbe più C . Proprio come se volessi parlare inglese, ma metti tutti i verbi prima perché voglio. Non più inglese. – Joe

+0

Wow-wow-wow, ho visto qualcosa di simile un giorno o due fa, non so se fosse C# o C-specifico, ma lo strumento esiste. – Li0liQ

risposta

10

PythoidC è un linguaggio braceless 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 genera automaticamente il seguente codice 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)); 
} 
+0

Presumibilmente, genera anche '#include ' e '#include '; probabilmente li hai lasciati fuori perché sembravano enormi intestazioni (e mancava il simbolo "#"). Impara a indentare il codice di 4 spazi e la maggior parte dei problemi scompare.Nota anche che quando stai modificando, c'è un pulsante con la sequenza binaria 101010 al suo interno; quel codice di indentazione per te. –

+0

Che cosa significa un pulsante con una sequenza binaria? Intendi un pulsante di attivazione/disattivazione? –

+0

Questo è esattamente quello che si dovrebbe cercare, ma lo strumento sembra piuttosto orribile. Il codice sorgente è anche abbastanza primitivo e disordinato. :( –

1

Sì, ce n'è uno che mi piace molto. Lo chiamano Python.

+9

Appartiene a smartassoverflow.com –

+2

@Robert overflow del culo? ewwwww. – poundifdef

+0

Sono diviso in due.Voglio votarti per trolling Python, e voglio votarti per aver sbattuto C, quindi nessun voto è: D –

0

Non credo che un tale strumento esista. Esistono strumenti per pulire la formattazione, ma il codice deve essere già formattato in C.

Penso davvero che dovresti usare il linguaggio come progettato e imparare a usare le parentesi.

2

Nessuno strumento, ma pseudocodice:

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 
+0

Grazie per aver davvero cercato di aiutare. Lo apprezzo. –

28

Anche se ci fosse un tale strumento, vorrei vivamente di riconsiderare questa idea. Qui ci sono solo alcuni problemi penso che troverete con il fare questo:

  1. Il codice sarà più serie C.
  2. Ciò significa che avrete un problema con altri programmatori a leggere il codice.
  3. Non sarà inoltre possibile utilizzare alcuno strumento di analisi del codice, poiché non capiranno la sintassi.
  4. Se hai qualche tipo di strumento che convertirà, per esempio, in ogni compilazione, ciò significa che dovrai scrivere codice diverso da quello che leggerai. Mi dispiacerebbe usare uno strumento che cambia il mio codice per me tutto il tempo.

Questo sembra davvero un caso in cui l'adattamento delle abitudini a tutti gli altri è l'approccio più intelligente.

Spero che questo ti faccia riconsiderare.

+0

Lo strumento esistente non rimuove le parentesi crea invece blocchi di indentazione speciali. Sto solo riscontrando qualche problema nel trovarlo :( – Li0liQ

+13

Avrei dovuto svuotarlo due volte se avessi potuto. Avrei dovuto trattare con un collega una volta che aveva un file di intestazione in cui definiva le versioni latine di tutte le parole chiave, quindi poteva scrivere la sua C codice con parole chiave latine, ha anche sostituito le parentesi graffe con le corrispondenti parole latine.Sento ancora gli incubi su quel codice – JesperE

+2

@Jesper giusto, ma per questa domanda non ci sono prove che ci siano dei colleghi o che tutto sia in produzione – poundifdef

3

Python-style indentation for C.

Sembra che sia quello che stai cercando.

+0

Anche se non riesco ancora a trovare lo strumento che ho visto qualche tempo fa :( – Li0liQ

+0

Sembra che non sia ancora stato implementato, ma è lo stesso esercizio –

+0

Il link non sembra indicare niente di utile – FDinoff

1

http://www.cython.org/

Ma questa è una lingua diversa ... è fondamentalmente un dialetto Python con proprietà di prestazione C.

Non rollare la tua lingua, usa qualcosa di standard.

11

Se si vuole fare questo , non sarà possibile senza l'utilizzo di un parser della lingua e anche in questo caso, non sono sicuro di come sarà la convenzione di codifica per alcuni dei casi nella "nuova" linguaggio che assomiglia a C ma non ha parentesi ". Per esempio, prendete il seguente codice C:

struct a { 
    int i; 
}; 

int main(void) { 
    ... 
} 

Si può scrivere come

struct a 
    int i 

int main(void) 
    ... 

Ma deve essere convertito il codice originale, non:

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

int main(void) { 
    ... 
} 

Inoltre, dati i frammenti seguenti:

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

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

Come hai intenzione di specificarli nella tua lingua?

Sembra che tu non voglia utilizzare il punto e virgola nella tua lingua. Questo limita il codice di un bel po ', e rende lo strumento di conversione complicato così, perché non si può avere linee di continuazione senza sforzo in più:

i = j + 
k; 

è C legale, ma

i = j + ; 
k; 

non è .

Quindi, per prima cosa, è necessario definire la grammatica della "C senza briglia" in modo più preciso. Come altri hanno già detto, questo genere di cose è pieno di pericoli.

+0

Gradirei un motivo per il downvoting –

+1

Forse lo sapete già ma non avete bisogno di un parser completo, avete bisogno di un lexer parziale e di una logica di inserimento, potreste aver pensato tutto questo quando avete detto "parser" ma avete perso la risposta –

+1

Leggendo alcuni dei tuoi punti successivi: un'implementazione di questo in un linguaggio di scripting potrebbe rinunciare ad una grammatica formale Sono consapevole che rendere C whitespace sensibile significa che le cose non possono essere distanziate su più righe (questo è vero per definizione) e sono anche consapevole del fatto che non tutti i blocchi richiedono i punti e virgola. Questi sono dettagli del problema ma non i motivi per cui un'implementazione non è fattibile. Tuttavia, identificano perché scrivere qualcosa del genere richiederebbe un po 'di tempo. –