Consejos a seguir al escribir un programa jison

Cuando escriba un programa jison asegurese de seguir los siguientes consejos:

  1. Coloque el punto y coma de separación de reglas en una línea aparte. Un punto y coma ``pegado'' al final de una regla puede confundirse con un terminal de la regla.

  2. Si hay una regla que produce vacío, coloquela en primer lugar y acompáñela de un comentario resaltando ese hecho.
  3. Nunca escriba dos reglas de producción en la misma línea.
  4. Sangre convenientemente todas las partes derechas de las reglas de producción de una variable, de modo que queden alineadas.
  5. Ponga nombres representativos a sus variables sintácticas. No llame Z a una variable que representa el concepto ``lista de parámetros'', llámela ListaDeParametros.
  6. Es conveniente que declare los terminales simbólicos, esto es, aquellos que llevan un identificador asociado. Si no llevan prioridad asociada o no es necesaria, use una declaración %token. De esta manera el lector de su programa se dará cuenta rápidamente que dichos identificadores no se corresponden con variables sintácticas. Por la misma razón, si se trata de terminales asociados con caracteres o cadenas no es tan necesario que los declare, a menos que, como en el ejemplo de la calculadora para '+' y '*', sea necesario asociarles una precedencia.
  7. Es importante que use la opción -v para producir el fichero .output conteniendo información detallada sobre los conflictos y el autómata. Cuando haya un conflicto shift-reduce no resuelto busque en el fichero el estado implicado y vea que LR(0) items $ A \rightarrow \alpha_\uparrow$ y $ B \rightarrow \beta_\uparrow \gamma$ entran en conflicto.

  8. Si según el informe de jison el conflicto se produce ante un terminal $ a$, es porque $ a \in FOLLOW(A)$ y $ a \in FIRST(\gamma)$. Busque las causas por las que esto ocurre y modifique su gramática con vistas a eliminar la presencia del terminal $ a$ en uno de los dos conjuntos implicados o bien establezca reglas de prioridad entre los terminales implicados que resuelvan el conflicto.

  9. Nótese que cuando existe un conflicto de desplazamiento reducción entre $ A \rightarrow \alpha_\uparrow$ y $ B \rightarrow \beta_\uparrow \gamma$, el programa jison contabiliza un error por cada terminal $ a \in FOLLOW(A) \cap FIRST(\gamma)$. Por esta razón, si hay 16 elementos en $ FOLLOW(A) \cap FIRST(\gamma)$, el analizador jison informará de la existencia de 16 conflictos shift-reduce, cuando en realidad se trata de uno sólo. No desespere, los conflictos ``auténticos'' suelen ser menos de los que jison anuncia.

  10. Si necesita declarar variables globales, inicializaciones, etc. que afectan la conducta global del analizador, escriba el código correspondiente en la cabecera del analizador, protegido por los delimitadores %{ y %}. Estos delimitadores deberán aparecer en una línea aparte. Por ejemplo:

    %{
    our contador = 0;
    %}
    
    %token NUM
    ...
    %%
    

Casiano Rodríguez León
2016-03-27