Flex - 比较C中字符串的函数

时间:2015-02-23 03:21:03

标签: c flex-lexer

我正在使用C编写一个C代码编译器,我希望比较一个文件的字符串,在本例中是我的符号表,用yytext。如果yytext和表的相应字符串是相同的,它应该退出函数,如果表上没有实例,那么函数将把字符串写在符号表上。

这是我的功能:

search (char *x){
int c;
int n = 0;
char *cdn;
while ((c = fgetc(comp)) != EOF){ 
   fscanf(comp, "%s", cdn);
   if (strcmp(cdn, yytext) == 0){
         n++; //if n>0 when it finishes searching the file then there's a copy on the file
   }else{}
   return 0;        
 }
  if (n==0){
     fprintf(comp, "%d\t %s\n", pos++, yytext); //will write if there's no copy in the table
  }else return 0;}

该函数的输入是yytext,yytext将具有例如“a”。

运行此程序后,程序不会写任何内容,需要手动关闭。 (更像是program.extension已停止工作。)

有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:2)

首先,将符号表放入文件是一个非常有争议的设计选择:

  • 符号经常被检查,因此文件访问会大大减慢编译速度。
  • 符号将与许多语法信息相关联(例如,它们可能代表具有关联类型的变量),因此仅存储名称将不足以使编译器的后续阶段工作。

如果将所有符号信息存储到文件中,则每次要访问给定符号时,都必须重新读取整个文件并将每个信息位转换为存储器表示。
这不仅效率低下,而且还会迫使您编写大量不必要且复杂的代码。

现在为你的search功能。

无论当前的错误如何,您的功能都是而不是搜索,但您需要搜索文件才能使其正常工作。

您的功能是创建yytext值的唯一列表。您在其中执行的“搜索”只是确保已存在的值不会重复。

要做的第一件事就是给它一个不那么具误导性的名字,或者修改它以使其符合它的名字所暗示的。

现在发现错误

如果由于某种原因你还想使用文件,我想你会把每个名字都放在一行上 那么为什么不使用fgets()来处理行结尾?

无论您使用什么方法来读取每个名称,都必须为字符串提供一个具有实际存储空间的缓冲区,而不仅仅是一个单位指针。

如果您的输入字符串为yytext,则永远不会使用您的x参数。

最后,您的search函数(将当前的yytext值插入未排序的列表中)没有理由返回任何内容(如果磁盘已满,则无法添加新名称除了错误代码清单)。