2011-07-27 16 views
5

Estoy tratando de aprender YACC y tengo algunos problemas para descifrar los mensajes de advertencia que me está dando. Aquí es parte de mi archivo:Las reglas de YACC no se están reduciendo

define_character: WORD IS STRING COLOR 
{ 
    printf("%s's full name is %s and thier color is %s", $1, $3, $4); 
}; 

dialog: WORD COLON STRING 
{ 
    printf("%s says %s", $1, $3); 
}; 

change_scene: SCENE SETSCENE WORD 
{ 
    printf("%s is the new scene", $3); 
}; 

Las advertencias que da mi son:

2 rules never reduced 
2 useless nonterminals and 2 useless rules 
warning: useless nonterminal: dialog 
warning: useless nonterminal: change_scene 
warning: useless rule: dialog: WORD SEMICOLON STRING 
warning: useless rule: change_scene: SCENE SETSCENE WORD 

¿cómo puedo solucionar esto? Intenté buscar y encontré personas que tienen el error debido a conflictos de cambio/reducción. Parece que YACC por lo general lo agrega al resultado de advertencia si hay alguno, pero solo para asegurarse de que traté de eliminar WORD de change_scene para que no buscara los mismos tokens que los otros y todavía no reduce . Puedo probar todas las reglas porque el que está en la parte superior es el que funciona. ¿Me falta algo de sintaxis al final de la primera regla que está causando problemas con el resto de ellos?

Respuesta

3

Creo que el problema es que yacc asume que el primer lado izquierdo de la producción es el símbolo de inicio. En este caso, esto significa que ya que tienes

define_character: WORD IS STRING COLOR 

yacc piensa que define_character es el símbolo de inicio. Tiene otras dos producciones, a saber

dialog: WORD COLON STRING 

y

change_scene: SCENE SETSCENE WORD 

Nótese, sin embargo, que no hay manera de obtener ya sea dialog o change_scene de define_character. En consecuencia, yacc le dice que tiene dos no terminales inútiles, a saber, estos dos, ya que nunca se pueden derivar. Los errores sobre dos producciones inútiles surgen porque el analizador no puede desencadenar ninguna de las dos producciones anteriores.

No estoy seguro de entender lo que estás tratando de hacer con este código, pero para solucionarlo necesitarás hacerlo de alguna manera para poder acceder a estos no terminales. ¿Puedes dar más detalles sobre lo que estás tratando de lograr con yacc?

+0

Gracias, creo que lo tengo arreglado ahora. Todos los ejemplos que he visto nunca realmente te mostraron cómo manejar más de una acción. Tengo el libro de O'Reilly y estoy tratando de construir mi analizador mientras lo paso. Supongo que debería haber leído más. Estoy haciendo un intérprete para una novela visual. Lo arreglé poniendo una declaración de comandos en la parte superior con la lista de comandos separados por |. – John

Cuestiones relacionadas