Che cosa voglio fare:
Analizza il codice sorgente, cerca un tag di inizio e di chiusura della mia definizione (uno che non è in conflitto con alcun modello definito nel linguaggio di programmazione), quindi sostituisce tutto dall'inizio del tag di apertura alla fine di il tag di chiusura con una qualche funzione dei dati all'interno. (Per contesto: questo fa parte del tipo di costruzione di una lingua ontop di una lingua esistente.)
Quindi, il mio pattern è @#$
.
e ho una riga di codice:
int x = @#$42@#$;
Vorrei sostituire
@#$42@#$
con f(42)
, che è un valore di ritorno di qualche funzione f
.
So come cercare i tag e sostituire tutto e funziona perfettamente.
Qualcosa con l'effetto di:
//filePointer points to the beginning of a file
while(filePointer != EOF)
{
//find index of first character of next opening tag
//find index last character of next ending tag
//infer data between tags
//calculate new data from data between tags
//replace index_first to index_last with new data
}
Tuttavia, dove mi imbatto in problemi, è che non voglio eseguire questa sostituzione se i tag si trovano all'interno di una stringa letterale e non riesco a pensare a un modo elegante per gestire questo caso.
Esempio:
int x = @#$42@#$;
avrebbe una sostituzione.
String x = "@#$42@#$";
non avrebbe una sostituzione.
Algoritmo ingenuo considerato:
Scorrere il file, tracciare coppie di virgolette che indicano valori letterali stringa.
Scorri di nuovo il file, trova i miei tag, controlla se sono all'interno di uno dei letterali stringa, in tal caso, non fare nulla.
Sento che c'è un modo migliore per sfuggirmi.
Qualsiasi suggerimento sarebbe più apprezzato.