2010-04-17 26 views
10

Sto iniziando un po 'di apprendimento e voglio scrivere la mia evidenziazione della sintassi per i file in C++.Come implementate l'evidenziazione della sintassi?

Qualcuno può darmi idee su come fare per farlo?

a me sembra che quando un file viene aperto:

  1. Si avrebbe bisogno di essere analizzato e deciso che tipo di file di origine che è. Confidando l'estensione potrebbe non essere

  2. Un modo infallibile per sapere cosa/si applicano le parole chiave comandi per quale lingua

  3. Un modo per decidere di che colore ogni parola/comando ottiene

I voglio farlo su OS X, usando C++ o Objective-C.

Qualcuno può fornire indicazioni su come potrei iniziare con questo?

risposta

1

Supponendo che si stiano utilizzando i framework Cocoa, è possibile utilizzare UTI per determinare il tipo di file.

Per una panoramica delle API:

http://developer.apple.com/mac/library/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html#//apple_ref/doc/uid/TP40001319-CH201-SW1

Per un elenco delle IVU nota:

http://developer.apple.com/mac/library/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1

Le due chiavi sono probabilmente più interessati sarebbe kUTTypeObjectiveC PlusPlusSource e kUTTypeCPlusPlusHeader.

Per l'evidenziazione si potrebbe trovare le informazioni in questa pagina utile in quanto discute l'evidenziazione della sintassi con una NSView e attributi temporanei:

http://www.cocoadev.com/index.pl?ImplementSyntaxHighlightingUsingTemporaryAttributes

1

Penso che (1) non sia possibile, poiché l'unico modo per sapere se un file è valido C++ è quello di eseguirlo attraverso un parser C++ e vedere se analizza ... ma se lo hai usato come standard , non puoi operare su codice che non viene compilato perché è un work-in-progress, che probabilmente vuoi fare. Probabilmente è meglio fidarsi dell'estensione, poiché non penso che nessun altro metodo funzionerà meglio di così.

È possibile ottenere un elenco di C++ parole chiave qui: http://www.cppreference.com/wiki/keywords/start

I colori sono a voi (o se si vuole, è possibile farli configurabile e lasciare la scelta all'utente)

12

evidenziatori di sintassi in genere non vanno oltre l'analisi lessicale, il che significa che non devi analizzare l'intero linguaggio in dichiarazioni, dichiarazioni, espressioni e quant'altro. Devi solo scrivere un lexer, che è abbastanza facile con le espressioni regolari. Ti consiglio di iniziare imparando le espressioni regolari, se non lo hai già fatto. Ci vorranno tutti i 30 minuti.

Si consiglia di prendere in considerazione l'utilizzo di Flex (il generatore di analizzatori lessicali; https://github.com/westes/flex) come esercizio di apprendimento. Dovrebbe essere abbastanza facile implementare un evidenziatore di sintassi di base in Flex che restituisca l'HTML evidenziato o qualcosa del genere.

In breve, si dovrebbe dare a Flex un insieme di espressioni regolari e cosa fare con il testo corrispondente, e il generatore si abbinerà avidamente alle proprie espressioni. Puoi rendere la tua transizione lexer tra stati esclusivi (ad esempio dentro e fuori di stringhe letterali, commenti, ecc.) Come mostrato in the flex FAQ. Ecco un esempio canonico di un lexer per C scritto in Flex: http://www.lysator.liu.se/c/ANSI-C-grammar-l.html.

Fare un evidenziatore sintattico estensibile sarebbe la prossima parte del tuo viaggio. Sebbene non sia affatto un fan dell'XML, dai un'occhiata a come sono definiti i file di evidenziazione della sintassi di Kate, come ad esempio this one for C++. Il tuo compito sarebbe quello di capire come si desidera definire gli evidenziatori di sintassi, quindi creare un programma che utilizzi tali definizioni per generare HTML o qualsiasi cosa tu voglia.

1

Si potrebbe voler vedere come GeSHI implementa l'evidenziazione, ecc. Inoltre, ha un sacco di pacchetti di lingue che contengono tutte le parole chiave che vorrai.

Problemi correlati