Tengo un lenguaje con una sintaxis similar a C++. El lexer y el analizador están en su lugar y producen el AST correcto. Para la parte más grande, el back-end también está hecho.Escribiendo un compilador: ¿cómo hacer que funcionen plantillas simples?
El sistema básico que el compilador usa para crear tipos es muy simple: todos los tipos se consideran incorporados y todas las instancias son globales. Así que solo hay un mapa simple que coincide con el nombre de un tipo con un método que crea una variable que es básicamente un tipo genérico como boost :: any. Otro mapa con el nombre de la variable como llave y la variable como valor sirve como el ámbito global:
std::map< std::string, std::function< Variable() > typeList;
//register some types
typeList[ "X" ] = Variable::Create<X>;
typeList[ "Y" ] = CreateInstanceOfY;
....
Cuando el compilador obtiene el nodo AST para una inicialización como X myVar;
hace básicamente
std::map< std::string, Variable > globalScope;
globalScope[ "myVar" ] = typeList[ "X" ]();
Cuando miVar se utiliza más adelante se puede acceder mediante un simple despacho tipo como
X& x = myVar.GetReference<X>();
Ahora me gustaría extender esta un poco y utilizar plantillas simples. Supongamos que hay un tipo de "matriz" que se implementa utilizando un vector. Yo podría registrar todo como
typeList[ "array<X>" ] = Variable::Create< std::vector<X> >;
pero eso no es muy manejable, ya que tendría que repetirse para todas las combinaciones. Lo ideal sería que iba a necesitar una funcionalidad que permite a escribir algo como esto:
typeList.CreateTemplateVariable("array", "X")
que luego crear una instancia de variable que internamente tiene un std :: vector < X>. Intenté mucho, pero no puedo entender cómo hacerlo. Quizás comencé el camino equivocado con el mapeo simple de tipos y esa es la razón por la cual no puedo entenderlo.
Entonces la pregunta es simple: ¿es posible hacer esto? ¿Y cómo?
cuando se crea el código C++ de AST, ES de todos modos un compilador. – belgther
Un pequeño detalle sobre la terminología: un compilador traduce el código de un formato a otro.Un intérprete ejecuta algún código. –
@JoachimPileborg gracias por señalar eso ... Realmente no soy bueno con la terminología. – stijn