Description de l'étape
Vous devez écrire un analyseur lexical (scanner) correspondant à la spécification de Vier (grammaire lexicale). Vous travaillerez principalement sur la classe du scanner elle-même, ainsi que sur l'objet de définition des lexèmes.
Objet de définition des lexèmes
Pour commencer, il vous faut définir la liste des lexèmes, par exemple dans une classe vierc.Tokens
. Pour cela, le plus simple est d'utiliser la classe Enumeration
de Scala. Consultez l'API Scala pour apprendre comment l'utiliser.
Un canevas pour cet objet est à votre disposition.
Classe du scanner
Bien entendu, vous devrez implanter l'analyseur lexical lui-même. Pour cela, définissez une classe avec l'interface suivante.
package vierc class Scanner (in: java.io.InputStream) { def nextToken: Unit var token: Token var start: Int var chars: String def representation: String }
nextToken
- Une méthode qui va lire le prochain lexème sur le flux d'entrée. L'état de l'objet change pour correspondre à celui du nouveau lexème lu.
token
-
Le type du lexème courant. Servez-vous pour cela des types de lexèmes définis dans l'énumération
vierc.Tokens
. start
-
La position du premier caractère formant le lexème courant. Voyez la classe
Position
à ce sujet. Cette valeur est optionnelle et nous ne testerons pas si elle est correcte ou non. Il est toutefois souhaitable de le faire: vos messages d'erreurs seront plus utiles. chars
- Lorsque le type de lexème courant est paramètrisé (un identifiant ou un nombre, par exemple), la valeur du paramètre.
representation
- Un méthode qui retourne le lexème courant dans une forme lisible.
Un canevas pour cette classe est à votre disposition.
Autres classes de support
Nous vous fournissons aussi plusieurs classes utilitaires que vous pouvez utiliser pour votre implantation. Lisez bien la documentation dans chaque fichier pour comprendre comment il fonctionne.
Position.scala
- Cet objet fournit des méthodes pour encoder la position dans un fichier source (ligne & colonne) à l'aide d'un seul entier.
Report.scala
- Cet objet fournit des services pour signaler des erreurs.
ScannerTest.scala
- Cet objet permet de tester votre analyseur lexical, à condition que l'interface de votre analyseur corresponde.