actions yacc
Avec chaque règle de grammaire, vous pouvez spécifier des actions à effectuer chaque fois que l'analyseur syntaxique reconnaît la règle dans le flux d'entrée. Une action est une instruction en langage C qui effectue des entrées et des sorties, appelle des sous-programmes et modifie des vecteurs et des variables externes.
Les actions renvoient des valeurs et obtiennent les valeurs renvoyées par les actions précédentes. L'analyseur lexical peut également renvoyer des valeurs pour les jetons.
A : '('B')'
{
hello(1, "abc" );
}XXX : YYY ZZZ
{
printf("a message\n");
flag = 25;
}Transmission de valeurs entre des actions
A : B C D ;alors$1a la valeur renvoyée par la règle qui a reconnu B,$2a la valeur renvoyée par la règle qui a reconnu C, et$3la valeur renvoyée par la règle qui a reconnu D.
{ $$ = 1;}A : B ;Les mots clés de paramètre yacc supplémentaires suivants commencent par un$(symbole du dollar) permettent la vérification du type:
- $<Balise>$
- $<Balise>Nombre
$<Balise>Le nombre impose à la référence le type du membre de l'union référencé par<Balise>. Cela ajoute .tag à la référence afin d'accéder au membre de l'union identifié par Tag . Cette construction est équivalente à la spécification$$.Balise ou$1.Balise. Vous pouvez utiliser cette construction lorsque vous utilisez des actions au milieu de règles dans lesquelles le type de retour ne peut pas être spécifié via un%Déclaration type . Si une%type a été déclaré pour un nom non terminal, n'utilisez pas<Balise>; la référence d'union sera effectuée automatiquement.
Placer les actions au milieu des règles
A : B
{
$$ =1;
}
C
{
x = $2;
y = $3;
}
;$ACT : /* empty */
{
$$ = 1;
}
;
A : B $ACT C
{
x = $2;
y = $3;
}
;où$ACTest une action vide.