7
votes

L'algorithme de courage peut-elle analyser les expressions régulières de POSIX?

au premier coup d'œil, le Algorithme de courage semble applicable à Posix Expression régulière Analysing, mais depuis Je n'ai pas beaucoup d'expérience (ni de fond théorique) dans les analyseurs d'écriture, j'aimerais demander à ce que vous puissiez demander à ce que vous ne soyez à mi-chemin et d'écrire quelque chose que de rester coincé à mi-chemin.

Peut-être une version plus sophistiquée de la question est la suivante: quelle est une bonne énoncé formelle de la classe de problèmes que l'algorithme de coureurs change peut être appliqué à?

Clarification: Cette question indique si vous pouvez analyser POSIX RE SYNTAX dans un arborescence de syntaxe abstraite à l'aide des principes de base de l'algorithme de dérivation, non si vous pouvez utiliser des expressions régulières pour mettre en œuvre l'algorithme de dérivation. Désolé je n'étais pas assez clair indiquant que commencer!


2 commentaires

Lorsque vous parlez de l'analyse d'une regex, voulez-vous dire que la chaîne décrivant la langue régulière? Ou voulez-vous dire l'exécution de l'automate d'état fini qu'il représente? Ou autre chose?


Je veux dire construire une ast représentant l'expression régulière. Conversion de cet AST dans un automate pour faire correspondre la regex est un autre problème, je sais.


4 Réponses :


-1
votes

Je dirai que la réponse à votre question est "Non, vous ne pouvez pas implémenter l'algorithme de la cour de dérivation en utilisant une expression régulière". Ceci est pour la même raison pour laquelle vous ne pouvez pas analyser HTML arbitraire en utilisant des expressions régulières. Qui se résume à ceci:

Les expressions régulières n'ont pas de pile. Étant donné que l'algorithme de la cour de la courage s'appuie sur une pile (appuyer sur les opérandes POP et POP lorsque vous convertissez de l'infixe en RPN), les expressions régulières ne disposent pas de la "puissance" calculée pour effectuer cette tâche.

Ce brillant sur de nombreux détails, mais une "expression régulière" est une façon de définir une langue régulière. Lorsque vous "utilisez" une expression régulière, vous demandez à l'ordinateur de dire: "Regardez un corps de texte et dites-moi si une de ces chaînes est dans ma langue. La langue que j'ai définie en utilisant une expression régulière." Je vais pointer sur Cette excellente réponse que vous et tout le monde en train de lire cela devrait uppote Pour plus d'informations sur les langues ordinaires.

Alors maintenant, vous avez besoin d'un concept mathématique pour augmenter les "langues ordinaires" afin de créer des langues plus puissantes. Si vous deviez caractériser l'algorithme de coureurs de courage comme une réalisation d'un modèle de puissance informatique, vous pourriez dire que l'algorithme serait décrit comme un grammaire sans contexte (que savez-vous, ce lien utilise un arbre d'analyse d'expression comme exemple.) A Automate Push-Down . Quelque chose avec une pile.

Si vous êtes moins que familier avec la théorie des automates et les cours de complexité, ces articles Wikipedia ne sont probablement pas aussi utiles sans les expliquer de la terre.

Le point d'être, vous pourrez peut-être utiliser Regex pour aider à rédiger une cour de la courage. Mais les regex ne sont pas très bons pour faire des opérations qui ont une profondeur arbitraire que ce problème a. Donc, je ne passerais pas trop de temps à descendre de l'avenue Regex pour ce problème.


3 commentaires

Je pense que vous avez mal interprété ma question. Je ne demande pas à mettre en œuvre une cour de piste avec des expressions régulières. Je demande s'il est possible d'analyser une expression régulière (dans une AST) à l'aide d'une variante de l'algorithme de dérivation.


Quoi qu'il en soit, vous avez écrit une bonne réponse, même si vous avez une question différente, j'espère que vous ne le supprimez pas!


@PoundIfdef, voici la question hommage à votre belle réponse. hint-indice: Stackoverflow.com/Questtions/9298076/...



0
votes

Je ne vois pas pourquoi cela ne conviendrait pas. En regardant un code ancien, il semble que j'ai utilisé une stratégie d'analyse complètement différente pour mon dernier analgésière Regexp, cependant (essentiellement une promenade à partir du départ, construisant la représentation d'automaton résultante au fur et à mesure que vous allez, avec une question de look-up et récursif des appels à mettre en œuvre le regroupement d'expressions régulières).


0 commentaires

2
votes

Je suis assez sûr que ça peut. Si vous regardez le package d'expression régulier de Henry Spencer:

Regexp.shar.z

Quelle était la base des expressions régulières de Perl, vous remarquerez qu'il décrit le programme comme étant dans "forme normale de chemin de fer".


0 commentaires

1
votes

Je pense que vous auriez des problèmes car différents personnages ont des significations différentes dans différents contextes, par exemple xxx

^ a deux significations différentes et donc le < Code> - . Je pense que je choisirais un analyseur de descente récursif.


5 commentaires

C'est ce que j'ai pensé au début, mais s'il est possible de déterminer efficacement le contexte de l'état de la pile / de la file d'attente, le traitement de ces personnes spéciales ne devrait pas être une grosse affaire, non?


Au fait, [^ a-z] et [asd -] sont les deux jetons individuels. Il n'y a aucune raison de les traiter comme quelque chose de plus complexe au niveau de l'analyseur. Ils ont leur chance d'être spéciaux quand il vient le temps de construire fa.


@R .. Je ne dis pas que c'est impossible, voire vraiment très difficile, mais dès que vous vous trouvez à marcher sur la pile, vous allez probablement mal à la mauvaise manière. Je pense juste que ce serait plus propre comme un analyseur de descente récursif.


@R ..: Si vous vous jetez de la jeton à ce niveau, mon problème disparaît probablement et l'algorithme de bourrage devient raisonnablement simple à mettre en œuvre.


Ce que j'aime à propos de la chanvre, c'est que la performance et l'utilisation de la mémoire très prévisible. Tout est dans un seul tampon ( 4 * SHLEN (REGEX) devrait suffire) et des cas d'échecs sont une échelle d'allocation purement initiale ou une syntaxe invalide. Il n'y a aucune possibilité d'utilisation de la pile runnaway ou d'avoir à revenir en arrière et à libérer une échec atténuée partiellement construite.