Mi è stato chiesto di creare uno strumento in grado di identificare se una stringa corrisponde a un modello.
Esempio:
{1:20} stuff t(x) {a,b,c}
corrisponde:
-
1 stuff tx a
-
20 stuff t c
È una specie di regex ma con una sintassi diversa
- Le parentesi indicano un valore facoltativo
- {1:20} è un intervallo; Dovrò controllare se il token è un numero e se è compreso tra 1 e 20
- {a, b, c} è solo un'enumerazione; può essere a o b o c
In questo momento ho implementato questo con una regex, e l'intervallo era un problema da fare.
Nel mio tempo libero ho provato a implementare una sorta di fiammifero a mano, ma risulta che non è così facile da fare.
Sperimentando mi sono ritrovato con una funzione che genera una tabella di stato dal pattern e da una macchina a stati. Ha funzionato bene fino a quando non ho provato ad implementare il valore opzionale, e mi sono bloccato e su come generare la tabella di stato.
Dopo ho cercato come avrei potuto farlo, e questo mi ha portato a cose come il parser LLR, il parser LALR, il parser ricorsivo-discendente, le grammatiche context-free, ecc. Non ho mai studiato nulla di questo, quindi è difficile sapere cosa è rilevante qui, ma penso che questo è ciò di cui ho bisogno:
- Una grammatica
- Un parser che genera stati dalla grammatica e un pattern
- Una macchina a stati per vedere se una stringa corrisponde agli stati
Quindi la mia prima domanda è: è giusto? E seconda domanda, cosa mi consiglia di leggere / studiare per essere in grado di implementare questo?