2010-06-10 13 views
5

Gente Estoy implementando una cosa extraña, tengo que escribir una utilidad para analizar un diagrama de sintaxis en formato de texto plano y convertirlo a formato XML, la cosa es básicamente idéntica a esto de IBM (como en la parte "Crear un trabajo sin conversión"): http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls17.htm El analizador/lexer típico como ANTLR/yacc/bison parece que no puede tratar con este tipo de cosas, una idea que tengo es convertir el diagrama de sintaxis en un personaje mapa de bits y definir alguna función como more_up, move_down, left, right, etc. para recorrer todo el diagrama y simular el proceso de comprensión a simple vista. Aunque parezca no ser lo suficientemente competente, no encontré otro enfoque mejor. ¿Alguien alguna vez jugó con un escenario similar? Tal vez podrías amablemente arrojar algo de luz sobre esto.Idea sobre diagrama de sintaxis de caracteres de análisis

¡Gracias de antemano!

Respuesta

1

La idea de "cuadrícula de caracteres" para acceder a caracteres individuales parece ser un paso fundamental; otra respuesta muestra cómo hacerlo bien. Ahora puede acceder a la cuadrícula aleatoriamente y seguir líneas horizontales o verticales fácilmente.

El problema real es que desea construir un gráfico que represente lo que dice la cuadrícula de caracteres. Dicha gráfica consistirá en (duh), nodos, arcos y anotaciones.

Probablemente lo más fácil de encontrar son los nodos, que probablemente estén indicados (ver otra respuesta) por caracteres que representan puntos de bifurcación en el diagrama (por ejemplo, +). Cada arco será una cadena de caracteres que conducen a una curva en el arco, o a otro nodo. Seguir estas cadenas de caracteres debe ser bastante directo (:-)) y puede producir una cadena que represente el arco incluso si tiene curvas en él.

Es probable que desee enumerar todos los nodos (simplemente escanee la matriz). Las anotaciones de nodo deben estar razonablemente cerca y simplemente puede escanear un pequeño rumor alrededor de las ubicaciones de los nodos.

Querrá enumerar cada arco dejando un nodo y recoger la cadena que representa el arco.

Me gustaría alimentar la cuerda de arco a un lexer para romperla; puede tener un contenido interesante (por ejemplo, una anotación como en una secuencia en línea de caracteres).

En este punto tiene nodos y arcos con anotaciones asociadas. Construir el gráfico correspondiente a partir de estos debería ser bastante fácil.

+0

Ira, tu enfoque tiene mucho sentido, mientras que otra cosa parece tener que ser considerado también. Al igual que algunos arcos no son móviles topológicos (implican los parámetros opcionales u obligatorios), y debido a esto, el analizador tiene que ser razonable si el nodo actual está en el tronco principal o en una rama lateral, o qué tan profundo ha sido anidado. Mi sensación es transversal, los nodos de izquierda a derecha requerirán menos esfuerzos, la codificación para resolverlos ... – Ripley

+0

"Algunos detalles quedan como ejercicio para el lector": -} –

2

Nunca antes había hecho algo así, pero así es como me gustaría abordarlo.

En primer lugar, me gustaría empezar con algo como esto:

class CharGrid(object): 
    def __init__(self, text): 
     self.lines = text.split('\n') 

    def __getitem__(self, pos): 
     try: 
      col, row = pos 
     except (TypeError, ValueError): 
      raise KeyError('%r not a 2-tuple' % (pos,)) 
     if row >= len(self.lines): 
      return ' ' 
     line = self.lines[row] 
     if col >= len(line): 
      return ' ' 
     return line[col] 

para que pueda acceder a los caracteres en el texto a través de las coordenadas 2D:

grid = CharGrid("""Creating a No-Conversion Job 

>>-onpladm create job--job--+--------------+-- -n---------------> 
          '- -p--project-' 

>-- -d--device-- -D--database-- -t--table-----------------------> 

    .---------------------------------------------------------------------. 
    V                  | 
>----+-----------------------------------------------------------------+-+->< 
    |               (1) | 
    '-+-------------+--+-------------+--| Setting the Run Mode |------' 
     '- -S--server-' '- -T--target-' 
""") 

print ''.join((grid[0,0], grid[1,0], grid[2,0])) 
print ''.join((grid[0,2], grid[1,2])) 

(rendimiento)

Cre 
>> 

Después de eso, la tarea sería convertir la cuadrícula 2D de caracteres en una secuencia 1D de símbolos:

  1. leen la etiqueta de la primera línea de
  2. escanear la primera columna hasta que encuentre >>
  3. derecho de exploración desde la posición actual hasta que encuentre [lo]

... etc. Sigue la tabla en orden de ojo.

Una vez que tenga una secuencia 1D de símbolos, puede utilizar una técnica de análisis convencional sobre eso.

+0

Matt, gracias por el bonito código, hay algunas cosas que todavía tengo que considerar como ser sensible al parámetro opcional/obligatorio y la determinación del nombre/valor del parámetro, tu clase es un buen comienzo :) – Ripley

Cuestiones relacionadas