2014-01-02 3 views
3

этой ошибки: строка 32: непризнанное правило появляется в моем коде в этой строке:ошибка: непризнанное правило в гибком инструменте

{OCTAL}      printf("Kind= OCTAL, Word= %s, LineNumber= %d\n",yytext,LineNum); 

и я думаю, что проблема здесь:

OCTAL    "\"(0|[1-3][0-7][0-7]|[1-7][0-7]|[1-7]) 

это мой код:

%{ 
int LineNum=1; 
int count =0; 
%} 


%x OneLineComment MultipleLinesComment 

DIGIT    [0-9] 

INT    [+|-]?(0|[1-9][0-9]*) 

OCTAL    "\"(0|[1-3][0-7][0-7]|[1-7][0-7]|[1-7]) // i think the error is   here !! 

DOUBLE    {INT}"."{DIGIT}*((E|e)?[+|-]?[1-9][0-9]*)? 

KEYWORD   int|double|while|if|else 

IDENTIFIER   [_A-Za-z]+[_A-Za-z0-9]* 

Space    " " 

Tab     "\t" 

NewLine    "\n" 

%% 


{INT}      printf("Kind= INTEGER, Word= %s,   LineNumber= %d\n",yytext,LineNum); 

{OCTAL}      printf("Kind= OCTAL, Word= %s, LineNumber= %d\n",yytext,LineNum); // the error line 

{DOUBLE}     printf("Kind= DOUBLE, Word= %s, LineNumber= %d\n",yytext,LineNum); 

{KEYWORD}     printf("Kind= KEWORD, Word= %s, LineNumber= %d\n",yytext,LineNum); 

{IDENTIFIER}    printf("Kind= IDENTIFIER, Word= %s, LineNumber= %d\n",yytext,LineNum); 


"//"      BEGIN(OneLineComment); 
<OneLineComment>. 
<OneLineComment>"\n"  { 
          printf("Kind=  OneLineComment, LineNumber= %d\n",LineNum); 
          printf("Kind= WhiteSpace, Word= NewLine, LineNumber= %d\n",LineNum); 
          BEGIN(INITIAL); 
          LineNum++; 
         } 

"/*"      { count=LineNum; 
           BEGIN(MultipleLinesComment); 
         } 
<MultipleLinesComment>. 
<MultipleLinesComment>"\n" LineNum++; 
<MultipleLinesComment>"*/" { 
          printf("Kind= MultipleLinesComment, LineNumber= %d,ToLineNumber= %d\n",count,LineNum); 
          count=0; 
          BEGIN(INITIAL); 
         } 

{Space}      printf("Kind= WhiteSpace, Word= Space, LineNumber= %d\n",LineNum); 

{Tab}      printf("Kind= WhiteSpace, Word= Tab, LineNumber= %d\n",LineNum); 

{NewLine}     { 
          printf("Kind= WhiteSpace, Word= NewLine, LineNumber= %d\n",LineNum); 
          LineNum++; 
         } 

.       printf("Kind= wrongToken, Word= %s, LineNumber= %d\n",yytext,LineNum); 

%% 

int yywrap() 
{ 
return 1; 
} 

int main() 
{ 
yylex(); 
return 0; 
} 

и когда я пишу это таким образом ошибка уходит:

OCTAL    "\\"(0|[1-3][0-7][0-7]|[1-7][0-7]|[1-7]) 

Что я делаю неправильно?

+0

Я не думаю, что вы имели в виду, чтобы пометить это ж/Adobe/Apache Flex - основа пользовательского интерфейса. Я вернул его в flex-lexer; но я не уверен, что это правильно. – JeffryHouser

ответ

4

\" говорит прогибается, чтобы соответствовать "

\\ говорит прогибается, чтобы соответствовать \

В исходном коде OCTAL является незаконным идентификатором, поскольку он имеет незавершенную строку. Вы «избегаете» второй кавычки, имея только одну косую черту.

http://en.wikipedia.org/wiki/Escape_sequences_in_C

+0

Thanx alot Josh :) – Dana

Смежные вопросы