13Fermer15
BrunniLe 15/04/2009 à 23:39
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 ^^