¿Existe una resolución diferente del problema de "colgar más" además de "coincidencia más cercana"?

9

A continuación se presenta gramática independiente del contexto de una "colgando más" tipo de ambigüedad (imagina que sinónimo de y b representa y c representa algún otro tipo de instrucción o bloque): Saif expr thenbelsec Por ejemplo,aacbcse puede analizar como(a(acbc))o como(a(ac)bc)(esta es la palabra ambigua más simple / más corta para esta gramática).

SaSbS|aS|c
aacbc(a(acbc))(a(ac)bc)

La forma "estándar" de resolver esta ambigüedad de "colgar otro" obliga a la declaración "más" ( ) a emparejarse con el "si-entonces" más cercano / más interno ( a ). Esto se puede lograr de la siguiente manera: Sba Esta gramática es inequívoca. En el ejemplo anterior, fuerza elanálisis(a(acbc)).

SaTbS|aS|cTaTbT|c
(a(acbc))

Pregunta: ¿Hay otra forma natural de resolver la ambigüedad que forzaría el análisis de a a c b c ? En otras palabras, estoy buscando una gramática que genere el mismo lenguaje que los dos anteriores, que no sea ambigua y que analice a a c b c como ( a ( a c ) b c ) .(a(ac)bc)aacbcaacbc(a(ac)bc)

Observación: Mi primer intento fue el siguiente: que resuelve la ambigüedad deaacbcsegún sea necesario, pero esta gramática sigue siendo ambigua:aacbacbcpuede analizarse como(a(ac)b(acbc))o como(a(acb(ac))bc).

SaSbS|aU|cUaU|c
aacbcaacbacbc(a(ac)b(acbc))(a(acb(ac))bc)
Gro-Tsen
fuente
1
Y en su último ejemplo, ¿cuál de los dos posibles análisis considera "naturales" o correctos, y por qué?
rici
aacbacbcaaaaaacbcbcbcabkbkaa

Respuestas:

7

ababcb

La tradicional resolución de "colgar más cerca" más coincide con cada cierre con la apertura más reciente aún sin igualar. Eso significa que nunca hay una apertura sin coincidencia (o cierre, para el caso) entre una apertura coincidente y su cierre correspondiente.

(()())

Esta coincidencia debe hacerse de afuera hacia adentro, de modo que no se intente una coincidencia para un cierre hasta que se hayan emparejado todos los pares de cerramiento. Este hecho hace que sea imposible producir un análisis con un algoritmo de búsqueda anticipada delimitado, ya que el análisis tiene que trabajar hacia adentro desde ambos extremos, después de haber dividido la cadena en segmentos completamente coincidentes (porque efectivamente limitan el rango de posibles coincidencias).

Sin embargo, el hecho de que no exista un analizador en línea de izquierda a derecha no implica que no haya CFG inequívoco. (Evidentemente: un lenguaje palindrómico debe analizarse desde ambos extremos hacia el centro, pero es fácil escribir una gramática inequívoca).

Para producir una gramática para el problema de paréntesis de "coincidencia más lejana", me basé en el hecho de que una apertura no coincidente no puede ser seguida por una apertura coincidente. Si lo fuera, entonces la propiedad de coincidencia más lejana no se aplicaría porque la apertura no coincidente podría haber coincidido con el cierre de la apertura coincidente, por lo que el hecho de que no coincida viola la propiedad de coincidencia más lejana.

Así que aquí está la gramática un poco torpe:

SU|MUT|aUbT|aUbc|aMbUMaMbM|cTaT|ac

SMUaTaTTUUT

UUSMUSMUMU

Probablemente hay una mejor solución que la que elegí. Pero este parece funcionar, y funciona bien con el analizador GLR de Bison que solía probarlo; ese analizador se queja de análisis ambiguos a menos que escriba un código adicional para manejar la ambigüedad, y yo era demasiado vago para hacerlo. Lo probé con cadenas de hasta 20 abiertos + cierres, y parece haber producido un análisis inequívoco para cada secuencia anidada correctamente, sin producir análisis para secuencias anidadas incorrectamente.

rici
fuente
¡Felicitaciones por lograr lo que había concluido que probablemente era imposible! Verifiqué experimentalmente que para palabras de longitud ≤16 esta gramática es inequívoca y genera las mismas palabras que las de mi pregunta. ¡Ahora tengo que entender en detalle cómo funciona!
Gro-Tsen
SaSbT|aMbSMTaT|cU
0

Tome a + b + c + d + e y abcde. Hay dos formas obvias de cómo una gramática podría analizar esto, pero hay una forma en que la usamos.

En el caso del "colgar otra cosa", no es así como la gente lo mira. En cambio, la sintaxis se interpreta como "if", seguida de cero, uno o más "else if", seguido de un "else" opcional.

gnasher729
fuente
acbacbacbc