1

次のlexファイルを使用して数値をトークンに変換しています。ただし、プログラムは浮動小数点数を正しく解析できません。デバッグのために、printfステートメントを追加しましたが、strtof関数が数値を正しく解析できないことを示しています。したがって、入力4.2を与えると、出力0が得られます。

%{
#include <stdlib.h>
void yyerror(char *);
#include "y.tab.h"
char *p = NULL;
%}

%%

[0-9]+\.[0-9]+  {
            printf("%s", yytext);
            yylval = strtof(yytext, &p);
            printf("%f has been read\n", yylval);
            return FLOAT;   
        }
[0-9]+      {       yylval = atoi(yytext);
            printf("%d (int) has been read\n", yylval); 
                return INTEGER;
        }

[-+*/\n]    {   printf("%s has been read", yytext);
            return *yytext;
        }

[ \t]       ;   /* skip whitespace */
.               {
            printf("Invalid character %s", yytext);
            yyerror("invalid character");
        }
%%

int yywrap(void) {
return 1;
}

上記のコードの問題はどこにありますか?同じ入力でstrtof関数(lexの外部)を使用しましたが、完全に機能しているようです。

ありがとう

4

1 に答える 1

1

デバッグのために、printfステートメントを追加しましたが、strtof関数が数値を正しく解析できないことを示しています。

悲しいことに、違います。printfステートメントは、yylval浮動小数点数として解釈された場合、フォーマットが0として出力されることを示しています%f。の結果については何も述べていませんstrtof

とは関係なく、次の2つのステートメントをプログラムlexの同じスコープに意味のある形で表示することはできません。C

printf("%f has been read\n", yylval);

printf("%d (int) has been read\n", yylval); 

yylvalは、intまたはのいずれか、またはどちらでもありdoubleませんが、両方にすることはできません。形式はprintf約束に相当することに注意してください。を使用する場合は、それを渡すことを%f約束します。それを確認する方法がないので、それはあなたの言葉にあなたを連れて行き、それが得るどんな議論もとして解釈します。に嘘をつくと、意味のない出力が得られます。妥当な警告レベル(または)で プログラムをコンパイルすると、コンパイラーは明らかな違反について警告します。これを行うことを強くお勧めします。printfdoubledoubleprintf-Wallgccclang

デフォルトyylvalでは。であることに注意してくださいint。あなたがそれを変えるために何もしなかったなら、それはあなたが持っているものです。

于 2012-12-10T00:45:10.957 に答える