¿Alguien ha utilizado las "preferencias de selección" proporcionadas por MKS YACC?

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

  •  20-08-2019
  •  | 
  •  

Pregunta

Desde que no he recibido ninguna respuesta a mi pregunta ¿Existe una alternativa a MKS YACC que admite la sintaxis de preferencia de selección o algo muy similar?, Haré la pregunta más básica:

  • ¿Alguien ha utilizado las "preferencias de selección" proporcionadas por MKS YACC?

Si lo tienes, ¿para qué lo usaste? Además, ¿tiene sentido usarlo en otra cosa que no sea la última posición en una regla?

Tengo que cuidar una gramática que figura reglas como:

    TOKEN1 LPAREN non_terminal1 [^EQUAL] TOKEN2 non_terminal2 RPAREN

A menos que esté malinterpretando algo, la preferencia de selección integrada no proporciona ningún valor en este contexto.

Fondo

MKS YACC admite una notación que llama su sitio web "Sintaxis de preferencia de selección". No se ilustra, pero consiste en una ficha o lista de tokens en soportes cuadrados con un careto (que podría ser opcional), e indica que el token particular no debe seguir esta construcción, pero esa token no se cuenta Como parte de esta regla:

non_terminal1:  TOKEN1 non_terminal2 TOKEN2 [^TOKEN3]

Entonces, esta regla dice que un TOKEN1 seguido de un non_terminal2 y un TOKEN2 es un non_terminal1, a menos que el siguiente token sea un TOKEN3 en cuyo caso se aplica alguna otra regla.

(No estoy claro si el elemento entre corchetes puede ser un no terminal. El código que he visto usando la notación siempre usa una token o un par de tokens separados de espacio, y nunca un terminal. Tampoco soy Borre si se requiere el careto; nuevamente, todos los ejemplos que he visto usan el careto).

¿Fue útil?

Solución

Jonathan. A la 1:30 am, no estoy preparado para tratar de hacer esto yo mismo, pero lo que sea que hagan esas reglas, solo pueden ser abreviatura de reglas que podrían escribirse en algo como BNF normal. Mirando esto, parece que lo que está haciendo la "preferencia de selección" es permitirle expresar lo que de otro modo serían varias producciones con una regla gramatical.

Hice un poco de excavación y encontré este, que confirma mi suposición: lo que hace la preferencia de selección es permitirle insertar explícitamente un lookhead, de modo que las reglas que de otro modo estarían en conflicto pueden desambigarse.

Lo que sugeriría es pensar en cómo se vería una de estas reglas si se reescribiría en YACC o BNF directo. Sospecho que resultará algo como

TOKEN1 LPAREN non_terminal1 MULT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 DIVIDE TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 ADD TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 SUBTRACT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 EXP TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 MOD TOKEN2 non_terminal2 RPAREN
...

Para que el efecto general sea tomar una regla para cada operador excepto igual, el [^ La notación es común en los diversos idiomas de Bell Labs para algo como el complemento de un conjunto.

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