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.