Wééééééééé!
J'ai pu générer un arbre syntaxique pour le programme suivant avec ma grammaire infâme:
declare
rouge, vert, jaune, magenta: RGB;
debut
rouge = (255, 0, 0);
vert = (0, 255, 0);
jaune = (rouge + vert);
magenta = -rouge;
display(rouge);
display(rouge.R);
si vert.R == 0 alors vert.R = 127 sinon vert.R = 255;
tantque rouge.R < 255 inc(rouge.R);
fin
Figure 1: code
PROG => [DECLARE L_DECL] BEGIN [L_INST] END
L_DECL => DECL [L_DECL]
DECL => ID {VIRGULE ID} DEUXPOINTS TYPE_SCALAIRE [OP_AFFECTATION EXPR] POINTVIRGULE
L_INST => INST [L_INST]
INST => INST_SIMPLE POINTVIRGULE
INST_SIMPLE => I_AFFECTATION_OU_APPEL | I_SI | I_TANTQUE
I_AFFECTATION_OU_APPEL => ID {POINT ID} (TUPLE | OP_AFFECTATION EXPR)
I_SI => SI COND ALORS INST_SIMPLE [SINON INST]
I_TANTQUE => TANTQUE COND INST_SIMPLE
EXPR => [OP_UNAIRE] (CTE_ENTIERE | ID [TUPLE | {POINT ID}] | TUPLE) [OP_BINAIRE EXPR]
(note: ID [TUPLE] pour un appel de fonction)
TUPLE => '(' EXPR {VIRGULE EXPR} ')'
COND => EXPR OP_COMPARAISON EXPR
Figure 2: grammaire infâme
PROG
motDeclare: declare
L_DECL
DECL
identifiant: rouge
virgule: ,
identifiant: vert
virgule: ,
identifiant: jaune
virgule: ,
identifiant: magenta
deuxPoints: :
identifiant: RGB
pointVirgule: ;
motDebut: debut
L_INST
INST
INST_SIMPLE
I_AFFECTATION_OU_APPEL
identifiant: rouge
assignement: =
EXPR
TUPLE
parenthèseOuvrante: (
EXPR
constanteEntière: 255
virgule: ,
EXPR
constanteEntière: 0
virgule: ,
EXPR
constanteEntière: 0
parenthèseFermante: )
pointVirgule: ;
INST
INST_SIMPLE
I_AFFECTATION_OU_APPEL
identifiant: vert
assignement: =
EXPR
TUPLE
parenthèseOuvrante: (
EXPR
constanteEntière: 0
virgule: ,
EXPR
constanteEntière: 255
virgule: ,
EXPR
constanteEntière: 0
parenthèseFermante: )
pointVirgule: ;
INST
INST_SIMPLE
I_AFFECTATION_OU_APPEL
identifiant: jaune
assignement: =
EXPR
TUPLE
parenthèseOuvrante: (
EXPR
identifiant: rouge
plus: +
EXPR
identifiant: vert
parenthèseFermante: )
pointVirgule: ;
INST
INST_SIMPLE
I_AFFECTATION_OU_APPEL
identifiant: magenta
assignement: =
EXPR
moins: -
identifiant: rouge
pointVirgule: ;
INST
INST_SIMPLE
I_AFFECTATION_OU_APPEL
identifiant: display
TUPLE
parenthèseOuvrante: (
EXPR
identifiant: rouge
parenthèseFermante: )
pointVirgule: ;
INST
INST_SIMPLE
I_AFFECTATION_OU_APPEL
identifiant: display
TUPLE
parenthèseOuvrante: (
EXPR
identifiant: rouge
point: .
identifiant: R
parenthèseFermante: )
pointVirgule: ;
INST
INST_SIMPLE
I_SI
motSi: si
COND
EXPR
identifiant: vert
point: .
identifiant: R
égale: ==
EXPR
constanteEntière: 0
motAlors: alors
INST_SIMPLE
I_AFFECTATION_OU_APPEL
identifiant: vert
point: .
identifiant: R
assignement: =
EXPR
constanteEntière: 127
motSinon: sinon
INST_SIMPLE
I_AFFECTATION_OU_APPEL
identifiant: vert
point: .
identifiant: R
assignement: =
EXPR
constanteEntière: 255
pointVirgule: ;
INST
INST_SIMPLE
I_TANTQUE
motTantQue: tantque
COND
EXPR
identifiant: rouge
point: .
identifiant: R
plusPetit: <
EXPR
constanteEntière: 255
INST_SIMPLE
I_AFFECTATION_OU_APPEL
identifiant: inc
TUPLE
parenthèseOuvrante: (
EXPR
identifiant: rouge
point: .
identifiant: R
parenthèseFermante: )
pointVirgule: ;
motFin: fin
Figure 3: arbre généré
=> next step: analyseur sémantique, même si j'ai pas encore vraiment compris ce que je vais faire là dedans ni ce que je vais générer ^^