BNF gramática + Gold analizador LALR, no distinguir caso especial NewLine de espacios en blanco

StackOverflow https://stackoverflow.com/questions/599409

  •  11-09-2019
  •  | 
  •  

Pregunta

  • quiero considerar espacios en blanco y saltos de línea como espacios en blanco normales.
  • Quiero distinguir los saltos de línea de otros espacios en blanco por otra parte para permitir caso especial.

En primer intento de escribir una gramática compatible falla.

Aquí es la gramática:

! ------------------------------------------------- Sets

{WS}           = {Whitespace} - {CR} - {LF}
{ID Head}      = {Letter} + [_]
{ID Tail}      = {Alphanumeric} + [_]
{String Chars} = {Printable} + {HT} - ["\]

! ------------------------------------------------- Terminals

! The following defines the Whitespace terminal using the {WS}
! set - which excludes the carriage return and line feed 
! characters

Whitespace    = {WS}+ | {CR}{LF} | {CR} | {LF}
!NewLine       = {CR}{LF} | {CR} | {LF}
MyNewLine      = {CR}{LF} | {CR} | {LF}
¿Fue útil?

Solución

Son ambigua, ya que ambos contienen el mismo {CR}{LF} | {CR} | {LF} sub-conjunto.

Teniendo en cuenta la entrada {CR}{LF} el analizador no tiene forma de saber qué terminal debe coincidir.

Un programa de análisis basada en tablas no es realmente diseñado para manejar "casos especiales" directamente. Si desea ignorar los saltos de línea en algunos contextos, pero atribuir significado a ellos en los demás, entonces usted tiene que manejar eso en sus reducciones (es decir, no simbólica los saltos de línea por separado, y desecharlos en sus reducciones), pero eso va a poner feo .

A (potencialmente) mejor solución es utilizar tokenizer estados (posiblemente controlados desde el analizador sintáctico), para cambiar la forma de tokenized las entradas de nueva línea. Es difícil de decir sin entender completamente su gramática. Además, ha sido un par de años desde que he metido con esta materia.

Otros consejos

Creo que la gramática es ambigua en el sentido de que ambos espacios en blanco y MyNewLine coincide con nuevas charachters línea. Ya que arroja una tambaleante hacerlo a su manera, sugiero la detección de espacio en blanco y las nuevas líneas por separado y decidir qué hacer con el salto de línea sobre una base de caso por caso.

No estoy demasiado experimentado en la zona, pero eso es lo que recuerdo de mi Teoría de la clase de Computación y compilador de clases de diseño.

Espero que esto ayude.

Una respuesta tardía.

Para mi desgracia, sólo soy una reciente flor tardía ;-) miembro.

Siga usando la base de línea habitual Gramática Declaraciones

! ====================================================================
{Whitespace Ch} = {Whitespace} - {CR} - {LF}

Whitespace = {Whitespace Ch}+
Newline    = {CR}{LF} | {CR} | {LF}
! ====================================================================

El espacio en blanco frente a la distinción de nueva línea ya se tiene en cuenta!

Considere las direcciones en el caso especial al escribir sus reglas de producción.

En caso complejo que incluso puede ser necesario definir algunos de terminal virtual (técnica avanzada).

Es posible elaborar su gramática y pedir mediante la publicación de nuevo.

Última edición : Por favor, comparte si has ya se abordó la cuestión. Gracias.

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