Riconoscimento di alberi

Un file contiene la rappresentazione parentetica di un insieme di alberi. I nodi dell'albero sono numeri interi (es. 123, 1, ecc), oppure sono caratteri fra apici (es. 'a', '1', ecc). Gli alberi sono separati fra loro dal punto e virgola. Gli spazi e i ritorni a capo sono irrilevanti. Scrivere un analizzatore lessicale e sintattico per riconosccere gli alberi sintatticamente corretti.

Esempio

File di input:

( 'a' () () );

(
)
;

( 121  ( 'b' () () ) () )
;

('b' ('b' () () )
   ('a' () () )
);

( 'b' ( () () );

( b () () );

())

;

();

File di output:

( 'a' () () );

(
)
;

( 121  ( 'b' () () ) () )
;

('b' ('b' () () )
   ('a' () () )
);

( 'b' ( (Error: parse error) () )Error: parse error;Error: parse error

( b () () )Error: parse error;Error: parse error

())Error: parse error

;Error: parse error

();Error: parse error
Nota: Non è necessario che gli errori compaiano esattamente nello stesso modo del file di output di esempio. La cosa importante è che tutte le linee errate vengano segnalate.