0

数日間デバッグを行っていますが、このバグを修正できないようです。次のコードは、C 言語文法の Lex ファイルです。

まだ見つけられていない問題が 2 つあります。

これは最初に改行検出です。出力に改行文字が残っているようで、行 var をインクリメントしません (行を追跡するため、エラー フィードバック用の列)。

改行エスケープシーケンスのすべての組み合わせがありますが、それをキャッチできないようです。

2 つ目は、一重引用符の後に改行が続くことを検出することです。これにより、不正な文字エラーが発生するはずです。

何が表示されないのですか? 前もって感謝します!

%{
int col = 1;
int line = 1;
int aux_col = 0;
int err = 0; 
%}

%x C_COMMENT

 /* Identifiers */
ids    [a-zA-Z_]([a-zA-Z0-9_])*
 /* Integers    */
inteiros    0|[1-9]([0-9])*

 /* Chars or any Escape Sequence */
chrlit    (\'[^\n\'\\]?\')|(\'\\.\')
 /* Strings */  
strlit    (\"[^\n\"\\]?+\")         

 /* Char Error: Multi Char Constant */
chr_multi    (\'[^\n\']{2,}\')

 /* Char Error: Non-terminated Char Constant */
chr_nonterm    (\'[^\n\']{1,})

 /* String Error: Non-terminated String Constant */
strerr    (\"[^\n\"]?+)



%%

"/*"    {BEGIN(C_COMMENT); if(col==0) {aux_col=3;} else {aux_col=2;}}
<C_COMMENT>"*/"    {col+=aux_col+2; aux_col=0; BEGIN(INITIAL);}
<C_COMMENT><<EOF>>    {printf("Line %d, col %d: unterminated comment\n",line, col); BEGIN(INITIAL);}
<C_COMMENT>.    {aux_col++;}


"do"|"struct"|"auto"|"long"|"switch"|"break"|"enum"|"register"|"typedef"
"case"|"extern"|"union"|"float"|"short"|"unsigned"|"const"|"for"|"signed"       "void"|"continue"|"goto"|"sizeof"|"volatile"|"default"|"static"
{col+=yyleng; printf("RESERVED\n");}

return    {col+=yyleng; printf("RETURN\n");}

while    {col+=yyleng; printf("WHILE\n");}

printf    {col+=yyleng; printf("PRINTF\n");}

atoi    {col+=yyleng; printf("ATOI\n");}

if    {col+=yyleng; printf("IF\n");}

int    {col+=yyleng; printf("INT\n");}

itoa    {col+=yyleng; printf("ITOA\n");}

char    {col+=yyleng; printf("CHAR\n");}

"&&"    {col+=yyleng; printf("AND\n");}

"&"    {col+=yyleng;  printf("AMP\n");}

"="    {col+=yyleng;  printf("ASSIGN\n");}

"*"    {col+=yyleng; printf("AST\n");}

","    {col+=yyleng; printf("COMMA\n");}

"/"    {col+=yyleng; printf("DIV\n");}

"=="    {col+=yyleng; printf("EQ\n");}

">="    {col+=yyleng; printf("GE\n");}

">"    {col+=yyleng; printf("GT\n");}

"{"    {col+=yyleng; printf("LBRACE\n");}

"<="    {col+=yyleng; printf("LE\n");}

"("    {col+=yyleng; printf("LPAR\n");}

"["    {col+=yyleng; printf("LSQ\n");}

"<"    {col+=yyleng; printf("LT\n");}

"-"    {col+=yyleng; printf("MINUS\n");}

"%"    {col+=yyleng; printf("MOD\n");}

"!="    {col+=yyleng; printf("NE\n");}

"!"    {col+=yyleng; printf("NOT\n");}

"+"    {col+=yyleng; printf("PLUS\n");}

"}"    {col+=yyleng; printf("RBRACE\n");}

")"    {col+=yyleng; printf("RPAR\n");}

"]"    {col+=yyleng; printf("RSQ\n");}

";"    {col+=yyleng; printf("SEMI\n");}

\|\|    {col+=yyleng; printf("OR\n");}



{ids}    {col+=yyleng; printf("ID(%s)\n",yytext);}
{inteiros}    {col+=yyleng; printf("INTLIT(%s)\n", yytext);}
{strlit}    {col+=yyleng; printf("STRLIT(%s)\n", yytext);}
{chrlit}    {col+=yyleng; printf("CHRLIT(%s)\n", yytext);}


{chr_multi}    {if(col==0) {col++;err=1;}
            printf("Line %d, col %d: multi-character char constant\n", line, col);
            col+=yyleng;
            if(err == 1) {col--;err=0;}}

{chr_nonterm}    {if(col==0) {col++;err=1;}
            printf("Line %d, col %d: unterminated char constant\n", line, col);
            col+=yyleng;if(err == 1) {col--;err=0;}}

{strerr}    {if(col==0) {col++;err=1;}
            printf("Line %d, col %d: unterminated string constant\n", line,col);
            col+=yyleng;
            if(err == 1) {col--;err=0;}}

" "    {col++;};
'\n'    {col=1;line++;printf("BAR N\n");}
"\\n"    {col=1;line++;printf("BAR N2\n");}
\n    {col=1;line++;printf("BAR N3\n");}

.|\'    {printf("Line %d, col %d: illegal character ('%s')\n", line, col, yytext); col++;}

%%

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

int yywrap(){
    return 1;
}
4

1 に答える 1

1

コメントの改行が一致していません。改行.以外の任意の文字に一致します。

キーワードに一致するようにルールを修正した後 (2、3 を追加し|てすべてを 1 行に入れる)、プログラム改行が続く単一引用符で不正な文字を報告しました。したがって、予期しない結果をもたらす正確な入力をしてください。

仲間のブライアンからよろしく。

于 2013-03-27T23:03:46.360 に答える