
J'ai implémenté une analyse descendante. En fait pour résumer je vous mets une liste des règles que j'ai définies:
PROG => (DECLARE L_DECL | e) BEGIN (L_INST | e) END L_DECL => DECL (L_DECL | e) DECL => ID (, ID)* DEUXPOINTS TYPE POINTVIRGULE L_INST => INST (L_INST | e) INST => I_ASSIGNEMENT | I_SI | I_TANTQUE I_ASSIGNEMENT => ID OP_ASSIGNEMENT EXPR POINTVIRGULE I_SI => SI COND ALORS INST (SINON INST | e) I_TANTQUE => TANTQUE COND INST EXPR => (CTE_ENTIERE | ID) (OP_MATH EXPR | e) | '(' EXPR ')' COND => EXPR OP_COMPARAISON EXPR TYPE = ID
(j'ai remplacé epsilon par e parce que yN n'aime pas). Pourriez-vous me confirmer que ma grammaire est bien LL(1) jusqu'ici? Même si plusieurs règles de productions commencent par le même jeton elles se différencient par le contexte: par exemple on n'a jamais (DECL | I_ASSIGNEMENT).
Maintenant mon souci c'est pour gérer les cas où on déclare des tuples ou des tableaux comme en Ada/Pascal:
-- Cas #1: pas géré par mon prog, juste pour info a: array (1..3) of integer := (1, 2, 3); -- Cas #2: une structure ou un array pré-déclaré et contraint b: couleur := (255, 192, 0, 255);
Dans le cas 1 ça va encore, mais dans le cas 2 je n'arrive pas à écrire la règle de production pour ce qui est entre parenthèses. En effet, cela commence exactement comme une expression, mais ce n'est plus tard qu'elle s'en différencie...

Une solution que je vois c'est de déterminer si le type fourni est un tableau et de modifier la suite de la règle de production en conséquence, mais c'est plutôt bourrin et pas très flexible... (imaginons qu'on n'utilise pas une descente récursive codée en dur, mais cette fois un parseur LL justement, ou autre)
Quelqu'un pourrait-il m'aider svp?
