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!
Merci beaucoup pour votre réponse et le lien vers des ressources. Cela m'a beaucoup aidé. – JoshuaBoshi
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''' –
@StevePeak Je pense que vous pourriez vouloir vérifier ce lien http://stackoverflow.com/questions/9420400/python-parser-for-python-like-language – JoshuaBoshi