2

入力ファイルからさまざまなデータ型を解析するパーサーがあります。私はすでに理解しました、その精神はshortとintの間で決定することができます、例えば:

value %= (shortIntNode | longIntNode);

shortIntNode %= (qi::short_ >> !qi::double_)
                [qi::_val = phoenix::bind(&CreateShortIntNode, qi::_1)];
longIntNode  %= (qi::int_ >> !qi::double_)
                [qi::_val = phoenix::bind(&CreateLongIntNode, qi::_1)];

このタイプのルールを使用して、doubleも検出しました(ここここの回答から)。パーサーは、65535を超える数値のintと65535未満の数値のshortのどちらかを決定できました。ただし、float_とdouble_の場合、期待どおりに機能しません。次のようなルールがある場合は、これらの値を丸めてfloat値に解析します。

 value %= (floatNode | doubleFloatNode);   

floatNode       %= (qi::float_)
                   [qi::_val = phoenix::bind(&CreateFloatNode, qi::_1)];
doubleFloatNode %= (qi::double_)
                   [qi::_val = phoenix::bind(&CreateDoubleFloatNode, qi::_1)];

データ型の範囲に応じてfloat_とdouble_のどちらかを決定するオプションやその他のトリックのようなものがあるかどうか知っていますか?

どうもありがとうございます!

4

1 に答える 1

4

字句解析が役立ちます。最終的には、パーサーではなく、あなたが決定します。ブランチを注文すると役立つはずです。も参照してください

BoostSpiritを使用した同様のパーサーの場合。

float / doubleのどちらかを決定する場合、実際の入力基準はありません。常にdoubleに解析することをお勧めします。ただし、もちろん、セマンティックアクションを使用して、特定のサイズのフロートを強制することもできます。

C ++文法の機能は次のとおりです(例):

floatrule  = lexeme [ float_ >> 'f' ];
doublerule = double_;

float_or_double = floatrule | doublerule;
于 2012-12-10T23:01:32.703 に答える