¿Cuál es el propósito de la unión en el archivo yacc? ¿Está directamente relacionado con yylval en el archivo flexible? Si no usa yylval, ¿no necesita usar union?yylval y unión
Respuesta
La declaración %union
modifica el tipo de yylval
.
El bison
manual de explains:
En un analizador ordinario (no reentrante), el valor semántico del token deben almacenarse en la variable global
yylval
. Cuando usa solo un tipo de datos para valores semánticos,yylval
tiene ese tipo. Por lo tanto, si el tipo esint
(por defecto), puede escribir esto enyylex
:... yylval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ...
Cuando está utilizando varios tipos de datos, el tipo
yylval
's es una unión hecha de la declaración%union
(ver sección El Colección de tipos de valor). Por lo tanto, cuando almacena el valor de un token, debe usar el miembro adecuado de la unión. Si la declaración%union
se ve así:%union { int intval; double val; symrec *tptr; }
entonces el código en
yylex
podría tener este aspecto:... yylval.intval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ...
El propósito de la union
es permitir el almacenamiento de diferentes tipos de objetos en nodos emitidos por flex.
Para explicar mejor que puede tener, por ejemplo:
%union
{
int intValue;
float floatValue;
char *stringValue;
}
en .y
si desea proporcionar soporte básico para int
, float
y string
tipos. ¿Qué puedes hacer con esto?
dos cosas:
En primer lugar, puede configurar automáticamente los valores correctos cuando se genera tokens. Piense en .l
archivo del ejemplo anterior, se puede tener:
[a-zA-Z][a-zA-Z0-9]* {
yylval.stringValue = strdup(yytext);
return IDENTIFIER;
}
[0-9]+ {
yylval.intValue = atoi(yytext);
return INTEGER;
}
[0-9]*\.[0-9]+"f"? {
yylval.floatValue = new atof(yytext);
return FLOAT;
}
Además se puede usar el valor directamente en su gramática flex:
nexp: nexp '+' nexp { $<floatValue>$ = $<floatValue>1 + $<floatValue>3 }
Por último, si tiene previsto utilizar una sintaxis de programación orientada a objetos el árbol se puede definir como la unión
%union
{
class ASTNode *node;
}
en el que ASTNode
es la clase ancestro de cualquier tipo de s nodo de yntax
- 1. yylval indefinido con flex y bison
- 2. Diferencia entre unión interna y unión completa
- 3. intersección y unión de polígonos
- 4. Normalización MongoDB, clave externa y unión
- 5. SQL Server: fecha máxima y unión interna
- 6. SQL: UNIÓN cascada y unirse a
- 7. usando donde y unión interna en mysql
- 8. JavaScript variable de unión y el bucle
- 9. consulta LINQ con distintas y Unión
- 10. Cuenta avanzada y unión en Rails
- 11. inicialización Unión en C++ y C
- 12. Problema de empaquetamiento de unión y estructura
- 13. Tipos de unión y tipos de intersección
- 14. rendimiento de unión versus unión todos
- 15. unión inicialización
- 16. unión interna y unión externa; ¿Es importante el orden de las tablas?
- 17. ¿Qué es mejor ... unión externa izquierda o unión externa derecha?
- 18. Unión interna SQLite/JDBC
- 19. ¿Qué es una unión?
- 20. Unión de intervalos
- 21. Array Merge (Unión)
- 22. Unión interna en clojure
- 23. NHibernate - Unión tres QueryOvers
- 24. UNIÓN antes INNER JOIN
- 25. ¿Cómo inicializar una unión?
- 26. Impresión F # unión discriminada
- 27. unión a IsEnable
- 28. SQL unión condicional
- 29. Unión interna tres tablas
- 30. FIltering en la unión?
¿Por qué definir una unión de un elemento? ¿Por qué no simplemente '#define YYSTYPE class ASTNode *' (si la memoria sirve). –