Ho comprato online un vecchio libro sui compilatori. In realta' dovrei chiamarlo col suo nome:
la bibbia dei compilatori. Oggi, leggendo il capitolo sull'analisi lessicale, scopro una cosa nuova (del resto leggendo libri puo' capitare di scoprire qualcosa di nuovo).
Si parla di linguaggi, di grammatiche e di come organizzare l'analisi lessicale e sintattica per un particolare linguaggio. Ad un certo punto viene presentato un esempio, un frammento di codice scritto in
PL/1, per illustrare come l'analisi sintattica per il linguaggio PL/1 non fosse per niente semplice. Uno dei motivi per cui il
parsing risulta piu' complesso che per altri linguaggi a noi piu' familiari (C/C++, Java, ... ) e' dovuto al fatto che le keywords del linguaggio non sono parole riservate. Non so se fosse stata una svista degli progettisti di PL/1 o se l'avessero fatto volutamente, ma dall'esempio che segue, e' chiaro che se un domani dovreste trovarvi davanti all'arduo compito di definire un nuovo linguaggio (o un estensione di uno esistente) fareste meglio a definire riservate tutte le keywork del linguaggio:
IF THEN THEN THEN = ELSE; ELSE ELSE = THEN;
L'esempio sopra riportato e' un costrutto valido in PL/1.
Se non vi ha impaurito abbastanza, potreste pensare al seguente codice C++:
static class* class::static;
class class: public public
{
static class* static;
public:
class( ) {}
static class* getDefault( ) { return class::static; }
};
Ovviamente questo pezzo di codice viene "vomitato" da qualsiasi compilatore C++ che io conosca!