2010-06-25 4 views
3

Je voudrais créer simple analyseur xml en utilisant bison/flex. Je n'ai pas besoin de validation, commentaires, arguments, seulement <tag>value</tag>, où valeur peut être nombre, chaîne ou autre <tag>value</tag>.Analyseur XML simple dans bison/flex

Ainsi, par exemple:

<div> 
    <mul> 
    <num>20</num> 
    <add> 
     <num>1</num> 
     <num>5</num> 
    </add> 
    </mul> 
    <id>test</id> 
</div> 

Si elle aide, je connais les noms de tous les tags qui peuvent se produire. Je sais combien de sous-étiquettes peuvent être conservées par une étiquette donnée. Est-il possible de créer analyseur de bison qui ferait quelque chose comme ça:

- new Tag("num", 1)   // tag1 
- new Tag("num", 5)   // tag2 
- new Tag("add", tag1, tag2) // tag3 
- new Tag("num", 20)   // tag4 
- new Tag("mul", tag4, tag3) 
... 
- root = top_tag 

Tag & nombre de sous-tags:

  • num: 1 (seule valeur)
  • str: 1 (seulement valeur)
  • ajouter | sub | mul | div: 2 (num | str | tag, num | str | tag)

Pourriez-vous m'aider avec la grammaire à créer AST comme indiqué ci-dessus?

+0

Est-il important d'utiliser un sous-ensemble de XML pour cela?Si votre langage consiste simplement en expressions arithmétiques, je vous conseille de chercher plutôt à analyser les expressions infixes, ce qui vous permettra d'utiliser des chaînes comme '(20 * (1 + 5))/test'. À moins que cela ne soit nécessaire pour une autre raison, XML semble un peu exagéré, surtout si vous écrivez l'analyseur! – shambulator

+0

Les données sont conservées en XML, donc je n'ai pas le choix. – user360872

+0

Toutes mes excuses pour la réponse tardive; Êtes-vous plus proche d'une solution pour cela? Étant donné que vous devez utiliser XML, pourquoi ne pas utiliser une bibliothèque déjà écrite? Avez-vous le choix du langage de programmation? Ou est le but de l'exercice pour écrire un analyseur? Et si oui, devez-vous utiliser un générateur d'analyseur? Pour une grammaire relativement simple comme celle-ci, vous pouvez facilement écrire un analyseur récursif-descendant. – shambulator

Répondre

1

Je ne pense pas que ce soit le meilleur outil à utiliser pour créer un analyseur XML. Si je dois faire ce travail, je le ferai à la main.

Le code Flex contiendra: NUM entier correspondant dans cet exemple. STR correspond à une chaîne qui ne contient pas de '<' ou de '>'. STOP correspond à toutes les étiquettes de fermeture. COMMENCER les étiquettes de début de correspondance.

<\?.*\?> { ;} 
<[a-z]+> { return START; } 
</[a-z]+> { return STOP; } 
[0-9]+ { return NUM; } 
[^><]+ { return STR; } 

Code Bison ressemblera

%token START, STOP, STR, NUM 
%% 
simple_xml : START value STOP 
; 
value : simple_xml 
| STR 
| NUM 
| value simple_xml 
; 
+0

Puisque toutes les balises XML correspondront à votre premier motif, elles se déclencheront toujours pour elles et vous ne verrez jamais un START ou un STOP. Vous devez déplacer ce motif après les modèles START/STOP. –

+1

Le premier motif ne correspondra qu'à un jeton commençant par "", je ne comprends pas pourquoi START ou STOP vont correspondre. "<\?" est équivalent à "<[?]" et correspond à " VGE

+0

Pourquoi écrire un parseur grammatical à la main alors qu'il existe de nombreux outils fiables utilisés depuis des décennies? Ces outils sont robustes et ont été débogués par des milliers d'utilisateurs. Vous ne serez pas capable de créer un meilleur analyseur à la main. C'est un conseil terrible. – shrewmouse

4

Pour vos besoins, je pense que le yax system fonctionnerait bien. A partir du fichier README:

Le but du projet yax est de permettre l'utilisation de YACC (Gnu Bison actuellement) pour analyser/traiter des documents XML.

Le logiciel clé pour atteindre l'objectif ci-dessus consiste à fournir une bibliothèque capable de produire un flux de jeton lexical XML à partir d'un document XML.

Ce flux peut être encapsulé pour créer une instance de yylex() afin d'envoyer des jetons à une grammaire Bison pour analyser et traiter le document XML.

En utilisant le flux plus une grammaire de Bison, il est possible d'effectuer au moins les types d'activités suivants.

  1. Valider les documents XML,
  2. Parse directement des documents XML pour créer des structures de données internes,
  3. arbres Construct DOM.