2010-10-01 9 views
8

Ho una domanda per i compiti del compilatore che mi chiede di disegnare un DFA per i commenti Pascal, ma non ho mai (e probabilmente mai lo farò) usare Pascal. La domanda non specifica se dovremmo usare ANSI Pascal o Turbo Pascal, quindi stavo andando a fare uno per entrambi.I commenti Pascal dovrebbero essere nidificati?

Alcune ricerche hanno dimostrato che Google mi Turbo Pascal permette commenti nidificati fintanto che lo stesso delimitatore non viene utilizzato, in modo {(*comment*)} è ok e così è (*{comment}*), ma {{comment}} o (*(*comment*)*) non sono ok. La mia domanda qui è se un commento come {(*{comment}*)} o (*{(*comment*)}*) è ok poiché gli stessi delimitatori non sono usati in una riga.

Ho anche cercato su google per vedere se ANSI Pascal ha consentito commenti nidificati, ma non ho trovato una risposta definitiva. Se ANSAL Pascal consente i commenti nidificati, quali sono le regole?

In una nota a margine, non sono preoccupato per la strana convenzione di commento di diversi delimitatori di inizio e fine, una convenzione consentita in ANSI Pascal.

UPDATE:

Vorrei essere chiaro che io non sono veramente interessato a come i compilatori specifici gestire commenti Pascal, io sono interessato a come un compilatore DEVONO gestire i commenti Pascal se questo compilatore aderito 100 % agli standard ANSI o TURBO Pascal.

+1

Questo mi sembra una domanda si dovrebbe chiedere il vostro istruttore. Controlla anche il tuo libro di testo. –

+0

@Rob Kennedy il mio istruttore e ne ho parlato prima di pubblicare la domanda, e ho già risolto il problema a suo piacimento. Il libro non ci stava cercando di approfondire la questione, ma mi piace essere completo. Inoltre, come ho affermato nella domanda, il libro non è specifico su quale versione di Pascal dovrebbe essere considerata, e poiché il libro è un libro di compilazione e non un libro di Pascal, le convenzioni di commento della lingua non sono definite esplicitamente, e questo è quello che sto cercando nella mia domanda e definizione esplicita. – ubiquibacon

risposta

11

ISO 7185:1990 dice questo circa commenti in § 6.1.8:

Se un commento è qualsiasi sequenza di caratteri e le separazioni di linee, contenente né} nè *), il costrutto

('{' | '(*') commento ('*)' | '}')

