2016-02-27 1 views
1

Je crée un compilateur simple, et j'utilise flex et hashtable (unordered_set) pour vérifier si un mot d'entrée est un identifiant ou un mot-clé.Les jetons Flex ne fonctionnent pas avec char * hashtable

%{ 
#include <cstdio> 
#include <cstdlib> 
#include <cstring> 
#include <unordered_set> 
using std::unordered_set; 
void yyerror(char*); 
int yyparse(void); 

typedef unordered_set<const char*> cstrset; 
const cstrset keywords = {"and", "bool", "class"}; 
%} 
%% 
[ \t\n\r\f]    ; 
[a-z][a-zA-Z0-9_]*  { if (keywords.count(yytext) > 0) 
           printf("%s", yytext); 
          else 
           printf("object-identifier"); }; 

%% 

void yyerror(char* str) {printf("ERROR: Could not parse!\n");} 
int yywrap() {} 

int main(int argc, char** argv) 
{ 
    if (argc != 2) {printf("no input file");} 
    FILE* file = fopen(argv[1], "r"); 
    if (file == NULL) {printf("couldn't open file");} 
    yyin = file; 
    yylex(); 
    fclose(file); 
    return 0; 
} 

J'ai essayé avec un fichier d'entrée qui n'a que le mot « classe » écrite, et la sortie est object_identifier, pas class.

J'ai essayé avec un programme simple, sans utiliser de flex et le unordered_set fonctionne très bien.

int main() 
{ 
    cstrset keywords = {"and", "class"}; 
    const char* str = "class"; 
    if (keywords.count(str) > 0) 
     printf("works"); 
    return 0; 
} 

Quel pourrait être le problème?

+1

C++ Tagged 11: 'envisager l'aide cstrset =' unordered_set au lieu de 'typedef' – kfsone

Répondre

1

Utilisez unordered_set<string> au lieu de unordered_set<const char*>. Vous essayez de trouver le pointeur vers le tableau char qui ne peut évidemment pas exister dans votre variable définie.

+0

Oui, ce serait probablement, mais en utilisant const char * me aider plus tard, donc je vais passer à la chaîne que si cette est impossible. Et je ne pense pas que ce soit le problème du pointeur. J'ai essayé dans un programme de test séparé sans utiliser flex, et cela a fonctionné. Je vais modifier la question pour montrer cela. – devil0150

+0

Pourquoi préféreriez-vous utiliser const char *? Vous pouvez toujours utiliser .c_str() sur vos objets string pour extraire ce type de valeur ... –

+1

Votre exemple de programme fonctionne probablement à cause des optimisations du compilateur - le compilateur voit qu'il y a deux tableaux const char avec la même valeur et donc utilise le même pointeur dans chaque utilisation ... –