Programma di esempio REMCPP.PRT |
; REMCPP
;
; Programma per Proteus
;
; (C) 1998-2003 Simone Zanella Productions
;
; Rimuove i commenti C++.
;
; Algoritmo:
; - se "//" non è presente nella linea, la scrive verbatim; altrimenti,
; crea una nuova linea PL (vuota);
; - se la linea inizia in un commento, appende caratteri a PL fino a che
; il commento viene chiuso; quindi (o se la linea inizia fuori
; commento), considera gli ultimi due caratteri; se sono "/*", appende
; tutto fino a fine riga o fino al token "*/"; se sono "//", li ignora
; fino alla fine della riga. Stampa PL se non è vuota.
;
; Nota: i token "//", "/*" e "*/" non possono apparire dentro stringhe.
; Inizializza
FUNCTION ONSTART()
IF STREQ(ARGV(3), "..")
CONSOLELN "Sintassi: " ARGV(1) " " ARGV(2) " sorgente destinazione"
CONSOLELN ""
CONSOLELN "Scopo: elimina i commenti C++ da sorgente"
ABORT 0
FI
_InRem = 0
RETURN
; Trova il token "//"
Pos = STRSTR(L, "//")
; Non trovato
IF EQ(Pos, 0)
; Scrive la linea com'è
PRINTLN L
; Imposta InRem in base ai commenti C style
P = STRRSTR(L, "/*")
M = STRRSTR(L, "*/")
; C'è un token di inizio commento
IF NEQ(P, 0)
; C'è un token di fine commento
IF NEQ(M, 0)
; Siamo dentro un commento se P è maggiore di M
InRem = GT(P, M)
ELSE
; Siamo dentro ad un commento (trovato solo l'inizio commento)
InRem = 1
FI
ELSE
; Fine commento: imposta il flag
IF NEQ(M, 0)
InRem = 0
FI
FI
ELSE
PL = ""
P = 1
M = STRLEN(L)
Prev = 0
Current = SUBSTR(L, P, 1)
; La linea inizia dentro un commento C: copia fino a fine riga
; o a fine commento
IF EQ(InRem, 1)
WHILE AND( AND(InRem, LE(P, M)), \
OR(STRNEQ(Prev, "*"), STRNEQ(Current, "/")) )
PL = PL Current
Prev = Current
INC(@P)
Current = SUBSTR(L, P, 1)
IF AND(STREQ(Prev, "*"), STREQ(Current, "/"))
InRem = 0
BREAK
FI
LOOP
FI
; Appende caratteri fino a che trova il token "//"
WHILE AND( LE(P, M), \
OR(STRNEQ(Prev, "/"), STRNEQ(Current, "/")) )
; Inizio commento
IF AND(STREQ(Prev, "/"), STREQ(Current, "*"))
InRem = 1
; Copia fino a fine riga o a fine commento
WHILE AND( AND(InRem, LE(P, M)), \
OR(STRNEQ(Prev, "*"), STRNEQ(Current, "/")) )
PL = PL Current
Prev = Current
INC(@P)
Current = SUBSTR(L, P, 1)
IF AND(STREQ(Prev, "*"), STREQ(Current, "/"))
InRem = 0
BREAK
FI
LOOP
ELSE
; Appende Current se non è un token "//"
IF STRNEQ(SUBSTR(L, P, 2), "//")
PL = PL Current
FI
Prev = Current
INC(@P)
Current = SUBSTR(L, P, 1)
FI
LOOP
; Se la linea modificata non è vuota, la scrive
IF ISNOTEMPTY(PL)
PRINTLN PL
FI
FI