Costruire una sintassi comune e un framework di scoping

2

Ciao colleghi programmatori, Stavo discutendo un progetto l'altro giorno con un mio collega ed ero curioso di vedere cosa avevano da dire gli altri o se esistesse già una cosa del genere.

Sfondo

Ci sono molti linguaggi di programmazione. Ci sono molti editor di IDE e sorgenti che evidenziano e modificano il codice sorgente. Seguire perfettamente ed esattamente le regole di un linguaggio per presentare le opzioni di completamento automatico e comprendere gli ambiti del codice è piuttosto complesso. Questo compito è abbastanza complesso che la maggior parte degli IDE implementano diversi editor di sorgenti come plug-in che spesso implementano ripetutamente le stesse funzionalità, ma in un modo diverso (netbeans).

Da quello che posso dire la maggior parte degli editor di IDE e sorgenti implementano nuovamente i parser che usano espressioni regolari, o qualche meta-sintassi Forma Naur per descrivere genericamente il grammer della lingua. Questi parser sono implementati più e più volte.

Domanda

Qualcuno ha tentato di unificare o descrivere un insieme di funzionalità tramite un'API e ha un'interfaccia coerente per analizzare vari linguaggi di programmazione e dialetti. Non sto descrivendo un IDE, ma un'API coerente per qualsiasi programma da utilizzare per analizzare e ottenere le meta-informazioni dal codice sorgente.

Mi rendo conto che vari linguaggi di programmazione offrono molte caratteristiche diverse che sono difficili da "astrarre" in una serie di funzionalità, ma ritengo che sarebbe una buona opportunità.

Mi sembra che questo potrebbe consentire agli autori di interpreti di aiutare a mantenere un interprete grammaticale centrale per la loro lingua. la fondazione Python potrebbe mantenere l'API di grammatica di Python, ANSI l'API di grammatica C, Oracle l'API di grammatica Java, ecc.

Esempio di utilizzo

Se esistesse questa API, i generatori di documentazione del codice potrebbero teoricamente funzionare su tutti i dialetti e le lingue fino a un certo livello. Non importa se il tuo progetto utilizzava 5 lingue diverse, una singola applicazione poteva documentarle tutte e i commenti e i doc-tag all'interno.

Qualcuno ha tentato in modo esauriente?

    
posta Ben DeMott 09.03.2011 - 23:04
fonte

2 risposte

3

Un problema è che lingue diverse hanno requisiti di analisi diversi. Sarebbe bello se tutti i linguaggi informatici esistenti avessero delle belle grammatiche libere da LL (1), ma non lo sono. Alcuni linguaggi, come C e C ++, non possono essere analizzati senza l'input da altre parti del compilatore. Inoltre, prima che il parser giunga all'analisi lessicale, che divide l'input in token, e lingue diverse richiederanno una tokenizzazione diversa ( ** è due token in C e uno in Fortran). Qualsiasi parser abbastanza generale da analizzare tutti i comuni linguaggi del computer sarebbe lento e difficile da scrivere per una grammatica.

Un altro è che tutto ciò che il parser può fare da solo, in realtà, è confermare se il programma è sintatticamente corretto o meno. Il parser avrà azioni associate a determinate produzioni di parser, ed è proprio questo a fornire la semantica. Ad esempio, dato a + b , il parser può determinare che a , + e b vanno in una espressione. Le azioni allegate determineranno che questo è il risultato dell'applicazione di '+' a 'a' e 'b', e determinare che questa è un'aggiunta di due variabili è in una fase concettuale successiva.

Poi c'è la domanda su cosa restituisce l'API. Può restituire il token successivo, ma questo non ci dirà molto. Se si tratta di inventare qualsiasi tipo di significato, come ad esempio l'uso di Intellisense, deve avere molte più specifiche e lingue diverse hanno diversi tipi di entità. Scrivi il parser per i costrutti C e C ++, e hai problemi con il finally di Java e probabilmente un vero problema con le monadi di Haskell. La cosa comune che i compilatori sputano è una sorta di codice eseguibile, di solito spogliato di gran parte o di tutte le semantiche più astratte.

In breve, non sembra fattibile per me. Se vuoi continuare a giocare con l'idea, prova a scrivere l'API e vedere di cosa ha bisogno. Se si arrivano a problemi più concreti, non esitate a chiedere informazioni su di loro qui o su SO.

    
risposta data 10.03.2011 - 00:02
fonte
1

Puoi controllare: link

È uno strumento per analizzare diverse lingue. Esistono alcuni strumenti correlati e I.D.E.

Ho qualche background nel design del compilatore, e come le risposte precedenti, e molte altre persone potrebbero dirlo, è praticamente impossibile creare una singola API, per diversi linguaggi di programmazione, poiché ogni sintassi differisce da una all'altra.

L'approccio più pratico, come già accennato, è quello di creare uno "scanner parziale / parser". È utilizzato da diversi editor con l'evidenziazione del codice. Invece di analizzare un intero file di codice sorgente, il parser cerca determinate "parole chiave" o espressioni.

    
risposta data 10.03.2011 - 00:11
fonte

Leggi altre domande sui tag