Discussion:
conversor xml a json con bison y flex
Gonzalo Aguirre
2014-01-07 15:15:08 UTC
Permalink
Hola colisteros/as,
estoy en medio de un conversor de xml a json, o mejor dicho parte de la
gramática de XML, en un principio pensé que metiendo la gramática del XML
en bison y flex sería una tarea medianamente fácil, pero cuando me puse a
hacer los primeros tests me acepta y convierte cadenas triviales como:

<e /> -----> {"e":null}
<e>texto</e> -----> {"e","texto"}

pero otras igual de triviales como:

<e>texto</e><e>texto</e>

me da error de sintaxis, si meto cualquier signo [ \t\n] no hay problema.

Bueno el tema es que me está haciendo dudar que sea la mejor forma de hacer
la conversión (ya sé que existen un montón de conversores pero lo tengo que
hacer y el lenguaje tiene que ser C), la otra alternativa es utilizar una
librería XML para navegar por la cadena de entrada, pero se me ocurre más
complicado.

Alguien tiene un par de tips de bison para solucionar el problema de manera
rápida o se le ocurre por dónde puedo tirar para no morir en el intento?

Gracias de antemano :D
--
GA
Alejandro Vargas
2014-01-08 08:24:12 UTC
Permalink
Post by Gonzalo Aguirre
<e>texto</e><e>texto</e>
me da error de sintaxis, si meto cualquier signo [ \t\n] no hay problema.
Pero, eso es válido en XML? Al aparecer más de una vez no debería llevar
algún id? Algo así como <d id=1>texto</e><e id=2>texto</e>?
--
Qapla'
Alejandro Vargas
Gonzalo Aguirre
2014-01-08 10:43:38 UTC
Permalink
Post by Alejandro Vargas
Post by Gonzalo Aguirre
<e>texto</e><e>texto</e>
me da error de sintaxis, si meto cualquier signo [ \t\n] no hay problema.
Pero, eso es válido en XML? Al aparecer más de una vez no debería llevar
algún id? Algo así como <d id=1>texto</e><e id=2>texto</e>?
sí, es válido, así como <e/> sín más.. ni texto, ni atributos. Por
ejemplo, para las etiquetas que pusiste vos para bison son válidas <d "id"
= 1>texto</d>, pero si pongo "id"=1 todo junto parece que toma todo como un
solo token y me dice que no existe y me larga error de sintaxis.
--
GA
Andres Morales
2014-01-08 11:22:19 UTC
Permalink
Una pregunta, has probado con algo similar a esto en Flex:

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

y en Bison:

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

No es que yo lo haya probado, pero estaba viendo este[1] post y me
pareció bastante fácil como para empezar. Las expresiones regulares de
Flex son bastante autodescriptivas y deberías obtener un resultado
"limpio" con Bison.

Saludos y espero te sirva.

Andrés

[1]: http://stackoverflow.com/questions/3121917/simple-xml-parser-in-bison-flex
Post by Gonzalo Aguirre
Post by Alejandro Vargas
Post by Gonzalo Aguirre
<e>texto</e><e>texto</e>
me da error de sintaxis, si meto cualquier signo [ \t\n] no hay problema.
Pero, eso es válido en XML? Al aparecer más de una vez no debería llevar
algún id? Algo así como <d id=1>texto</e><e id=2>texto</e>?
sí, es válido, así como <e/> sín más.. ni texto, ni atributos. Por
ejemplo, para las etiquetas que pusiste vos para bison son válidas <d "id"
= 1>texto</d>, pero si pongo "id"=1 todo junto parece que toma todo como un
solo token y me dice que no existe y me larga error de sintaxis.
--
GA
Gonzalo Aguirre
2014-01-08 12:07:02 UTC
Permalink
Post by Andres Morales
<\?.*\?> { ;}
<[a-z]+> { return START; }
</[a-z]+> { return STOP; }
[0-9]+ { return NUM; }
[^><]+ { return STR; }
%token START, STOP, STR, NUM
%%
simple_xml : START value STOP
;
value : simple_xml
| STR
| NUM
| value simple_xml
;
No es que yo lo haya probado, pero estaba viendo este[1] post y me
pareció bastante fácil como para empezar. Las expresiones regulares de
Flex son bastante autodescriptivas y deberías obtener un resultado
"limpio" con Bison.
Saludos y espero te sirva.
Andrés
http://stackoverflow.com/questions/3121917/simple-xml-parser-in-bison-flex
Gracias Andrés, le voy a pegar una mirada, en realidad intenté simplificar
la gramática a mi manera, pero se complica igual.
Alejandro Vargas
2014-01-08 11:59:49 UTC
Permalink
Post by Gonzalo Aguirre
Post by Alejandro Vargas
Pero, eso es válido en XML? Al aparecer más de una vez no debería llevar
algún id? Algo así como <d id=1>texto</e><e id=2>texto</e>?
sí, es válido, así como <e/> sín más.. ni texto, ni atributos. Por
ejemplo, para las etiquetas que pusiste vos para bison son válidas <d "id"
= 1>texto</d>, pero si pongo "id"=1 todo junto parece que toma todo como un
solo token y me dice que no existe y me larga error de sintaxis.
Hummm... pues con el id es bastante común usarlo...
--
Qapla'
Alejandro Vargas
Gonzalo Aguirre
2014-01-08 12:16:15 UTC
Permalink
Post by Alejandro Vargas
Post by Gonzalo Aguirre
Post by Alejandro Vargas
Pero, eso es válido en XML? Al aparecer más de una vez no debería
llevar
Post by Gonzalo Aguirre
Post by Alejandro Vargas
algún id? Algo así como <d id=1>texto</e><e id=2>texto</e>?
sí, es válido, así como <e/> sín más.. ni texto, ni atributos. Por
ejemplo, para las etiquetas que pusiste vos para bison son válidas <d
"id"
Post by Gonzalo Aguirre
= 1>texto</d>, pero si pongo "id"=1 todo junto parece que toma todo como
un
Post by Gonzalo Aguirre
solo token y me dice que no existe y me larga error de sintaxis.
Hummm... pues con el id es bastante común usarlo...
Alex, mirá, acá tenés la gramática [0], si seguís la regla de EmptyElemTag
te salen cosas como <e/>, fijate que los atributos son {opcionales}*.


[0]
http://ooatool.com/ooa/OOATool/ExtensibleMarkupLanguage/ExtensibleMarkupLanguage.pattern.html
--
GA
Loading...