2010-10-01 25 views
2

... rephrasealgorithme d'analyse multi-niveaux

Je voudrais savoir comment mieux analyser les fonctions/conditionals. donc si vous avez quelque chose comme: [if {a} is {12 or 34}][if {b} not {55}] show +c+ [/if][/if] qui est un conditionnel à l'intérieur d'un conditionnel. On dirait que je ne peux pas le faire avec regex seulement.


pour l'instant question originale

J'ai un moyen assez simple d'analyse syntaxique quelques commandes par actionscript.

J'utilise regexp pour trouver des balises, des commandes et des opérandes en utilisant ...

+key_word+ // any text surrounded by + 
[ifempty +val_1+]+val_2+[/ifempty] //simple conditional 
[ifisnot={`true,yes`} +ShowTitle+]+val_3+[/ifisnot] // conditional with operands 

mon algorithme actuel correspond à la balise d'ouverture [**] avec la première balise de fermeture [/**] même si elle ne correspond pas. Ce qui signifie que je ne pouvais pas faire quelque chose comme [ifempty +val_2+][ifnotempty +val_2]+val_3+[/ifnotempty]+val_4+[/ifempty] - en mettant essentiellement un conditionnel à l'intérieur d'un autre.

J'utilise un moyen en ligne de l'analyse syntaxique qui divise la chaîne en un tableau de chaînes en fonction de cette expression rationnelle \[[^\/](?:[^\]])*\](?:[^\]])*\[\/(?:[^\]])*\]

peut-on proposer un algorithme plus robuste avec une convention d'analyse plus robuste/standard? surtout pour as3.

Répondre

2

Les expressions régulières définissent les langues régulières. Les langages réguliers ne peuvent pas avoir de régions de récursion contrainte, mais potentiellement infinie. Une façon de penser à cela est que toutes les langues régulières peuvent être représentées par une machine à états finis. Vous auriez besoin d'un état pour chaque nombre possible de si, mais la machine doit être 'finie', donc votre dans une liaison. Un exemple classique est:

a{n}b{n}, n >= 0 
(meaning n a's, followed by n b's) 

Comme vous analysez chacun un, vous devez aller à un autre Etat (FSMs ont pas de mémoire au-delà de l'état de leur dedans, c'est la seule façon dont ils se souvenaient n pour le match plus tard) . Pour analyser n'importe quel nombre de n, vous auriez besoin d'un nombre infini d'états.

C'est la même situation que dans laquelle vous vous trouvez, une expression régulière peut exprimer un nombre fini d'ifs (bien que cela nécessiterait pas mal de copier-coller), mais pas un nombre infini. Notez cependant que certaines implémentations d'expressions régulières trichent un peu, leur donnant plus de pouvoir que leurs équivalents mathématiques.

Dans tous les cas, le mieux est d'utiliser une méthode d'analyse plus puissante. Un recursive descent parser est particulièrement amusant à mettre en œuvre, et pourrait facilement faire ce dont vous avez besoin. Vous pouvez également regarder dans un analyseur LR, ou construire un analyseur simple en utilisant une pile. En fonction de votre langue, vous pourrez peut-être trouver une bibliothèque d'analyse syntaxique telle que pyparse pour Python ou Boost Spirit pour C++.