2017-09-25 20 views
2

私はと協力していますレキシカル分析このため私はFlexを使用しており、以下の問題を取ります。関数 'yylex': '変数'は宣言されていません

work.l

int cnt = 0,num_lines=0,num_chars=0; // Problem here. 
%% 
[" "]+[a-zA-Z0-9]+  {++cnt;} 
\n {++num_lines; ++num_chars;} 
. {++num_chars;} 
%% 
int yywrap() 
{ 
    return 1; 
} 
int main() 
{ yyin = freopen("in.txt", "r", stdin); 
    yylex(); 
    printf("%d %d %d\n", cnt, num_lines,num_chars); 
    return 0; 
} 

そして、私は、次のコマンドを使用し、それが正常に動作してlex.yy.cを作成します。

Rezwans-のiMac:laqb-2 rezwan $フレックスwork.l


そして、私は、以下のコマンドを使用します。 error

となっ-ob laqb-2 rezwanの$のgcc lex.yy.cを::

Rezwans-のiMac

work.l: In function ‘yylex’: 
work.l:3:4: error: ‘cnt’ undeclared (first use in this function); did you mean int’? 
[" "]+[a-zA-Z0-9]+ {++cnt;} 
    ^~~ 
    int 
work.l:3:4: note: each undeclared identifier is reported only once for each function it appears in 
work.l:4:4: error: ‘num_lines’ undeclared (first use in this function) 
\n {++num_lines; ++num_chars;} 
    ^~~~~~~~~ 
work.l:4:17: error: ‘num_chars’ undeclared (first use in this function); did you mean ‘num_lines’? 
\n {++num_lines; ++num_chars;} 
       ^~~~~~~~~ 
       num_lines 
work.l: In function ‘main’: 
work.l:15:23: error: ‘cnt’ undeclared (first use in this function); did you mean ‘int’? 
    return 0; 
        ^ 
         int 
work.l:15:28: error: ‘num_lines’ undeclared (first use in this function) 
    return 0; 
          ^  
work.l:15:38: error: ‘num_chars’ undeclared (first use in this function); did you mean ‘num_lines’? 
    return 0; 
            ^  
             num_lines 

私ならば、私は、error上になっておりませんこのようなファイルをwork.lに変更してください。私は、この行の前にint cnt = 0,num_lines=0,num_chars=0;1 tabを使用する場合は、と言うことです

int cnt = 0,num_lines=0,num_chars=0; // then work properly above command. 
%% 
[" "]+[a-zA-Z0-9]+  {++cnt;} 
\n {++num_lines; ++num_chars;} 
. {++num_chars;} 
%% 
int yywrap() 
{ 
    return 1; 
} 
int main() 
{ yyin = freopen("in.txt", "r", stdin); 
    yylex(); 
    printf("%d %d %d\n", cnt, num_lines,num_chars); 
    return 0; 
} 

は、それが正常に動作します。

  1. このラインint cnt = 0,num_lines=0,num_chars=0;前に、必要に応じて使用1 tabです:

    は今、私は2つの質問がありますか?どうして?論理的に説明する。

  2. このエラーを解決するためのもう1つの解決策はありますか?

+0

定義セクションの形式に関するドキュメントを読んだことがありますか? – molbdnilo

+0

うん@molbdnilo。しかし、私はそのようなものを見つけることができませんでした。 –

答えて

6

私はタブの問題について非常によく分からないが、1つの説明は、あなたがタブを配置し、最初のセクションには書いていない場合が何かということです:

int cnt = 0; 

はその後であることに注意代わりに数字を示すために、すべての時間[0-9]を書くのが何であるかの数字を定義する正規表現です

Digit [0-9] 

:最初のセクションでは、あなたはまた、のような「ショートカット」を書き込むことができます。

したがって、タブを使用せずに最初の列にint cnt = 0;を書き込むと、キーワードintを定義するようなものになります(これはおそらくエラーがdid you mean int’?を通知する原因です)。したがって、上記の2つのケースを区別する方法はタブです。

C /それは内部にする必要があり、C++コード書くためにを曲げるためによると:あなたの例のためにそう%{ ... c/c++ code... %}を:

%{ 
    int cnt = 0,num_lines=0,num_chars=0; 
%} 

だから私事が最良の方法は、あなたを書くことです内部のコードは%{ %}です。

+1

あなたの素敵な説明に感謝します。 –

関連する問題