Description de l'étape

Vous devez écrire un analyseur lexical (scanner) correspondant à la grammaire lexicale de Drei. Vous travaillerez principalement sur l'objet de définition des lexèmes, ainsi que le la classe du scanner elle-même.

Objet de définition des lexèmes

Pour commencer, il vous faut définir la liste des lexèmes, par exemple dans une classe dreic.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 dreic
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 dreic.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.

Quelques conseils

Pour vous faciliter la vie, vous pouvez utiliser un script Ant pour construire votre projet. Vous pouvez en télécharger un ici. Pour l'utiliser, organisez votre répertoire de travail avec toutes les sources dans le dossier sources et le fichier build.xml à la racine. Le script génère les classes compilées dans le dossier classes.

Pour compiler et exécuter votre projet, utilisez la commande suivante (sur bash).

ant && scala -cp classes dreic.ScannerTest monfichier