Développement d'un compilateur pour VSPL

Rappel - la syntaxe de VSPL:

  1. <programme> --> begin <liste d'instructions> end
  2. <liste d'instructions> --> <instruction> ; <liste d'instructions>
  3. <liste d'instructions> --> <instruction>
  4. <instruction> --> <id> := <expression>
  5. <expression> --> <id> + <id>
  6. <expression> --> <id> - <id>
  7. <expression> --> <id>

Spécification du compilateur Java:

Le programme Java doit lire dans un fichier un programme écrit en VSPL et après l'avoir analysé, le programme imprime:

Solution

Svp., lisez de nouveau les sections suivantes dans les notes de cours: "Diagrammes syntaxiques" et "Exemple: les expressions - différentes grammaires et règles pour l'évaluation des attributs sémantiques" dans la section sur le "Attributs sémantiques".

Nous utilisons l'analyse récursive descendante. Cela veut dire que le compilateur contient une procédure récursive pour chaque non-terminal de la grammaire: <programme>, <liste d'instructions>, <instruction> et <expression>. Mais le non-terminal <liste d'instructions> peut être éliminé comme suit: On note que les règles (2) et (3) peuvent être remplacées par la règle (en BNR étendu avec l'étoile de Kleene): <liste d'instructions> --> ( <instruction> ; )* <instruction> . Ensuite on peut substituer la partie droite pour <liste d'instructions> dans la règle (1) qui devient alors: <programme> --> begin ( <instruction> ; )* <instruction> end .

Puis, on peut écrire des automates (récursive), un pour chaque non-terminal, comme suit (nous avons déjà vu de tels automates récursive dans la discussion de la grammaire des expressions régulières au début du chapître sur l'analyse syntaxique): - note: on utilise ici les noms anglais: <program> pour <programme> et <statement> pour <instruction> -

programstatement expression

Ceci peut aussi être transformé en graphes syntaxique (voir ici). Ces automates (ou les graphes syntaxiques correspondants) peuvent être facilement traduits en code Java, comme montré par la classe Syner dans le programme Java appellé SimpleCompiler. Similairement, on peut écrire des graphes syntaxique pour l'analyse lexical et construire un programme Java correspondant (voir la classe Lexer dans le SimpleCompiler). Et voici un programme exemple et la sortie produite par le compilateur en analysant ce programme.

Commentaires sur le programme du SimpleCompiler (en anglais):