Description de l'étape
Vous devez écrire un analyseur syntaxique (parser) correspondant à la grammaire syntaxique de Drei. Le type d'analyseur que vous implantez est laissé à votre appréciation, mais nous vous recommandons charitablement d'utiliser la technique par descente récursive.
Votre analyseur doit bénéficier des caractéristiques suivantes.
- Votre analyseur doit accepter (terminer sans erreur) tout programme dérivable par la grammaire syntaxique de Drei (même si ce n'est pas un programme légal pour d'autres raisons). Aucune structure de données ne doit être générée à partir de l'analyse.
- Un programme qui n'est pas dérivable par cette grammaire doit être rejeté
- soit dès l'erreur détectée (le programme termine immédiatement)
- soit à la fin de l'analyse, en reprenant après l'erreur afin de détecter les éventuelles suivantes.
System.exit(-1)
).
Classe du parser
Dans le cas le plus simple, la seule classe sur laquelle vous aurez à travailler est celle de l'analyseur syntaxique lui-même. Pour cela, définissez une classe avec l'interface suivante.
package dreic class Parser(in: java.io.InputStream) extends Scanner(in) { def parse: Unit }
parse
- Une méthode qui va analyser (par rapport à la grammaire Drei) le flux de lexèmes du scanner. Si vous implantez un analyseur sans gestion d'erreurs et si le programme analysé est incorrect, cette méthode ne retourne pas (une exception est levée). Si vous utilisez la gestion d'erreurs, la méthode retourne toujours, mais les erreurs détectées sont publiées, par exemple à l'aide la classe
Report
.
Un canevas pour cet objet est à votre disposition.
Autres classes de support
Report.scala
- Cet objet fournit des services pour signaler des erreurs.
ParserTest.scala
- Cet objet permet de tester votre analyseur syntaxique, à condition que l'interface de votre analyseur corresponde.
Bien entendu, votre scanner est nécessaire pour implanter cette étape, et doit être compilé en parallèle avec le parser.