Newsgroup: it.comp.lang.c
Titolo: Riconoscimento delle funzioni

Un saluto a tutti...
Come si può estrarre il corpo delle funzioni da un file (di testo) di C e
memorizzarle in un secondo file, in modo che quest'ultimo contenga anche il
nome delle funzioni e il numero di parentesi graffe e tonde (per controllare
che le parentesi siano bilanciate)?
Vorrei usare il fatto che il nome delle funzioni si trova sulla stessa riga
della graffa, ad esempio:
 int funz1(int v) {
 ...
 }
in questo modo credo che il riconoscimento sia facilitato...
Spero di essermi espresso correttamente, se manca qualche elemento fatemelo
notare. Grazie a chi risponderà, ciao.
CoObjector
--------------------------------
Inviato via 
http://usenet.libero.it

puoi
leggere il file riga per riga, tenere in una variabile K il numero di
parentesi graffe aperte
se trovi "{" incrementi, se trovi "}" decrementi...
quando viene aperta una graffa e sei a livello 0 stai chiamando una
funzione...
(pero' questo presuppone che la sintassi del file sia corretta)
ciao
Fra


Inoltre devi stare attento a possibili graffe fra parentesi,
e tra commenti.
Inoltre bisogna che le "#define" siano state gia' "digerite" dal
preprocessore,
perche' per esempio una
#define CHIUDI }}
potrebbe causare alcuni problemi se presente nel file...
ciao,
g.

 ha scritto nel messaggio
news:212Z210Z209Z246...@usenet.libero.it...



Se sei sicuro che questa assunzione valga per i tuoi sorgenti usala pure,
pero' in c, in generale, puoi anche scrivere
int funz1(int v)
{
...
}
Non so se mi sono spiegato...
Ciao,
Ema

Di nuovo un saluto a tutti.
Non riesco a slatarci fuori con il mio problema di riconoscimento delle
funzioni, come ho scritto nel mio messaggio precedente.
Non potete mandarmi un listato in modo che possa avere un'idea di come si
risolve 'sto casino?
Grazie a quelli che risponderanno, il loro nome avrà riconoscimento eterno
in questo mondo di bit.


Non ho capito una cosa della tua domanda... Ma al di là del fatto di 
riconoscere le funzioni in un file sorgente in C, cosa vuoi ottenere sul 
secondo file? Il nome delle funzioni e basta? Il numero di parentesi 
aperte e chiuse?
Forse sono io ke sono un po' tardo... Comunque se dici di preciso quello 
ke vuoi ottenere se ci riesco ti dò una mano volentieri.
E per curiosità... a cosa ti serve una funzione che faccia questa cosa?
Ciao!
	Gio


Innanzitutto grazie, Gio, mi servirebbe veramente una mano!
Il problema è il seguente. Vorrei scrivere un programma in C che legga un
file di testo (contenete un programma in C) dal quale estrapolare tutte le
funzioni contenute e scriverle in un file di output; questo secondo file è
solo un elenco di funzioni, e non un codice eseguibile (cioè è SOLO un file
DI TESTO e NON un file in linguaggio C da compilare).
Spero di essermi spiegato bene, allora:
1) Il file di output è un file di testo
2) In questo file devono comparire il nome delle funzioni, il loro codice in
C, e il numero delle parentesi, o per lo meno se ci sono tante ( e { aperte
quante chiuse.
3) Di solito scrivo le funzioni mettendo la graffa sulla stessa riga del
nome della funzione, ad esempio:
 int funz1 (int f) {
e poi scrivo sotto la funzione, a intuito direi che questo può essere utile.
Visto che lo chiedevi, il programma mi serve per poter archiviare le
funzioni in modo da avere una lista completa per mia comodità: spesso non
ricordo dove salvo i sorgenti e per di più mi tocca lavorare su più PC fra
casa e ufficio... per uno disordinato come me, scrivere le cose per poterle
ritrovare alla svelta è fondamentale.
Grazie dell'interessamento, spero che almeno tu riesca ad aiutarmi, anche
perchè col C sono un po' arrugginito su certi argomenti.


Il problema è il seguente:
- o fai delle assunzioni che valgono per il tuo modo di scrivere un file 
sorgente in C
- o risolvi solo uno dei tuoi due problemi (riconoscere le funzioni e 
controllare che il numero delle parentesi aperte sia uguale a quello 
delle parentesi chiuse)
Ora mi spiego meglio:
- Se vuoi riconoscere una funzione, in generale (a meno che tu non 
faccia delle assunzioni per il tuo modo di scrivere un programma) ci si 
basa sul numero delle parentesi graffe. Anche il compilatore fa così, 
credo. Infatti quando:
	n° di { aperte  =  n° di } chiuse
(escludendo parentesi nei commenti, tra "" e '', parentesi in #define e 
non so se ho dimenticato qualcos'altro!), il compilatore crede ke la 
funzione sia finita lì. Spesso dà errori perché magari dopo c'è un for, 
un while, un if o qualcos'altro ke non può essere la dichiarazione di 
una nuova funzione ke lui invece si aspetta.
- Se vuoi contare le parentesi all'interno di una funzione (escludendo 
le parentesi all'interno di "", '', #define e commenti) devi invece 
sapere quali sono le funzioni in modo da separare una funzione 
dall'altra e trattarle separatamente.
Praticamente è un circolo vizioso se vuoi risolvere entrambi i problemi!
Per riconoscere le funzioni, il numero delle parentesi graffe (sempre 
escluse quelle ke dicevo) deve essere corretto. Per riconoscere invece 
se il numero di parentesi è corretto devi aver prima riconosciuto le 
funzioni.
Un'assunzione che si potrebbe fare è la seguente:
se sei solito mettere i prototipi delle funzioni in testa al programma 
(dopo le direttive # ed eventuali strutture) e nel prototipo dai ai 
parametri lo stesso nome che usi poi nella funzione (io ad es. lo faccio 
sempre), il problema diventa molto più facile.
Infatti, escludendo le dovute parentesi, si può memorizzare il nome 
delle varie funzioni in un vettore di stringhe. Così facendo, quando 
ritrovi una delle stringhe memorizzate nel vettore all'interno di una 
riga del file sai che si tratta della funzione.
La tua funzione a questo punto finisce quando trovi, con lo stesso 
criterio, un'altra che inizia. Quindi puoi ricopiare la funzione in un 
altro file senza problemi e controllare il numero delle parentesi.
Spero di essermi spiegato bene e di essere stato d'aiuto. Se vuoi una 
mano a realizzare una cosa del genere, quando ho tempo ti posso scrivere 
un programmino. E' una cosa senz'altro fattibile.
Ciao
		Gio


Ti ringrazio!
ma ho risolto il problema che avevo con questo programma durante questo
weekend grazie ad un amico più esperto dime, comunque ti ringrazio veramnte
tanto.
Saluti!
