Pregunta

rephrase ...

Me gustaría saber cuál es la mejor para analizar funciones / condicionales. por lo que si usted tiene algo así como: [if {a} is {12 or 34}][if {b} not {55}] show +c+ [/if][/if] que es un condicional dentro de un condicional. Parece que no pueden hacer esto sólo con expresiones regulares.


pregunta original

por ahora tengo una forma bastante simple de analizar algunos comandos a través de ActionScript.

Estoy usando expresiones regulares para encontrar etiquetas, comandos y operandos utilizando ...

+key_word+  // any text surrounded by +
[ifempty +val_1+]+val_2+[/ifempty]  //simple conditional
[ifisnot={`true,yes`} +ShowTitle+]+val_3+[/ifisnot]  // conditional with operands

mi algoritmo actual coincide con la apertura tag[**] con el primer [/**] etiqueta de cierre a pesar de que no coincide. Lo que significa que no podía hacer algo así como [ifempty +val_2+][ifnotempty +val_2]+val_3+[/ifnotempty]+val_4+[/ifempty] -. Esencialmente poner un condicional dentro de otro

Estoy usando una forma en línea de análisis que se divide la cadena en una matriz de cadenas en base a esta expresión regular \[[^\/](?:[^\]])*\](?:[^\]])*\[\/(?:[^\]])*\]

Puede alguien sugerir un algoritmo más robusto con un análisis más robusto de convenciones / estándar? especialmente para as3.

¿Fue útil?

Solución

Las expresiones regulares definen Regular Idiomas. Idiomas regulares no pueden tener regiones limitadas, pero potencialmente infinito, la recursividad.

Una forma de pensar en ello es que todos los lenguajes regulares se puede representar por una máquina de estados finitos. Se necesitaría un estado para cada número posible de si lo es, pero la máquina debe ser 'finito', por lo que su en un aprieto. Un ejemplo clásico es:

a{n}b{n}, n >= 0
(meaning n a's, followed by n b's)

A medida que analice cada una, lo que tendría que ir a otro estado (FSM no tienen memoria más allá del estado en el que la única forma en que podían recordar n para que coincida más tarde). Para analizar cualquier número de n de, necesitaría un número infinito de estados.

Esta es la misma situación que se encuentre, una expresión regular podría expresar un número finito de IFS (aunque sería tomar un poco de copiar y pegar), pero no un número infinito. Nota sin embargo, que algunas implementaciones de expresiones regulares engañan un poco, dándoles más poder que sus equivalentes matemáticos.

En cualquier caso, lo mejor es utilizar un motor más potente método de análisis sintáctico. Un recursiva descenso analizador es especialmente divertido para poner en práctica, y fácilmente podría hacer lo que necesita. Usted también podría buscar en un LR-analizador, o construir un analizador simple usando una pila. Dependiendo de su idioma, es posible que pueda encontrar un análisis de la biblioteca como pyparse para Python o Boost Espíritu para C ++.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top