Ottengo come eseguire una derivazione di un BNF. I miei libri di testo fanno un buon lavoro di spiegazione (molto meglio delle note di lezioni online di molti professionisti, ecc.). Esempio di seguito le mie domande:
<program> => begin <stmt_list> end
<stmt_list> => <stmt>
| <stmt>; <stmt_list>
<stmt> => <var> = <expression>
<var> => A | B | C;
<exression> => <var> + <var>
|<var> - <var>
|<var>
Genera:
<proogam> => begin<stmt_list> end
=> begin<stmt>;<stmt_list> end
=> begin<var> = <expression>;<stmt_list>end
=> begin a = <expression>;<stmt_list>end
=> begin a = <var> + <var>;<stmt_list>end
=> begin a = b + <var> ; <stmt_list>end
=> begin a = b + c ; <stmt_list> end
=> begin a = b + c; <var> = <expression>; <stmt_list>end
=> begin a = b + c; b = <expression>; end
=> begin a = b + c; b = <var> + <var>;<stmt_list> end
=> begin a = b + c; b = c + <var>; <stmt_list> end
=> begin a = b + c; b = c + a; <stmt_list> end
=> begin a = b + c; b = c + a; <var> + <expression>
=> begin a = b + c; b = c + a; c = <expression>;
=> begin a = b + c; b = c + a; c = <var>;
=> begin a = b + c; b = c + a; c = b;
Ho ricevuto il maggior numero di volte e conosco il vantaggio di BNF. Ma riguardo le derivazioni, perché le facciamo token per token quando è abbastanza ovvio quale sarebbe il codice risultante?
Inoltre, con derivazione BNF, quando viene utilizzato un OR nella sintassi come si traduce questo? Ad esempio:
<if_stmt> if (<logic_expr>) <stmt>|
if (<logic_expr>) <stmt> else <stmt>