目前正在尝试使用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");
}
答案 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