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

C 使用Lex计算字符串出现次数,makefile可能出现的问题,c,regex,makefile,lex,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 n

当前正在尝试使用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 );
}
这是我想使用的输入文件

#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");

}
#包括
void main()
{
int m,n;
printf(“输入M和N的值”);
scanf(“%d%d”,&m,&n);
如果(m==n)
printf(“M和N相等\N”);
其他的
printf(“M和N不相等\N”);
}

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

e、 g


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.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

看起来这解决了“yywrap的多重定义”,但我仍然收到了一长串错误。这似乎修复了错误,但程序似乎没有做任何事情,是时候检查一下了。如果foundWord()放一个printf看看它是否走得那么远。我不确定[*]是什么意思?应该在ID规则的起始处执行。这是:sprintf(yytext,“%d”,nLine);将要删除文本。您需要yytext。是[*]吗?是一个可选标识符,用于拾取诸如*argv[]之类的内容。我将更新我的代码,尝试用更新的代码修复YYTEXT。我现在遇到了这个错误预期a,或者)在我的foundWord函数开头的数字常量之前?
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.exe : C_words.o main.o
    gcc -g -o C_words.exe C_words.o main.o -ll