1

我检查了其他类似的帖子,但我认为我只需要第二双眼睛。此文件用于 lex Unix 实用程序。

我创建了一个makefile,这是我收到的错误:

gcc -g -c lex.yy.c
cxref.l:57: error: expected ‘;’, ‘,’ or ‘)’ before numeric constant
make: *** [lex.yy.o] Error 1

Line 57就在void inserID()顶部附近的函数内部。

这是代码:

%{
#include <stdio.h>
#include <string.h>
char identifier[1000][82];
char linesFound[100][100];
void insertId(char*, int);
int i = 0;
int lineNum = 1;
%}

%x comment
%s str

%%
"/*"                        BEGIN(comment);

<comment>[^*\n]*        /* eat anything that's not a '*' */
<comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
<comment>\n             ++lineNum;
<comment>"*"+"/"        BEGIN(INITIAL);

"\n"                              ++lineNum;

auto                        ;
break                       ;
case                        ;
char                        ;
continue                    ;
default                     ;
do                          ;
double                      ;
else                        ;
extern                      ;
float                       ;
for                         ;
goto                        ;
if                          ;
int                         ;
long                        ;
register                    ;
return                      ;
short                       ;
sizeof                      ;
static                      ;
struct                      ;
switch                      ;
typedef                     ;
union                       ;
unsigned                    ;
void                        ;
while                       ;
[*]?[a-zA-Z][a-zA-Z0-9_]*   insertId(yytext, lineNum);
[^a-zA-Z0-9_]+              ;
[0-9]+                      ;
%%
void insertId(char* str, int nLine)
{
    char num[2];
    sprintf ( num, "%d", nLine);

    int iter;
    for(iter = 0; iter <= i; iter++)
    {
        if ( strcmp(identifier[iter], str) == 0 )
        {
            strcat( linesFound[iter], ", " );
            strcat( linesFound[iter], num );
            return;
        }
    }

    strcpy( identifier[i], str );
    strcat( identifier[i], ": " );
    strcpy( linesFound[i], num );

    i++;

}
4

1 回答 1

1

你的问题是:

%s str

用大写字母写条件名称是正常的,这是有原因的:它使它们看起来像宏,这正是它们的本质

所以

void insertId(char* str, int nLine)

将宏扩展为:

void insertId(char* 2, int nLine)

并且编译器抱怨2在声明中当时并没有真正预期到这一点。

于 2012-11-19T01:08:54.903 回答