Y at-il analyseur Combinator bibliothèque est dans F # connue qui peut analyser les fichiers binaires (pas de texte)?

StackOverflow https://stackoverflow.com/questions/7800586

Question

Je connais quelques-unes des bases de fparsec, mais il semble être orienté vers des fichiers texte ou flux.

Existe-t-il une autre bibliothèque F # est capable d'analyser efficacement les fichiers binaires? Ou peut fparsec être facilement modifié pour fonctionner efficacement avec des flux binaires?

Était-ce utile?

La solution

Vous pouvez être intéressé par Pickler combinators . Ce sont un peu comme combinateurs analyseur, mais sont plus concentrés à des formats binaires plus simples ( Picklers vous permettent de produire des données binaires et unpicklers les analyser). Il y a un article tout à fait lisible sur le idée (PDF) par Andrew Kennedy (l'auteur des unités de mesure).

Je n'ai pas beaucoup d'expérience avec ces moi-même, mais je viens de réaliser qu'il peut être pertinent pour vous. L'idée est utilisée dans le compilateur F # pour générer des ressources binaires (comme les citations stockées dans les ressources). Bien que, je ne suis pas sûr si le F # mise en œuvre du compilateur est tout bon (il est une de ces choses de premiers jours du compilateur F #).

Autres conseils

Le problème avec le travail avec des flux binaires est pas un problème d'analyse syntaxique en tant que tel, il est un problème de lexing. Le lexer est ce qui transforme les données brutes aux éléments que l'analyse syntaxique peut gérer.

la plupart des systèmes d'analyse syntaxique a quelques problèmes qui vous permet de fournir votre propre lexer, et si tel est le cas, vous pouvez, dans l'idéal, facilement écrire un lexer compatible qui fonctionne sur votre flux binaire.

Le problème, cependant, est que la plupart des systèmes et l'analyse syntaxique Lexing aujourd'hui sont eux-mêmes créés à partir d'un outil de niveau supérieur. Et cet outil le plus probable est pas conçu pour fonctionner avec des flux binaires. Autrement dit, ce n'est pas pratique pour vous spécifiez les jetons et la grammaire du flux binaire qui peut être utilisé pour créer les parseurs suivantes et lexer. En outre, on appuie probablement pas que ce soit pour les concepts de niveau supérieur de nombres binaires multi octets (de courts métrages, longs, flotteurs, etc.) que vous êtes susceptible de rencontrer dans un flux binaire, ni pour l'analyseur généré pour éventuellement bien travailler sur eux si vous avez réellement besoin de travailler sur leur valeur réelle, encore une fois parce que les systèmes sont principalement conçus pour les jetons à base de texte, et le moteur d'exécution sous-jacent gère les détails de la conversion de ce texte, il quelque chose que la machine peut utiliser (telles que des séquences de chiffres ascii dans réelles des nombres entiers binaires).

Cela dit, vous pouvez utiliser probablement en fait la section analyse syntaxique de l'outil, car parseurs travaillent plus sur des jetons abstraits qui leur sont alimentés par le lexer. Une fois que vous créez votre grammaire, à un niveau symbolique, vous devez refaire le lexer pour créer les jetons de problème à partir du flux binaire à l'alimentation pour l'analyseur.

Ceci est en fait bien, parce que l'analyseur a tendance à être beaucoup plus compliqué que le lexer de base, de sorte que la boîte à outils gérerait une grande partie de la « dur » pour vous. Mais vous auriez encore besoin pour faire face à la création de votre propre lexer et l'interface correctement à l'analyseur généré. Pas une tâche insurmontable, et si la grammaire est d'une complexité réelle, d'une valeur probable que votre effort à long terme.

Si c'est tout simplement mieux la plupart du temps simple, alors vous risquez de ce faire vous-même à la main. Du haut de ma tête, il est difficile d'imaginer une grammaire binaire difficile, car le principal point de vente d'un format binaire est qu'il est beaucoup plus proche de la machine, ce qui est en contradiction avec le texte que la plupart des parseurs sont conçus pour fonctionner avec. Mais je ne connais pas votre cas d'utilisation.

Mais considérez le cas d'un désassembleur. C'est un lexer simple qui peut être en mesure de sous position à un haut niveau les différents types d'instruction (tels que les opérandes qui ont pas d'arguments, ceux qui prennent un seul octet comme un argument, ou un mot), et les aliments qui à un analyseur peut ensuite être utilisé pour convertir les instructions pour leurs mnémoniques et opérandes dans la syntaxe normale assembleur, ainsi que gérer les références d'étiquettes et autres.

Il est un cas artificiel, comme un désassembleur typiquement ne sépare pas les lexing et les phases d'analyse syntaxique, il est généralement pas assez compliqué à la peine, mais il est une façon de voir le problème.

Addenda:

Si vous avez suffisamment d'informations pour convertir le flux binaire au texte à l'alimentation du moteur, alors vous vous avez suffisamment d'informations pour au lieu de créer du texte, vous pouvez créer des jetons réels que l'analyseur voudrait voir le lexer .

Cela dit, ce que vous pouvez faire est de prendre votre format de texte, utiliser comme base pour votre outil d'analyse et de grammaire, et l'ont créer les machines à analyseurs lexicaux et syntaxiques pour vous, puis, à la main, vous pouvez tester votre analyseur et son traitement en utilisant des « tests de texte ».

Mais quand vous arrivez à le lire le fichier binaire, plutôt que de créer du texte pour être ensuite lexed et analysable, créez simplement les jetons que le lexer créerait (ceux-ci devraient être des objets simples) et pomper l'analyseur directement. Cela vous permettra d'économiser l'étape LEX et vous faire gagner du temps de traitement.

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