2009-02-05 20 views
10

J'ai besoin de lire et d'écrire des flux d'octets à envoyer sur différents réseaux pour communiquer avec des compteurs électriques intelligents. Il existe une norme ANSI, ANSI C12.19, qui décrit le format de données binaires. Bien que le format de données ne soit pas trop complexe, la norme est très grande (plus de 500 pages) en ce sens qu'elle décrit de nombreux types distincts. La norme est entièrement décrite par une grammaire EBNF. J'envisage d'utiliser ANTLR pour lire la grammaire EBNF ou une version modifiée de celle-ci et créer des classes C# qui peuvent lire et écrire le flux d'octets.ANTLR est-il un outil approprié pour sérialiser/désérialiser un format de données binaire?

Est-ce un bon usage d'ANTLR?

Si oui, que dois-je faire pour pouvoir utiliser ANTLR 3.1? De la recherche dans les archives du groupe de discussion, il semble que je devrais mettre en œuvre un nouveau flux qui peut lire des octets au lieu de caractères. Est-ce tout ou devrais-je implémenter un dérivé de Lexer?

Si ANTLR peut m'aider à lire/analyser le flux, cela peut-il m'aider à écrire le flux?

Merci.

dan Finucane

Répondre

10

Ce sujet apparaît de temps en temps sur la liste de diffusion ANTLR. La réponse est généralement non, car les formats de fichiers binaires sont très réguliers et ne valent pas la surcharge.

+2

Le sujet des standards avec 500 pages (?!) Revient très souvent sur la liste de diffusion ANTLR? Le surdébit de la machine devrait être important pour compenser l'avantage d'utiliser un grand générateur d'analyseur syntaxique pour appliquer correctement la norme. –

4

Il me semble que d'avoir une grammaire vous donne une jambe énorme vers le haut.

ANTLR 3.1 possède des fonctionnalités de génération de code et de StringTemplate distinctes de l'analyse/lexage, ce qui vous permet de décomposer le problème de cette façon.

On dirait un gagnant pour moi, ça vaut le coup d'essayer.

16

Vous pouvez jeter un oeil à Ragel. C'est un compilateur/lexeur de machine d'état qui est utile pour implémenter des protocoles sur le réseau. J'ai lu des rapports qu'il génère du code très rapide. Si vous n'avez pas besoin d'un analyseur et d'un moteur de gabarit, ragel a moins de frais généraux que ANTLR. Si vous avez besoin d'un analyseur complet, d'AST et d'un bon support de moteur de gabarit, ANTLR pourrait être un meilleur choix.

+0

Je n'avais jamais entendu parler de Ragel auparavant. Cela semble intéressant et peut fonctionner pour mon problème. Merci. –

+1

Si vous avez besoin de règles récursives, vous risquez de rencontrer des problèmes avec Ragel. Sinon, ce peut être un excellent outil pour votre travail. –