Question

Comment parseurs récursifs ascension fonctionnent? Je l'ai écrit un récursive descente moi-même analyseur mais je ne comprends pas LR parseurs tout ce bien. Ce que je trouvés sur Wikipedia n'a ajouté à ma confusion.

Une autre question est pourquoi parseurs récursifs ascension ne sont pas utilisés plus que leurs homologues à base de tables. Il semble que parseurs récursifs ascension ont une plus grande performance globale.

Était-ce utile?

La solution

Le livre de dragon explique très bien comment LR parseurs travail. Il y a aussi Techniques Parsing. Un guide pratique. où vous pouvez lire à ce sujet, si je me souviens bien. L'article de wikipedia (au moins l'introduction) ne va pas. Ils ont été créés par Donald Knuth, et il les explique dans son L'art du volume de programmation informatique 5. Si vous comprenez l'espagnol, il y a une liste complète des livres ici posté par moi. Pas tous que les livres sont en espagnol, que ce soit.

Avant de comprendre comment ils fonctionnent, vous devez comprendre quelques concepts comme le premier, suit et préanalyse. Aussi, je recommande vraiment de comprendre les concepts derrière LL (descendant) avant d'essayer de parseurs comprendre LR (ascendantes) parseurs.

Il y a une famille de parseurs LR, spécialement LR (K), SLR (K) et LALR (K), où K est combien ils ont besoin pour préanalyse travailler. Yacc soutient LALR (1) parseurs, mais vous pouvez faire quelques réglages, pas la théorie basée, pour rendre cela fonctionne avec le genre plus puissant de grammaires.

A propos de la performance, cela dépend de la grammaire en cours d'analyse. Ils exécutent dans le temps linéaire, mais combien d'espace dont ils ont besoin dépend de combien d'États pour construire vous l'analyseur final.

Autres conseils

Je suis personnellement d'avoir du mal à comprendre comment un appel de fonction peut être plus rapide - beaucoup moins « beaucoup plus rapide » qu'une recherche de table. Et je pense que même « beaucoup plus rapide » est insignifiant par rapport à tout le reste qu'un lexer / parser doit faire (lire avant tout et tokenizing le fichier). Je regardais la page de Wikipédia, mais n'a pas suivi les références; l'auteur a fait un profil complet lexer / parser?

Plus intéressant pour moi est le déclin de parseurs déterminés par des tables par rapport à la descente récursive. Je viens d'un milieu C, où yacc (ou équivalent) a été le générateur d'analyseur syntaxique de choix. Quand je suis arrivé à Java, j'ai trouvé une implémentation par des tables (JavaCup), et plusieurs implémentations de descente récursive (JavaCC, ANTLR).

Je pense que la réponse est similaire à la réponse « pourquoi Java au lieu de C »: la vitesse d'exécution est pas aussi importante que la vitesse du développement. Comme indiqué dans l'article de Wikipedia, parseurs déterminés par des tables sont à peu près impossible de comprendre à partir du code (en arrière quand je les utilise, je pouvais suivre leurs actions mais n'aurais jamais été en mesure de reconstituer la grammaire de l'analyseur). descente récursive, par comparaison, est très intuitive (qui est sans doute la raison pour laquelle elle est antérieure par des tables d'environ 20 ans).

L'article de Wikipédia sur récursives ascension références d'analyse syntaxique ce qui semble être le document original sur le sujet ( "Très rapide LR Parsing"). Écumant que le papier effacé quelques choses pour moi. Ce que je remarqué:

  1. Les discussions de papier sur la génération de code d'assemblage. Je me demande si vous pouvez faire les mêmes choses qu'ils font si vous générez au lieu C ou Java code; voir les articles 4 et 5, « récupération d'erreur » et « vérification de débordement de pile ». (Je ne suis pas essayer de FUD leur technique - il pourrait fonctionner bien -. Simplement dire qu'il est quelque chose que vous voudrez peut-être examiner avant de commettre)

  2. Ils comparent leur outil de remontée récursive à leur propre analyseur déterminés par des tables. De la description dans leur section des résultats, il semble que leur analyseur par des tables est « entièrement interprété »; il ne nécessite pas de code généré personnalisé. Je me demande s'il y a un juste milieu où la structure globale est toujours axée sur la table mais vous créez un code personnalisé pour certaines actions pour accélérer les choses.

Le document référencé par la page Wikipedia:

Un autre document sur l'utilisation de génération de code au lieu de table interprétation:

Notez également que l'analyse syntaxique descente récursive n'est pas le meilleur moyen d'analyser langages-grammaire-LL:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top