lex程序:错误:在数字常量之前预期';',','或')'?

时间:2012-11-17 22:09:27

标签: lex

我已经检查了其他类似的帖子,但我想我只需要第二眼。此文件适用于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++;

}

1 个答案:

答案 0 :(得分:1)

你的问题是:

%s str

有一个原因是在CAPS中编写条件名称是正常的:它使它们看起来像宏,它们正是它们

所以

void insertId(char* str, int nLine)

将宏扩展为类似:

void insertId(char* 2, int nLine)

并且编译器抱怨声明中此时并未真正预期2