sarà un commento se né il {né il (* avviene all'interno di un personaggio-s tring o all'interno di un commento.

NOTE

  1. Un commento può quindi iniziare con { e terminano con *), o cominciare con (* e terminano con }.
  2. La sequenza (*) non può verificarsi in un commento anche se la sequenza {) può.

In base a ciò, c'è essenzialmente un solo tipo di commento. Sebbene sia possibile iniziare un commento con { o (*, non è possibile utilizzare set di caratteri diversi per "avvolgere" altri commenti. Turbo Pascal, d'altra parte, ha due tipi di commenti, quelli che usano le parentesi e quelli che usano le parentesi.

Se si dispone di un commento doppietta in stile e racchiuso in un commento tra parentesi stile per creare (*{}*), ISO dice il commento è (*{} con *) sinistra sopra, che sarà un errore di sintassi nel codice, mentre Turbo Pascal dice il commento è (*{}*) senza testo.

Nessuno stile consente di racchiudere un commento già inserito in un altro insieme di delimitatori di commenti. Questo perché una volta che si avvolge un commento, il commento "interiore" cessa di essere trattato come un commento più. È solo un testo normale. Se si dispone di {(**)} e si desidera avvolgere in un commento in stile parentesi per rendere (*{(**)}*), ISO e Turbo Pascal entrambi dicono che il commento è (*{(**) con }*) rimasto.

Nelle modalità fpc e objfpc, Free Pascal supporta i commenti di nidificazione, quindi il mio esempio più recente sarebbe accettato come commento valido senza testo rimanente. The FPC documentation on the matter in realtà non lo dimostra. Esso fornisce sei esempi di commenti presumibilmente annidati:

 
{ Comment 1 (* comment 2 *) } 
(* Comment 1 { comment 2 } *) 
{ comment 1 // Comment 2 } 
(* comment 1 // Comment 2 *) 
// comment 1 (* comment 2 *) 
// comment 1 { comment 2 } 

Ma Turbo Pascal (o Delphi, per le ultime due righe), che abbiamo già stabilito non supporto di nidificazione, avrebbe accettato tutto di quelli come commenti perfettamente validi! FPC supporta davvero i commenti annidati, ma quegli esempi non lo illustrano. Ecco alcuni esempi di commenti nidificati:

 
{ Comment 1 { comment 2 } } 
(* Comment 1 (* comment 2 *) *) 
{ Comment 1 (* comment 2 { comment 3 } *) } 

mi piacerebbe anche sostengo che terzo e quarto esempi di FPC sono in realtà controesempi per l'affermazione che FPC supporta i commenti annidati. Queste due linee non dovrebbero essere affatto commenti completi. Lo // nel mezzo della riga introduce un commento che non termina fino alla fine della riga (EOL). L'EOL viene dopo il il } e *), quindi il commento interno di tipo barra non può essere terminato quando raggiungiamo il delimitatore di parentesi graffa o parentesi. Proprio come lo <a> <b> </a> </b> è un XML annidato in modo errato, abbiamo commenti nidificati erroneamente: { // } EOL.

Dopo ulteriori sperimentazioni, concludo che in FPC, solo i commenti dello stesso tipo nidificano. Ad esempio, una volta aperto un commento con {, i caratteri (* cessano di essere speciali. FPC non aprirà un commento in stile parentesi all'interno del commento in stile controvento.Se così fosse, allora {(*} sarebbe un errore di sintassi dovuto al commento di parentesi non terminata. Potremmo spiegare questo dicendo che la terminazione dei commenti interni è facoltativa quando i commenti sono eterogenei, ma è una spiegazione più semplice per dire che il commento interno non viene rilevato come un commento. Una volta aperto un commento in stile controvento, solo le parentesi hanno un significato. Inoltre, // non avvia effettivamente un commento in stile barra quando è all'interno di parentesi graffe. Questa è una spiegazione più semplice per dire che FPC consente ai commenti in stile slash di essere annidati in modo errato. Si può dire che i commenti in stile barra non nidificano affatto, o che i commenti in stile barra nidificati all'interno di altri commenti in stile barra condividono un singolo terminatore EOL.

Il tuo compito probabilmente significava che tu usassi lo stile Turbo Pascal, dove i delimitatori di commento devono corrispondere. Sicuramente non ti aspettavi che tu usassi lo stile Free Pascal poiché avrebbe reso impossibile completare il compito - un DFA non può accettare costrutti arbitrariamente annidati.

+2

Ora che hai riassunto tutti i * commenti *, vorrei aggiungere in merito alla domanda che, in [1993] (http://en.wikipedia.org/wiki/Pascal_%28programming_language% 29 # Standard) lo standard ANSI ha cessato di esistere per conto dello standard ISO. Mentre TURBO, è [considerato] (http://pascal-central.com/extpascal.html#anchor-6) piuttosto un Pascal non standard. Non standard o no, sembra che non ci siano specifiche pubblicate su di esso. –

+0

grazie per la risposta molto descrittiva! Ciò ha reso le cose molto più chiare. Una cosa però, dove dici "potrei anche obiettare che le FPC ..." mi chiedo se sia corretto o meno. Userò le tue argomentazioni contro di te che i delimitatori del commento differiscono dalle bambole matrioske in quanto cambiano l'interpretazione di ciò che è dentro di loro. Il delimitatore di commento di partenza degli esempi 3 e 4 non "cambia l'interpretazione" 'del double-slash interno' // 'commento? – ubiquibacon

+0

@Sertac Akyuz è una buona scoperta dello standard ANSI che ora è lo standard ISO e su Turbo Pascal è un dialetto piuttosto che uno standard. – ubiquibacon

2

Almeno Delphi non consente {(*{comment}*)} perché la prima parentesi graffa chiusa chiude la prima parentesi graffa aperta e non l'ultima. Lo stesso vale per il tuo altro campione.

+0

Tuttavia, FPC non ha alcun problema con entrambi gli esempi, sembra inoltre consentire di annidare lo stesso simbolo, ad esempio "{{comment}}'. I [docs] (http://www.freepascal.org/docs-html/ref/refse2.html) dicono che c'è una dipendenza dalla modalità compilatore. –

+0

@Sertac Akyuz Ho provato vari commenti nell'editor di testo di SciTE e mi dice che '{{comment}}' non è valido. Non so quanto posso fidarmi comunque. Immagino che cosa sia e cosa non è permesso, tutto si riduce comunque al compilatore, ma mi sto chiedendo di più sugli standard (TURBO e ANSI) piuttosto che su quello che uno specifico compilatore non consente o non consente. – ubiquibacon

+0

@typo - Giusto abbastanza. Se ti piace dare un'occhiata allo standard [Pascal ISO 7185: 1990] (http://www.moorecad.com/standardpascal/iso7185.pdf). Questo è l'unico documento ufficiale a cui posso riferirmi. –

0

Credo che nella versione di Turbo Pascal ho usato, commenti nidificati non sono stati sostenuti, sia di questi sarebbe la compilazione:

{(* } 

{{ } 

Alcune ricerche di Google mi ha mostrato che Turbo Pascal permette commenti nidificati più a lungo lo stesso delimitatore non viene utilizzato

In effetti, i commenti nidificati sono "supportati", poiché la sintassi alternativa viene ignorata dal compilatore.

È possibile download a pascal compiler e scrivere il proprio dfa per supportare ciò che supporta il compilatore. Utilizzare uno dei loro programmi di esempio e vedere se i commenti nidificati verranno compilati.

+2

Penso che significhi che i commenti annidati sono * non * supportati. Non è possibile nidificare i commenti; un commento termina con il * primo * carattere di fine commento, indipendentemente dal numero di caratteri che iniziano con i commenti. –

+1

@Rob Kennedy Non penso che sia vero al 100% per Turbo Pascal perché '{(* comment *)}' è valido e lo è anche '(* {comment} *)'. Il commento INNER terminerebbe con il delimitatore corrispondente in Turbo Pascal e il commento OUTER terminerebbe con il delimitatore corrispondente. Questo perché Turbo Pascal NON consente commenti con delimitatori non corrispondenti come '(* commento}' o '{commento *)'. – ubiquibacon

+1

Ma @Typoknig, ciò non significa che i commenti sono nidificati. All'interno di un commento, * tutti gli * altri caratteri vengono ignorati. Il fatto che alcuni di questi personaggi sembrino apparire come gli altri commenti di Pascal è irrilevante. Una volta che hai un commento "esterno", il commento "interno" * cessa di essere un commento a tutti *. È semplicemente testo lì dentro. –

0

a FPC (Free Pascal): // ... (...) {...}