([]{<<>>}([(){<>}]))
" dans
la grammaire ci-dessus :
S |
![]() |
EPA
= Expression complètement PArenthésée) EPA -> Id
EPA -> Cte
EPA -> '('EPA Op EPA')'
(
( x * 3 ) -
( ( y
+ z ) - 4 )
)
![]() Les quatre sortes de traits dans l'arbre symbolisent les quatre sortes de parenthèses dans le langage. |
![]() |
v
(symbole terminal) une variable générique, qui pourra être x
,
y
, z
, etc,i
(autre symbole
terminal) un entier générique qui pourra être... n'importe quel entier
! +
et *
.
Exemple : "x + y + z * 2
"
La grammaire
|
![]() L'arbre de
dérivation du mot
|
![]() L'arbre de
l'expression
(arbre syntaxique) |
x + y + z * 2
"
La grammaire
non-ambiguë |
![]() L'arbre de
dérivation du mot
" x + y + z * 2 " |
![]() L'arbre de
l'expression
(arbre syntaxique) |
S -> AB
S -> C
A -> aAb
A -> ab
B -> cBd
B -> cd
C -> aCd
C -> aDd
D -> bDc
D -> bc
aabbccdd
S -> AB ->
aAbB-> aabbB
->
aabbcBd -> aabbccdd
S -> C -> aCd -> aaDdd
-> aabDcdd ->
aabbccdd
()()()
"
formé de 3 systèmes indécomposables :
|
![]() |
a+b+c+d
" (((a+b)+c)+d)
", a-b-c-d
" se lit "(((a-b)-c)-d)
".Somme = Somme [+|-] Terme | Terme ;
"Somme : Terme
[+|-]
Somme | Terme ;
"
qui aboutirait à la décomposition à droite "(a-(b-(c-d)))
"
].a*b*c*d
"
s'analyse
comme une série de multiplications de deux facteurs,(((a*b)*c)*d)
", a/b/c/d
"
-> "(((a/b)/c)/d)
" et non "(a/(b/(c/d)))
"
!Produit : Produit
[*|/] Facteur | Facteur ;
p =
p+2; s = s+p; n := n-1;
p = p+2; {s =
s+p; n := n-1;}
".SEQINST -> INST
SEQINST -> INST SEQINST
![]() Arbre de dérivation |
![]() Arbre syntaxique |
La grammaire des expressions a fait l'objet dans le passé d'études très approfondies.
C'est que les mathématiciens avaient en la matière des habitudes séculaires, auxquelles ont dû se plier les concepteurs de langages de programmation,
contrairement aux autres structures des langages pour lesquelles les programmeurs ont pu en faire à leur tête.
Il en résulte un certain nombre d'acquis techniques qu'il convient de bien comprendre car ils servent de modèles dans beaucoup de situations.
Nous nous limitons ici à des expressions à deux opérateurs binaires, l'addition et la multiplication (sauf dans notre dernier exemple).
Nous adoptons les mêmes conventions que précédemment pour les variables et les constantes.
|
++xy*z2 |
![]() |
![]() |
|
xy+z2*+ |
![]() |
![]() |
|
((x*3)-((y+z)-4)) |
![]() |
![]() |
a+b*c
" se lit "a+(b*c)
"
et non "(a+b)*c
"
|
x*3-(y+z-4) |
![]() |
![]() |
x^2
"
pour "x2
".x^2^3
" se lit "x^(2^3
)"
pour "x8
" et
non "(x^2)^3
" pour "x6
"
qu'on écrirait de préférence "x^(2*3)
".
|
x+y*2^k^(3*p+1) |
![]() |
![]() |