2017-11-14 15 views
0

私はLex/Yaccを初めて使用しています。Yaccアクションは任意の変数(0)に対して0を返します

constant 
    : I_CONSTANT { printf("I_CONSTANT %d\n", $1); } 
    | F_CONSTANT 
    | ENUMERATION_CONSTANT /* after it has been defined as such */ 
    ; 

問題は、私はアクションを入れていない問題であり、何でも$:私は構文解析の一部を印刷するアクションを追加実験にANSI C.

を解析し、これらのlex & yaccファイルが見つかりました。 XIの使用、私は常に取得値ここで0

私が印刷されました:私の入力がある

I_CONSTANT 0 

にもかかわらず:

int foo(int x) 
{ 
    return 5; 
} 

+1

'I_CONSTANT'の場合、レクサーは' yylval'を通して実際の値を返しますか?おそらく、LexとYaccに関するチュートリアルを最初に検討するべきでしょうか? –

+0

@Someprogrammerdude入手しました。ありがとう! –

答えて

1

あなたが指すlexファイルには、実際にはどのトークンの意味値も設定されていません。作者が言うように、ファイルは単なる文法であり、 "仕事の大部分"は依然として実行する必要があります。 (プリプロセッサの必要性に関する他の警告があります)

lexファイルの中にはyylvalが設定されていないので、常に0になります。これはyacc/bisonが設定したものですトークンの意味値(この場合は$1)。

0

私はそれを自分で追加しなければならなかったので、yylval = atoi(yytext)がlexファイルで行われていません。また、yaccファイルのヘッダにextern char *yytextを追加して、yytextを直接使用することもできます。

+0

bisonファイルに 'yytext'を使わないでください。それは一般的に正しい値を持たないでしょう(たとえそれが特定のケースでうまくいくようであっても)。そうしたことを誰にも示唆しないでください。それは待っていることに大きな悪いバグです。 – rici

関連する問題