2012-07-12 2 views
3

quelqu'un peut-il m'aider à écrire des règles de grammaire correctes pour les instructions if imbriquées? Dans ma langue, je suis capable d'écrire des constructions comme ceci:PLY yacc analyse IF-ELSE IF-ELSE instructions imbriquées

(IF CONDITION) 
    some statements 
    (IF CONDITION) 
     some statements 
    (ELSE IF CONDITION) 
     some statements 
    (ELSE IF CONDITION) 
     some statements 
    (ELSE IF CONDITION) 
     some statements 
    (ELSE) 
     some statements 
    (END) 
    some statements 
(ELSE IF CONDITION) 
    some statements 
(ELSE) 
    some statements 
(END) 

je l'ai écrit lexer si parenthèse gauche et à droite sont RULE_OPEN et RULE_CLOSE jetons, « IF » est IF jeton, « END » END jeton "ELSE" est ELSE jeton, "CONDITION" est CONDITION jeton. Supposons que "certaines instructions" peuvent être tout ce qui est autorisé dans ma langue (comme dans le langage de programmation commun). Il est important qu'il soit possible d'imbriquer des instructions IF éventuellement infiniment.

J'espère que c'est clair, s'il vous plaît laissez-moi savoir si je l'ai mal expliqué.

Peu importe comment j'essaie. Je suis toujours en train de changer/réduire les conflits et l'analyseur n'accepte pas les entrées correctes.

Même si, j'ai écrit avec succès des règles sans else-if. Lorsque j'ajoute des règles pour else-if, le code commence à être très compliqué pour moi.

Ci-dessous mon approche sucessfull sans autre, si une partie (I liste uniquement des règles pertinentes):

statements: statement 

statements: statements statement 

statement: code 
| data_out 
| rule 

rule: inline_if_statement 
| block_if_statement 

block_if_statement: RULE_OPEN IF CONDITION RULE_CLOSE statements RULE_OPEN END RULE_CLOSE 

block_if_statement: RULE_OPEN IF CONDITION RULE_CLOSE statements block_else_statement 

block_else_statement: RULE_OPEN ELSE RULE_CLOSE statements RULE_OPEN END RULE_CLOSE 

block_else_statement: empty 

empty : 

Je pense que ce problème très commun dans l'analyse syntaxique et j'espère que quelqu'un ici a déjà résolu: -) Merci de votre aide!

Répondre

4

Généralement, un conflit de décalage-décalage unique pour un langage qui a une clause ELSE optionnelle peut être toléré. Pete Jinks offre un couple de alternative formulations that can resolve the conflict.

Une stratégie pour spécifier ELSE-IF constructions: traiter cela comme un autre bloc de répétition récursive défini:

running_else_if_statement : RULE_OPEN IF CONDITION RULE_CLOSE statements else_if_blocks 
    RULE_OPEN ELSE RULE_CLOSE statements RULE_OPEN END RULE_CLOSE 
          ; 

else_if_blocks : else_if_block 
       | else_if_blocks else_if_block 
       ; 

else_if_block : RULE_OPEN ELSE_IF CONDITION RULE_CLOSE statements 
       ; 

Comme une note de côté sur le style: la plupart des praticiens se combinent régulièrement toutes les alternatives pour une production avec des tuyaux, la façon dont vous avez fait avec

statement : code 
      | data_out 
      | rule 
      ; 

Il est source de confusion pour lire:

statements : statement 
      ; 

statements : statements statement 
      ; 

La plupart préfèrent:

statements : statement 
      | statements statement 
      ; 
+0

Merci beaucoup pour votre réponse et le lien vers des ressources. Cela m'a beaucoup aidé. – JoshuaBoshi

+0

Comment accompliriez-vous ceci en utilisant seulement des espaces pour incorporer des blocs de code: exemple '' 'si expression \ n retourner ceci \ n else \ n return that''' –

+0

@StevePeak Je pense que vous pourriez vouloir vérifier ce lien http://stackoverflow.com/questions/9420400/python-parser-for-python-like-language – JoshuaBoshi