此错误:第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 :(得分:5)
\"
告诉flex匹配"
\\
告诉flex匹配\
在原始代码中,OCTAL是非法标识符,因为它具有未终止的字符串。你通过只有一个斜杠来“逃避”第二个引号。