acciones
A cada regla de la gramática, el usuario puede asociar acciones para ser realizado cada vez que la regla se reconoce en el proceso de entrada. Estas acciones pueden volver valores, y pueden obtener los valores vueltos por acciones anteriores. Por otra parte, el analizador léxico puede volver los valores para el símbolo, si está deseado.
Una acción es una declaración arbitraria de C, y pues tal puede hacer la entrada y la salida, llamar subprogramas, y alterar vectores y variables externos. Una acción es especificada por unas o más declaraciones, incluidas en ``{'' rizado de los apoyos y ``}''. por ejemplo,
A: ' (' B ') ' {hello(1, "ABC"); }
y
XXX: YYY ZZZ {message\n del printf("a");
bandera = 25; }
son las reglas de la gramática con acciones.
Para facilitar la comunicación fácil entre las acciones y el programa de análisis, las declaraciones de acción se alteran levemente. '' ``$'' de la muestra del dólar del símbolo el `` se utiliza como señal a Yacc en este contexto.
Para volver un valor, la acción fija normalmente el ``$$'' pseudovariable a un cierto valor. Por ejemplo, una acción que no hace nada sino vuelve el valor 1 es
{= 1; }
Para obtener los valores vueltos por las acciones anteriores y el analizador léxico, la acción puede utilizar los pseudo-variables $1, $2. . ., que se refieren los valores volvieron por los componentes del derecho de una regla, leyendo de izquierda a derecha. Así, si es la regla
A: B C D;
por ejemplo, entonces $2 tiene el valor vuelto por C, y $3 el valor vuelto por D.
Como ejemplo más concreto, considere la regla
expr: ' (' expr ') ';
El valor vuelto por esta regla es generalmente el valor del expr en paréntesis. Esto se puede indicar cerca
expr: ' (' expr ') ' {= $2;
}
Por defecto, el valor de una regla es el valor del primer elemento en él ($1). Así, reglas de la gramática de la forma
A: B;
no necesite con frecuencia tener una acción explícita.
En los ejemplos arriba, todas las acciones vinieron en el final de sus reglas. A veces, es deseable conseguir control antes de que una regla se analice completamente. Yacc permite que una acción sea escrita en el centro de una regla así como en el extremo. Esta regla es asumida para volver un valor, accesible a través del mecanismo generalmente por las acciones a la derecha de ella. Alternadamente, puede tener acceso a los valores vueltos por los símbolos a su izquierda. Así, en la regla
A: B {= 1; } C {x = $2;
y = $3; };
el efecto es fijar x a 1, y y al valor vuelto por C.