Comentarios para simplificar el codigo:
1. La comparacion
Código C++:
Ver original(*itAnterior)->NodeType() != SENTENCIAW || (*itAnterior)->NodeType() != SENTENCIAW )
parece comparar 2 veces lo mismo. Es asi?
2.
Si declaras el metodo inter() en la clase statement y un block lo derivas de statement, no sera necesario hacer los casts
Código C++:
Ver original(dynamic_cast<assign*>(*stm))->inter();
y podras hacer, directamente
sin necesidad de preguntar por el tipo antes.
3. La lista esta llena de punteros, has descartado que ellos no sean nulos?
Recomiendo hacer:
y luego comparar pstatement contra 0 (null) y usarlo de ahi en adelante, solo si no es null, en vez de hacer
(*strm)-> .. desreferenciando sin chequear..
En ese caso, la sugerencia 2) quedaria