Flex 令牌不适用于 char* 哈希表
Flex tokens not working with char* hashtable
我正在制作一个简单的编译器,我使用 flex 和哈希表 (unordered_set
) 来检查输入的单词是标识符还是关键字。
%{
#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;
}
我尝试了一个只写了单词 "class" 的输入文件,输出是 object_identifier
,而不是 class
。
我尝试了一个简单的程序,没有使用 flex,unordered_set
工作正常。
int main()
{
cstrset keywords = {"and", "class"};
const char* str = "class";
if (keywords.count(str) > 0)
printf("works");
return 0;
}
可能是什么问题?
使用 unordered_set<string>
而不是您的 unordered_set<const char*>
。您正试图找到指向 char 数组的指针,它显然不能存在于您定义的变量中。
我正在制作一个简单的编译器,我使用 flex 和哈希表 (unordered_set
) 来检查输入的单词是标识符还是关键字。
%{
#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;
}
我尝试了一个只写了单词 "class" 的输入文件,输出是 object_identifier
,而不是 class
。
我尝试了一个简单的程序,没有使用 flex,unordered_set
工作正常。
int main()
{
cstrset keywords = {"and", "class"};
const char* str = "class";
if (keywords.count(str) > 0)
printf("works");
return 0;
}
可能是什么问题?
使用 unordered_set<string>
而不是您的 unordered_set<const char*>
。您正试图找到指向 char 数组的指针,它显然不能存在于您定义的变量中。