0

ユーザーが不完全な定義を入力したときにエラー出力を画面に表示しようとしています。例:

#define A  // this is wrong , error message should appear

#define A 5 // this is the correct form , no error message would be presented 

しかし、それは機能しません、ここにコードがあります:

%{
#include <stdio.h>
#include <string.h>
%}

%s FULLCOMMENT
%s LINECOMMENT
%s DEFINE
%s INCLUDE
%s PRINT
%s PSEUDO_C_CODE

STRING [^ \n]*

%%


<FULLCOMMENT>"*/"   {  BEGIN INITIAL; }
<FULLCOMMENT>.      { /* Do Nothing       */ }

<INCLUDE>"<stdio.h>"|"<stdlib.h>"|"<string.h>"  { BEGIN INITIAL;  }
<INCLUDE>.      { printf("error\n");    return 0 ;  }

<DEFINE>[ \t]       {  printf("eat a space within define\n"); } 
<DEFINE>{STRING}    {  printf("eat string %s\n" , yytext);}
<DEFINE>\n      {  printf("eat a break line within define\n"); BEGIN INITIAL; }



"#include"      {   BEGIN INCLUDE;  }
"#define"       {   printf("you gonna to define\n");   BEGIN DEFINE;    }
"#define"+.             {   printf("error\n");  }                                                                                                                                   

%%

int yywrap(void)  { return 1;  }  // Callback at end of file
int main(void)  { 
    yylex(); 
    return 0 ; 
} 

どこで私は間違えましたか ?

出力は次のとおりです。

a@ubuntu:~/Desktop$ ./a.out
#define A 4
error
A 4
#define A
error
A
4

1 に答える 1

1

ルール「#define」+。が長く、正しい入力であっても、以前の#defineよりも優先されます。あなたはこれだけを言うことができます:-

"#define" [:space:] * $ {printf( "error \ n"); }

詳細なデバッグ出力を取得するには、flexで-dvTオプションを使用することを検討してください。また、コメント以外の目的で、このように広範囲に状態を使用する必要があるかどうかもわかりません。しかし、あなたはもっとよく知っているでしょう。

于 2012-11-02T10:40:21.973 に答える