2014-02-17 4 views
0

Я новичок в lex, и у меня есть нераспознанное правило в строке 36, которое есть - printf ("% d", tok); Я не уверен, как исправить эту ошибку. Кто-нибудь видит, как это исправить? Thankyouнепризнанное правило в lex

%{ 
enum yytokentype { 
NUMBER = 258, 
ADD = 259, 
SUB = 260, 
MUL = 261, 
DIV = 262, 
ABS = 263, 
EOL = 264 
}; 
int yylval; 
%} 

%% 
"+" 
{ return ADD; } 
"-" 
{ return SUB; } 
"*" 
{ return MUL; } 
"/" 
{ return DIV; } 
"|" 
{ return ABS; } 
[0-9]+ { yylval = atoi(yytext); return NUMBER; } 
\n 
{ return EOL; } 
. { printf("Mystery character %c\n", *yytext); } 
[ \t] { } 
%% 
main(int argc, char **argv) 
{ 
int tok; 

while(tok = yylex()) { 
printf("%d", tok); 
if(tok == NUMBER) printf(" = %d\n", yylval); 
else printf("\n"); 
} 
} 

ответ

1

Есть несколько вещей, которые здесь не так, но я буду говорить вам мой мыслительный процесс.

Во-первых, ошибка говорит о том, что это считает тем, что ваш блок main является правилом lex. Ясно, что это не так. Это говорит о том, что он не считает, что ваши правила закончились.

Я вижу в ваших правилах несколько странных вещей. В конце у вас есть «пустое» правило, после шаблона .. Это правило никогда не будет согласовано. Он должен быть безвредным, но вы можете убедиться, почему вы его включили.

Далее у вас есть свои шаблоны и код на разных строках. Я не думаю, что это действительно так. Попробуйте поместить код в одну строку в шаблон.

1

Ваш код исправлениями (место различия):

%option noyywrap 
%{ 
enum yytokentype { 
    NUMBER = 258, 
    ADD = 259, 
    SUB = 260, 
    MUL = 261, 
    DIV = 262, 
    ABS = 263, 
    EOL = 264 
}; 
int yylval; 
%} 

%% 
"+" { return ADD; } 
"-" { return SUB; } 
"*" { return MUL; } 
"/" { return DIV; } 
"|" { return ABS; } 
[0-9]+ { yylval = atoi(yytext); return NUMBER; } 
\n { return EOL; } 
[ \t] { } 
. { printf("Mystery character %c\n", *yytext); } 
%% 

main(int argc, char **argv) 
{ 
int tok; 

while(tok = yylex()) { 
printf("%d", tok); 
if(tok == NUMBER) printf(" = %d\n", yylval); 
else printf("\n"); 
} 
Смежные вопросы