Non voglio includere l'interezza della mia lingua, ma penso che la parte rilevante sia:
<expr> ::= <logical>
| <comparison>
| <constant>
| <addition>
| <subtraction>
| <multiplication>
| <division>
<logical> ::= <expr> "AND" <expr>
| <expr> "OR" <expr>
| "NOT" <expr>
| "(" <expr> ")"
<comparison> ::= <expr> "==" <expr>
| <expr> "!=" <expr>
| <expr> "<=" <expr>
| <expr> ">=" <expr>
| <expr> "<" <expr>
| <expr> ">" <expr>
Quello che sto cercando di fare è trasformare un codice che assomiglia a:
IF @var + 2 == 4 THEN
something will happen
ELSE
something else will happen
ENDIF
E trasformalo in un albero di sintassi. Il motivo per cui vorrei un albero di sintassi è che questo è il codice che deve essere eseguito in un interprete e potrebbe essere necessario eseguire più volte il programma (e @var può essere ogni volta diverso). La parte più difficile per me finora è che non si tratta di un vero interprete, il codice in realtà sta esprimendo una storia interattiva, qualcosa come Twine.
Ho iniziato a scrivere il parser e tutto sta andando bene fino a quando non ho raggiunto il punto delle espressioni. Ho scritto un algoritmo di smistamento prima di produrre Reverse Polish Notation, e credo di essere riuscito ad avere l'algoritmo dello shunting yard per produrre un albero di sintassi (facendo scattare e spingere i nodi sullo stack di uscita invece di solo numeri e operatori) ; ma non capisco davvero come incorporare gli operatori booleani / logici.
Esiste un algoritmo in grado di gestire sia espressioni matematiche come 1 + 2 sia le mie espressioni AND
e ==
?
Devo ripensare la mia sintassi sopra?