使用Lex计算字符串出现次数,makefile可能存在问题

时间:2013-11-26 20:54:02

标签: c regex makefile lex

目前正在尝试使用Lex实用程序读取C程序,并显示所有未保留C字的单词的行出现次数。我遇到了一大堆错误,上面写着'yyin'的多重定义''yyout''yylex''yy_create_buffer'等...

我觉得我的makefile目前有问题,也可能在我的代码中。 任何帮助表示赞赏!

我的代码:

#include <string.h>
char currentLines[20][80];
char identifier[1000][80];
void foundWord(char *, int);
int numLine = 1;
%}

%s newStr
%x BLOCK

%%
"/*"                        BEGIN(BLOCK);
<BLOCK>[^*\n]*        
<BLOCK>"*"+[^*/\n]*   
<BLOCK>\n             ++numLine;
<BLOCK>"*"+"/"        BEGIN(INITIAL);

"\n"                              ++numLine;

auto                        ;
break                       ;
case                        ; //full list of reserved words...

[*]?[a-zA-Z][a-zA-Z0-9_]*   foundWord(yytext, numLine);
[^a-zA-Z0-9_]+              ;
[0-9]+                      ;
%%

void foundWord(char* newStr, int nLine)
{
char num[10];
sprintf (newStr, "%d", nLine);

int i;
for(i = 0; i <= 20; i++)
{
    if ( strcmp(identifier[i], newStr) == 0 )
    {
        strcat( currentLines[i], ", " );
        strcat( currentLines[i], num );
        return;
    }
}

strcpy( identifier[i], newStr );
strcat( identifier[i], ": " );
strcpy( currentLines[i], num );
}

这是我编写的makefile,试图将'C_words.l'与lex库链接。

C_words.exe : C_words.o lex.yy.o
    gcc -g -o C_words.exe C_words.o lex.yy.c -ll
lex.yy.o : lex.yy.c
    gcc -g -c lex.yy.c
lex.yy.c : C_words.l
    lex C_words.l

这是我想要使用的输入文件。

#include <stdio.h>
void main()
{
    int m,n;

printf("Enter the values for  M and N\n");
scanf("%d %d", &m,&n);

if(m == n )
    printf("M and  N are equal\n");
else
    printf("M and N are not equal\n");

}

2 个答案:

答案 0 :(得分:2)

Make足够聪明,知道如何从C_words.l构建C_words.o。所以正在发生的事情是你要链接C_words.o(来自C_words.l)和lex.yy.o(也来自C_words.o)。

而不是

C_words.exe : C_words.o lex.yy.o
    gcc -g -o C_words.exe C_words.o lex.yy.c -ll
lex.yy.o : lex.yy.c
    gcc -g -c lex.yy.c
lex.yy.c : C_words.l
    lex C_words.l

尝试:

C_words.exe : C_words.o 
    gcc -g -o C_words.exe C_words.o  -ll

注意:如果您有一个名为C_words.c的文件,则C_words.c和C_words.l将在构建时发生冲突。将C_words.c重命名为main.c或类似的东西。将makefile更改为:

C_words.exe : C_words.o main.o
    gcc -g -o C_words.exe C_words.o main.o -ll

答案 1 :(得分:1)

在制作时是否尝试使用-p选项?

e.g。

C_words.exe : C_words.o lex.yy.o
    gcc -g -p -o C_words.exe C_words.o lex.yy.c -ll
lex.yy.o : lex.yy.c
    gcc -g -p -c lex.yy.c
lex.yy.c : C_words.l
    lex C_words.l