• Aucun résultat trouvé

Addendum: Grammaires LL(2)

N/A
N/A
Protected

Academic year: 2022

Partager "Addendum: Grammaires LL(2)"

Copied!
7
0
0

Texte intégral

(1)

Addendum: Grammaires LL(2)

Martin Odersky

15 novembre 2005

version 1.3

(2)

Probl`emes avec la grammaire Zwei

Si l’on consid`ere ce sous-ensemble de la grammaire Zwei :

Statement = Formal "=" Expression

| ident "=" Expression

| Expression Formal = Type ident

Type = ident

| ...

Expression = ident

| ...

Lorsqu’un lex`eme identest lu, le prochain lex`eme peut ˆetre : un autreident: c’est une d´eclaration de variable ; un =: c’est un assignement de variable ;

autre chose : c’est une expression.

C’est-`a-dire qu’`a ce moment, on ignore quelle est l’alternative qui est en train d’ˆetre reconnue.

(3)

Plus g´en´eralement, on peut montrer que :

la grammairepour Zwei n’est pas LL(1) — ce qui est assez commun : Scala, Java ou C# sont dans le mˆeme cas ; la grammairepour Zwei est LL(2) ;

le language Zwei est LL(1), c’est `a dire qu’il existe une autre grammaire pour Zwei qui est LL(1).

Ces deux derni`ere propri´et´es am`enent `a deux solutions pour utiliser quand mˆeme une analyse par descente r´ecursive pour Zwei :

1 Modifier l’analyseur syntaxique pour accepter les grammaire LL(2) : c’est la solution que nous recommandons.

2 Transformer la grammaire de Zwei en une grammaire LL(1) par factorisation sur la gauche : c’est possible mais assez laborieux.

(4)

Analyse syntaxique d’une grammaire LL(2)

Un analyseur syntaxique LL(2) requiert l’ajout `a l’analyseur lexical d’une fonction def peekAhead: Tokenqui :

retourne le lex`eme suivantle lex`eme courant.

ne modifie pas la valeur detoken,chars etpos dans l’analyseur lexical.

(5)

Rendre un analyseur lexical compatible LL(2)

Pour rendre un analyseur lexical compatible avec une grammaire LL(2), les modifications suivantes sont requises :

1 D´efinir une variable pour stocker toute l’information obtenue par peekAhead:

var pushedBack: Option[Triple[Int,String,Token]] = None;

2 Modifier nextTokencomme suit :

def nextToken: Unit = pushedBack match { case Some(Triple(p, c, t)) =>

token = c; chars = c; pos = p;

pushedBack = None;

case None =>

... // comme precedement }

3 Ajouter la m´ethode peekAheadelle-mˆeme.

(6)

Implantation de peekAhead

def peekAhead: Token = pushedBack match { case Some(Triple(p, c, t)) => t

case None =>

val savedToken = token;

val savedChars = chars;

val savedPos = pos;

nextToken;

pushedBack = Some(Triple(pos, chars, token)) token = savedToken;

chars = savedChars;

pos = savedPos;

pushedBack.get._3 }

(7)

Rendre un analyseur syntaxique compatible LL(2)

Finalement, `a l’aide de la m´ethode peekAhead, la partie critique du code de Statementdans l’analyseur syntaxique peut ˆetre ´ecrit de la mani`ere suivante :

def Statement = {

if (token == IDENT) { peekAhead match {

case IDENT =>

Formal; accept(EQUALS); Expression case EQUALS =>

nextToken; accept(EQUALS); Expression case _ =>

Expression }

else ...

}

Références

Documents relatifs

la curiosité. Tu te rappelles ? Tout est tellement prévu à l'avance, ici, qu'il est impossible d'imaginer la surprise, l'étonnement ou la curiosité. Personne n'a jamais envie

 Le terme aléatoire permet de résumer toute l’information qui n’est pas prise en compte dans la relation linéaire entre Y et X (problèmes de spécifications, approximation de

Donner la formule analytique pour l’intervale des valeurs de c d´etermin´es avec cette confiance.. Sachant que pour une distribution normale a = 1.96 si p(|z| < a) = 0.95, donner

Si l’on accorde qu’aucune idée, ou aucune chose qui ressemble à une idée, ne peut exister dans une substance qui ne perçoit pas, alors il s’ensuit

Les prohibitions de ce genre sont parfaitement applicables, qu'il s'agisse de crédits aux gouver- nements, d'emprunts ou de crédits à court terme. Le danger est que des

C’est de cet « autre chose », souvent évoqué à La Celle-Saint-Cloud 1 , jusqu’à la tombée du soir, qu’il s’agit dans ce poème-hommage au poète après qu’il nous

en état.. IL yaU1~U1euliCas'particulier,oùl'Ac~ufé eû cenfé s'êrre repréfenré.Ians qu'il foit dans les Prifons ; c'eït celui de l'Exoùze dont il eft parlé dans le même Art. 2)

Écrire le nombre 24 sous la forme d’un produit de plusieurs nombres, tous étant premiers.. Certains peuvent éventuellement apparaître