Maison >développement back-end >C++ >Comment puis-je détecter de manière fiable les boucles C « for » et « while » se terminant par un point-virgule ?

Comment puis-je détecter de manière fiable les boucles C « for » et « while » se terminant par un point-virgule ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-15 18:09:10226parcourir

How Can I Reliably Detect C

Détection des boucles C "for" et "while" avec terminaison par un point-virgule

Correspondance des boucles C for ou while qui se terminent par un point-virgule -colon utiliser une expression régulière peut être difficile. Une approche courante consiste à créer un groupe nommé pour faire correspondre les sous-chaînes équilibrées, en garantissant que le corps entier de la boucle est contenu entre parenthèses.

Cependant, cette méthode échoue lorsque le corps de la boucle inclut un appel de fonction, rompant ainsi l'équilibre. Une approche simplifiée utilisant une fonction non regex peut résoudre ce problème.

Fonction personnalisée pour la correspondance de boucle

La fonction personnalisée suivante prend une chaîne d'entrée et recherche un for ou boucle while suivie d'un point-virgule :

def find_loop_and_semicolon(string):
    pos = string.find('(') + 1
    open_br = 0
    while open_br >= 0:
        char = string[pos]
        if char == '(':
            open_br += 1
        elif char == ')':
            open_br -= 1
        pos += 1
    return pos if open_br == 0 and string[pos] == ';' else -1

La fonction :

  1. Définit le compteur de position pos à la position juste avant le crochet d'ouverture de la boucle.
  2. Initialise un compteur de crochet ouvert open_br à 0.
  3. Itère dans la chaîne , en incrémentant open_br pour ouvrir les parenthèses et en le décrémentant pour la fermeture parenthèses.
  4. Lorsque open_br revient à 0, la position de la parenthèse fermante est atteinte.
  5. Vérifie si le caractère à la position suivante est un point-virgule pour confirmer terminaison de boucle.
  6. Renvoie pos si les deux conditions sont remplies ou -1 sinon.

Utilisation

string = "for (int i = 0; i < 10; doSomethingTo(i));"
result = find_loop_and_semicolon(string)
if result != -1:
    print("Loop found and terminated with a semi-colon.")
else:
    print("No matching loop found.")

Avantages

  • Simplicité : La fonction est facile à comprendre et implémenter.
  • Flexibilité : Il gère les boucles avec des corps complexes, y compris les appels de fonction.
  • Aucune surcharge d'expression régulière : Évite la surcharge potentielle et la complexité de expressions régulières.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn