Programma di esempio CHECKPAR.PRT |
; CHECKPAR
;
; Programma per Proteus
;
; (C) 1998-2003 Simone Zanella Productions
;
; Verifica che il numero di parentesi aperte ('(', '[', '{') corrisponda
; al numero di parentesi chiuse (')', ']', '}'); le parentesi dentro
; stringhe sono ignorate.
; Non produce alcuna uscita; i messaggi sono inviati a console.
; Parametri impliciti: output predefinito a console
;!proteus -o
; Inizializza
FUNCTION ONSTART()
IF STREQ(ARGV(3), "..")
CONSOLELN "Sintassi: " ARGV(1) " " ARGV(2) " sorgente"
CONSOLELN ""
CONSOLELN "Scopo: verifica l'accoppiamento delle parentesi"
ABORT 0
FI
; Pila per tenere le parentesi
_ParStack = STACKNEW()
RETURN
; Prima rimuove le virgolette singole: '"', '\"'
L = STRTRAN(L, "'\\\"'", "")
L = STRTRAN(L, "'\"'", "")
; Poi rimuove le stringhe
X = STRSTR(L, "\"")
WHILE X
Prev = " "
FOR Y = INC(X) TO STRLEN(L)
Car = SUBSTR(L, Y, 1)
IF AND(STREQ(Car, "\""), \
NOT(STREQ(Prev, "\\")))
BREAK
FI
IF AND(STREQ(Car, "\\"), STREQ(Prev, "\\"))
Prev = " "
ELSE
Prev = Car
FI
NEXT
L = DELETE(L, X, INC(SUB(Y, X)))
X = STRSTR(L, "\"")
LOOP
; Infine rimuove i singoli caratteri: '(', ')', '[', ']', '{', '}'
L = STRTRAN(L, "'('", "")
L = STRTRAN(L, "')'", "")
L = STRTRAN(L, "'['", "")
L = STRTRAN(L, "']'", "")
L = STRTRAN(L, "'{'", "")
L = STRTRAN(L, "'}'", "")
; Ora trova le parentesi
X = STRPBRK(L, "[]{}()")
WHILE X
; Trovata: isola il carattere
Car = SUBSTR(L, X, 1)
L = SUBSTR(L, INC(X), STRLEN(L))
; Aperta -> push
IF STRPBRK(Car, "[{(")
PUSH(ParStack, Car)
ELSE
; Chiusa -> pop
IF STACKHEIGHT(ParStack)
SCar = STACKTOP(ParStack, 0)
IF OR(OR(AND(STREQ(Car, ")"), STREQ(SCar, "(")), \
AND(STREQ(Car, "]"), STREQ(SCar, "["))), \
AND(STREQ(Car, "}"), STREQ(SCar, "{")))
POP(ParStack)
ELSE
CONSOLELN "Errore (" ARGV(3) \
"): mancata corrispondenza alla linea " \
N ", simbolo \"" Car "\"."
ShowStack(ParStack)
ABORT 1
FI
ELSE
CONSOLELN "Errore (" ARGV(3) \
"): linea " N ", \'" Car \
"\' chiuso senza simbolo aperto."
ABORT 1
FI
FI
X = STRPBRK(L, "[]{}()")
LOOP
FUNCTION ONEND()
IF STACKHEIGHT(PUB(ParStack))
CONSOLELN "Errore (" ARGV(3) \
"): fine del file con parentesi aperte."
ShowStack(PUB(ParStack))
ABORT 1
FI
CONSOLELN "Il programma " ARGV(3) " e' corretto."
RETURN
FUNCTION ShowStack(parstack)
CONSOLELN "Pila delle parentesi: "
FOR x = STACKHEIGHT(parstack) TO 0 STEP -1
CONSOLE POP(parstack)
NEXT
CONSOLELN ""
RETURN