/** -*- c-basic-offset: 3 -*- * * ENSICAEN * 6 Boulevard Marechal Juin * F-14050 Caen Cedex * * Ce fichier est l'oeuvre d'eleves de l'ENSI de Caen. Il ne peut etre * reproduit, utilise ou modifie sans l'avis express de ses auteurs. */ #ifndef GENERATOR_H #define GENERATOR_H #include "parser.tab.h" /** * @author Regis Clouard * @author Nicolas Massé * @author Thomas Limin * * @version 2006-03-06 */ /** * @file generator.h * This file contains functions for managing * symbol table and intermediate code. */ /** * The symbol table. */ struct s_table { char name[255]; /* the name of the symbol */ char type[255]; /* The C type of symbol : int, float, void. */ struct s_table *next; /* The next symbol. */ }; extern struct s_table *_symbolTable; /** * Initialise une structure de donnees du parseur. */ void init(struct t_code * s); /** * Retourne le type d'un symbole. */ char * getType(char * id); /** * Creates a new entry in the symbol table * for the given identifier with the specified type. * Available types are those of the C language. * For example, the following call adds the integer * variable 'i' in the symbol table: *
* addType("i","int");
*
* @param the name of the identifier.
* @param type the type name (int, float, void ...).
*/
void addType( char *identifier, char *type ) ;
/**
* Returns the code for the declaration
* of all the variables in the symbol table.
* @return the code.
*/
char* genDeclarationVars();
/**
* Creates a new tempory variable name with the
* specified type. Available types are those
* of the C language: int, float, etc. For
* example the following call creates a new
* integer variable:
*
* char * variable=newTemp("int");
*
* The variable name template looks like __txxx where
* xxx is a serial integer number that begins with 1.
* For example, the second call to newTemp returns: __t002
* Also, adds the variable in the symbol table.
*
* @param type the type of the temporary variable.
* @return a new variable name.
*/
char* newTemp( char *type );
/**
* Creates a new label name.
* The label name takes the form of __Lxxxx
* where xxxx is an integer. For example,
* the second call to newLabel() return __L002
* @return the string with the label name.
*/
char *newLabel( ) ;
/**
* Catenates the given strings into one single string.
* The result string is dynamically allocated. So a free
* is necessary for destruction.
* @param items the list of input strings.
* @return the new statement.
*/
char *concat( const char *item, ... );
/**
* Returns the given string without the first and
* the last character. For example this is convenient
* for getting text from Pascal string:
*
* trim("'this a text'"); -> returns "this a text"
*
* @param s the string to process.
* @return the string modified.
*/
char *trim( char *s );
/**
* Builds a C statement with
* the given code.
* Adds semicolon and indents each line.
* @param s the given code.
* @return the C statement.
*/
char *prod( const char *s ) ;
#endif /* GENERATOR_H */