Nous allons utiliser ici l'outil Grammophone développé à l'université de Calgary.
Les symboles terminaux commencent par une lettre minuscule, un chiffre ou une ponctuation (~ ! @ # * ( ) _ + ' ; : / ?). Les variables commencent par une majuscule. C'est facile, c'est presque la convention contraire d'ANTLR !
La variable de la partie gauche d'une règle est séparée de sa production
en partie droite par une flèche ->
, formée du signe moins suivi du signe supérieur.
Une règle se termine par un point et on peut donner des parties droites alternatives en les séparant par une barre verticale.
Les symboles sont séparés par un espace.
L'axiome apparaît toujours en partie gauche de la première règle.
On a même droit aux commentaires multi-lignes encadrés
par /*
et */
.
Attention : le caractère '-' est interdit sauf pour le symbole de dérivation '->'. Bien respecter les espaces entre symboles, car seul l'espace est séparateur.
S -> a A B e. A -> A b c | b. B -> d.
Nous reprenons ici l'exemple du cours pour la construction de table d'analyse LL(1)
S -> X Y. X -> a X b| . Y -> c Z | Z e. Z -> d c Z | .
Observez la table d'analyse LL(1) pour cette grammaire construite par l'outil.
Considérons la grammaire suivante qui n'est pas LL(1).
S -> a A B e. A -> A b c | b. B -> d.
S -> ( L ) | ( ) | at. L -> S | L S.
S -> B b | C c. B -> a b. C -> a c.
On va reprendre maintenant des grammaires reconnaissant des expressions arithmétiques.
Expression -> Somme. Somme -> Facteur plus Somme | Facteur moins Somme | Facteur. Facteur -> id | moins Facteur.
Booleen -> Disjonction. Disjonction -> Conjonction ou Disjonction | Conjonction. Conjonction -> Negation et Conjonction | Negation. Negation -> Comparaison | non Negation. Comparaison -> Expression OpComparaison Expression. OpComparaison -> inf | sup | equ. Expression -> Somme. Somme -> Facteur plus Somme | Facteur moins Somme | Facteur. Facteur -> id | moins Facteur.
Facteur -> ( Expression ) .
Negation -> ( Booleen ).D'où vient le problème ?
Reprenez le premier exemple de grammaire non LL(1)
S -> a A B e. A -> A b c | b. B -> d.
S -> a S b | a b.
ab
et abb
.
Instruction -> si condition alors Instruction | si condition alors Instruction sinon Instruction | expression .
si condition alors si condition alors expression sinon expression
S -> V assign E | id. V -> id. E -> V | num.
id
id assign num
S -> a S b | a b.Cela donne en syntaxe ANTLR :
grammar ll2; start : s EOF; s : 'a' s 'b' | 'a' 'b' ;
ll2.g
est-elle autorisée par ANTLR ?
A -> C | B. C -> a C a | b. B -> a B | c.
grammar lr0; a : c | b ; c : 'a' c 'a' | 'b' ; b : 'a' b | 'c' ;