ʸˡ

ʸˡ¤Ï¥ë¡¼¥ë¤Î½¸¹ç¤ò¥«¥×¥»¥ë²½¤¹¤ë¡£ grammar ¥¯¥é¥¹¤ÏÁ´¤Æ¤Îʸˡ¤Î¥×¥í¥È¥³¥ë´ðÄ쥯¥é¥¹¤Ç¤¢¤ë¡£ ´ðËÜŪ¤Ë¤Ï¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹µ¬Ìó¤Ç¤¢¤ë[ÌõÃí¡§¡Ö¤³¤Î¥¯¥é¥¹¤«¤éÇÉÀ¸¤·¤Æ¤¯¤À¤µ¤¤¡×¤À¤±¤Ç¤Ê¤¯¡¢¡Ö¤³¤Î¤è¤¦¤Ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄêµÁ¤·¤Æ¤¯¤À¤µ¤¤¡×¤È¤¤¤¦µ¬Ì󤬤¢¤ë¤È¤¤¤¦¤³¤È]¡£ grammar ¤Ï¥Æ¥ó¥×¥ì¡¼¥È¥¯¥é¥¹¤Ç¤¢¤ê¡¢¤½¤ì¼«¿È¤ÎÇÉÀ¸¥¯¥é¥¹¤Ç¤¢¤ë DerivedT ¤È¡¢ ¥³¥ó¥Æ¥­¥¹¥È ContextT ¤Ë¤è¤Ã¤Æ¥Ñ¥é¥á¡¼¥¿²½¤µ¤ì¤ë¡£ ¥Æ¥ó¥×¥ì¡¼¥È¥Ñ¥é¥á¡¼¥¿ ContextT ¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏÄêµÁºÑ¤ß¥³¥ó¥Æ¥­¥¹¥È parser_context ¤Ç¤¢¤ë¡£ ʸˡ¤ÎÄã¥ì¥Ù¥ë¤Ê¿¶¤ëÉñ¤¤¤Ë¼ê¤ò²Ã¤¨¤¿¤¤¤Î¤Ç¤Ê¤¤¸Â¤ê¡¢ ContextT ¥Æ¥ó¥×¥ì¡¼¥È¥Ñ¥é¥á¡¼¥¿¤òµ¤¤Ë¤¹¤ëɬÍפϤޤ俤¯¤Ê¤¤¡£ ContextT ¥Æ¥ó¥×¥ì¡¼¥È¥Ñ¥é¥á¡¼¥¿¤Î¾ÜºÙ¤Ê¾ðÊó¤ÏÊ̤ΤȤ³¤í¤ÇÍ¿¤¨¤é¤ì¤ë¡£ grammar ¤Ï¥Æ¥ó¥×¥ì¡¼¥È¥Ñ¥é¥á¡¼¥¿ DerivedT ¤Ë°Í¸¤·¤Æ¤¤¤ë¡£ ¤³¤ì¤Ï¼ÂºÝ¤Ë¥ë¡¼¥ë¤òÄêµÁ¤·¤Æ¤¤¤ë grammar ¤Î¥µ¥Ö¥¯¥é¥¹¤Ç¤¢¤ë¡£

¾åµ­¤Ï¸ø³«¤µ¤ì¤¿ API ¤Ç¤¢¤ë¡£ ContextT ¤Î¸å¤Ë¤Ï¼ÂºÝ¤Ë¤Ï¤è¤ê¿¤¯¤Î¥Æ¥ó¥×¥ì¡¼¥È¥Ñ¥é¥á¡¼¥¿¤¬Â¸ºß¤·¤¦¤ë¡£ ContextT ¥Ñ¥é¥á¡¼¥¿¤Î¸å¤í¤Î¤¹¤Ù¤Æ¤Î¤â¤Î¤ÏÍøÍѼԤ˹Í褵¤ì¤ë¤Ù¤­¤Ç¤Ï¤Ê¤¯¡¢¸·³Ê¤ËÆâÉô¤Ç¤Î¤ß»ÈÍѤ¹¤Ù¤­¤â¤Î¤Ç¤¢¤ë¡£

    template<
        typename DerivedT,
        typename ContextT = parser_context>
    struct grammar;

ʸˡÄêµÁ

grammar ¤ò·Ñ¾µ¤·¤¿¶ñ¾Ý¥µ¥Ö¥¯¥é¥¹¤Ï definition ¤È¤¤¤¦ ¥Í¥¹¥È¤µ¤ì¤¿¥Æ¥ó¥×¥ì¡¼¥È¥¯¥é¥¹¡Ê¤Þ¤¿¤Ï¹½Â¤ÂΡˤò»ý¤Ä¤è¤¦Í׵ᤵ¤ì¤ë¡§

typename ScannerT ¤È¤¤¤¦¥Ñ¥é¥á¡¼¥¿¤ò»ý¤Ä¥Í¥¹¥È¤µ¤ì¤¿¥Æ¥ó¥×¥ì¡¼¥È¥¯¥é¥¹¤Ç¤¢¤ë¡£
¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç¥ë¡¼¥ë¤òÄêµÁ¤¹¤ë¡£
¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï¼ÂºÝ¤Îʸˡ self ¤Ø¤Î»²¾È¤òÅϤµ¤ì¤ë¡£
start ¤È¤¤¤¦Ì¾Á°¤Î¥á¥ó¥Ð´Ø¿ô¤ò»ý¤Á¡¢¤³¤ì¤Ï³«»Ï¥ë¡¼¥ë rule ¤Ø¤Î»²¾È¤òÊÖ¤¹¡£

ʸˡ¤Î³µÎ¬

    struct my_grammar : public grammar<my_grammar>
    {
        template <typename ScannerT>
        struct definition
        {
            rule<ScannerT>  r;
            definition(my_grammar const& self)  { r = /*..define here..*/; }
            rule<ScannerT> const& start() const { return r; }
        };
    };

ʸˡ¤ò·ÁÀ®¤¹¤ë¥ë¡¼¥ë¤«¤é¥¹¥­¥ã¥Ê¤ä¥¤¥Æ¥ì¡¼¥¿¤Î·¿¤òÀÚ¤êÎ¥¤¹¤³¤È¤Ï¡¢ ¤ª¤½¤é¤¯¤Ï°Û¤Ê¤ë¥¹¥­¥ã¥Ê¡¿¥¤¥Æ¥ì¡¼¥¿¤òÍѤ¤¤ë¤Ç¤¢¤í¤¦Ê̤Υ³¥ó¥Æ¥­¥¹¥È¤Î²¼¤Ç¤â¡¢¤½¤Îʸˡ¤¬»È¤¨¤ë¤è¤¦¤Ë¤¹¤ë¡£ ¤É¤ó¤Ê¥¹¥­¥ã¥Ê¤ò°·¤Ã¤Æ¤¤¤ë¤«¤òµ¤¤Ë¤¹¤ë¤³¤È¤Ï¤Ê¤¤¡£ ¥æ¡¼¥¶¤¬ÄêµÁ¤·¤¿ my_grammar ¤Ï¥¹¥­¥ã¥Ê·¿¤Ë´Ø·¸¤Ê¤¯¥¤¥ó¥¹¥¿¥ó¥¹²½¤µ¤ì¤ë¤³¤È¤¬¤Ç¤­¡¢ ¤¢¤é¤æ¤ë·¿¤Î¥¹¥­¥ã¥Ê¤òÍѤ¤¤ë¥Ñ¡¼¥µ¤È¤·¤Æ»È¤ï¤¦¤³¤È¤¬¤Ç¤­¤ë¡£ ¤¹¤Ê¤ï¤Á¡¢¥ë¡¼¥ë¤È¤Ï°Û¤Ê¤ê¡¢Ê¸Ë¡¤ÏÆÃÄê¤Î¥¹¥­¥ã¥Ê·¿¤Ë·ë¤Ó¤Ä¤±¤é¤ì¤Æ¤¤¤Ê¤¤¡£ ¤Ê¤¼¤³¤ì¤¬½ÅÍפǤ¢¤ë¤«Íý²ò¤·¡¢¤Þ¤¿¤³¤Î¥¹¥­¥ã¥Ê¤È¥ë¡¼¥ë¤ÎÁȤ߹ç¤ï¤»ÌäÂê¤Ë¤Ä¤¤¤Æ¤µ¤é¤Ê¤ëÍý²ò¤òÆÀ¤ë¤Ë¤Ï "¥¹¥­¥ã¥Ê¤ÎƯ¤­" ¤ò»²¾È¤·¤ÆÍߤ·¤¤¡£

my_grammar ¤Î¥¤¥ó¥¹¥¿¥ó¥¹²½¤È»ÈÍÑ

¤µ¤Æ¾å½Ò¤Îʸˡ¤ò¥¤¥ó¥¹¥¿¥ó¥¹²½¤·¤ÆÆ°ºî¤µ¤»¤Æ¤ß¤è¤¦¡§

    my_grammar g;

    if (parse(first, last, g, space_p).full)
        cout << "parsing succeeded\n";
    else
        cout << "parsing failed\n";

my_grammar ¤Ï¥Ñ¡¼¥µ¤Ç¤¢¤ë¡£ ¥Ñ¡¼¥µ¤¬´üÂÔ¤µ¤ì¤ë¤È¤³¤í¤Ê¤é¡¢¤½¤ì¤¬Î㤨¤Û¤«¤Î¥ë¡¼¥ë¤«¤é»²¾È¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ç¤¢¤Ã¤Æ¤â¡¢¤É¤³¤Ç¤Ç¤â»È¤¦¤³¤È¤¬¤Ç¤­¤ë¡§

    rule<>  r = g >> str_p("cool huh?");

´°Á´¤Êʸˡ¤ÎÎã

°Ê²¼¤Ï²æ¡¹¤Î¤â¤È¤â¤È¤ÎÅÅÂî¤ÎÎã¤Ç¤¢¤ë¤¬¡¢¤³¤³¤Ç¤Ïʸˡ¤òÍѤ¤¤Æ½ñ¤­Ä¾¤µ¤ì¤Æ¤¤¤ë¡§

    struct calculator : public grammar<calculator>
    {
        template <typename ScannerT>
        struct definition
        {
            definition(calculator const& self)
            {
                group       = '(' >> expression >> ')';
                factor      = integer | group;
                term        = factor >> *(('*' >> factor) | ('/' >> factor));
                expression  = term >> *(('+' >> term) | ('-' >> term));
            }

            rule<ScannerT> expression, term, factor, group;

            rule<ScannerT> const&
            start() const { return expression; }
        };
    };

¥»¥Þ¥ó¥Æ¥£¥Ã¥¯¥¢¥¯¥·¥ç¥ó¤òȼ¤¦´°Á´¤Ëưºî¤¹¤ëÎã¤Ï ¤³¤³¤«¤é¸«¤ë¤³¤È¤¬¤Ç¤­¤ë¡£ ¤³¤ì¤Ï Spirit ÇÛÉÛʪ¤Î°ìÉô¤Ç¤¢¤ë¡£
¡Î libs/spirit/example/fundamental/calc/calc_plain.cpp ¤ò»²¾È¡Ï

self

ʸˡ¤ÎÄêµÁ¤¬³°Â¦¤Îʸˡ¤Ø¤Î const ¤Ê»²¾È¤ò¼õ¤±¤ë¥³¥ó¥¹¥È¥é¥¯¥¿¤ò»ý¤Ä¤³¤È¤ªµ¤¤Å¤­¤À¤í¤¦¤«¡£ ¾åµ­¤ÎÎã¤Ç¤Ï¡¢ calculator::definition ¤¬ calculator const&self ¤ò¼è¤Ã¤Æ¤¤¤ë¤³¤È¤ËÃíÌÜ¡£ ¤³¤ì¤Ï¾åµ­¤ÎÎã¤Ç¤Ï»È¤ï¤ì¤Æ¤¤¤Ê¤¤¤¬¡¢Â¿¤¯¤Î¾ì¹ç¡¢Èó¾ï¤ËÍ­ÍѤǤ¢¤ë¡£ self °ú¿ô¤Ï definition ¤Î³°¤ÎÀ¤³¦¤Ø¤ÎÁë¤Ç¤¢¤ë¡£ Î㤨¤ÐÅÅÂ¥é¥¹¤Ï¡¢¹½Ê¸²òÀϽèÍý¤¬¿Ê¹Ô¤¹¤ë´Ö¤Ë definition ¤¬¥»¥Þ¥ó¥Æ¥£¥Ã¥¯¥¢¥¯¥·¥ç¥ó¤ò»È¤Ã¤Æ¹¹¿·¤Ç¤­¤ë¤¤¤¯¤Ä¤«¤Î¾õÂÖ¾ðÊó¤Ø¤Î»²¾È¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤ë¤À¤í¤¦¡£

ʸˡ¥«¥×¥»¥ë

¤¤¤µ¤µ¤«Ê£»¨¤Êʸˡ¤Î¾ì¹ç¡¢Ê¸Ë¡¤Î³ÆÉô¤òÏÀÍý¥â¥¸¥å¡¼¥ë¤Ë¥°¥ë¡¼¥×ʬ¤±¤¹¤ë¤Î¤ÏÎɤ¤¹Í¤¨¤Ç¤¢¤ë¡£ Î㤨¤Ð¡¢¤¢¤ë¸À¸ì¤ò½ñ¤¤¤Æ¤¤¤ë¤È¤­¡¢¼°¤ä¥¹¥Æ¡¼¥È¥á¥ó¥È¤òÊÌ¡¹¤Îʸˡ¥«¥×¥»¥ë¤Ë ʬ¤±¤Æ¤ª¤¯¤Î¤Ï¸­ÌÀ¤À¤í¤¦¡£ ¤½¤Îʸˡ¤Ï C++ ¥¯¥é¥¹¤Î¥«¥×¥»¥ë²½¤È¤¤¤¦À­¼Á¤ÎĹ½ê¤ò¼ê¤Ë¤¹¤ë¡£ ¥¯¥é¥¹¤ÎÀë¸ÀŪ¤ÊÀ­¼Á¤Ïʸˡ¤ÎÄêµÁ¤Ë´°àú¤ËŬ¤·¤Æ¤¤¤ë¡£ ʸˡ¤È¤Ï¥¯¥é¥¹Àë¸À°Ê³°¤Î²¿¼Ô¤Ç¤â¤Ê¤¤¤Î¤Ç¡¢¹¥ÅÔ¹ç¤Ê¤³¤È¤Ë¥Ø¥Ã¥À¡¼¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ç ¸øÉ½¤Ç¤­¤ë¡£ ¤Ò¤È¤¿¤Ó½ñ¤«¤ì¡¢´°Á´¤Ë¥Æ¥¹¥È¤µ¤ì¤¿Ê¸Ë¡¤Ï¡¢Â¿¤¯¤Îʸ̮¤ÇºÆÍøÍѤǤ­¤ë¤È¤¤¤¦¥¢¥¤¥Ç¥£¥¢¤Ç¤¢¤ë¡£ ʸˡ¥é¥¤¥Ö¥é¥ê¤È¤¤¤¦³µÇ°¤Ç¤¢¤ë¡£

ºÆÆþ²ÄǽÀ­¤È¥Þ¥ë¥Á¥¹¥ì¥Ã¥É½èÍý

ʸˡ¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ï°Û¤Ê¤ë¾ì½ê¤ÇÊ£¿ô²ó²¿¤ÎÌäÂê¤â¤Ê¤¯»È¤ï¤ì¤ë¤³¤È¤¬¤Ç¤­¤ë¡£ ¤½¤Î¼ÂÁõ¤Ï¤¤¤¯¤é¤«¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤òÈñ¤ä¤·¤Æ¤³¤ì¤òµö¤¹¤è¤¦¤Ë¥Á¥å¡¼¥ó¤µ¤ì¤Æ¤¤¤ë¡£ ¤·¤«¤·¡¢¤â¤·Ê¸Ë¡¤¬Ã±°ì¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤·¤«»ý¤¿¤Ê¤¤¤ÈÃΤäƤ¤¤ë¤Ê¤é¤Ð¡¢ ¾¯¤Ê¤«¤é¤Ì¥µ¥¤¥¯¥ë[ÌõÃí¡§ CPU ¤Î½èÍý¼þ´ü¡á½èÍý»þ´Ö]¤ä¥Ð¥¤¥È[ÌõÃí¡§¤Ä¤Þ¤ê¥á¥â¥êÍÆÎÌ]¤òÍÞ¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£ ¤â¤·¤³¤ì¤ò˾¤à¤Ê¤é¡¢¤¢¤é¤æ¤ë spirit ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ëÁ°¤Ë¡¢ ñ¤Ë BOOST_SPIRIT_SINGLE_GRAMAR_INSANCE ¤òÄêµÁ¤¹¤ì¤Ð¤è¤¤¡£

#define BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE

°ìÊý¤Ç¡¢¤â¤·¥Þ¥ë¥Á¥¹¥ì¥Ã¥É²½¤µ¤ì¤¿¥³¡¼¥É¤ÇÍѤ¤¤é¤ì¤ë¤È°Õ¿Þ¤µ¤ì¤Æ¤¤¤ëʸˡ¤Ç¤¢¤ë¤Ê¤é¤Ð¡¢ ¤¢¤é¤æ¤ë spirit ¥Ø¥Ã¥À¡¼¥Õ¥¡¥¤¥ë¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ëÁ°¤Ë BOOST_SPIRIT_THREADSAFE ¤ò ÄêµÁ¤¹¤ë¤Ù¤­¤Ç¤¢¤ë¡£¤³¤Î¾ì¹ç¡¢ Boost.Threads ¤â¥ê¥ó¥¯¤¹¤ëɬÍפ¬¤¢¤ë¤À¤í¤¦¡£

#define BOOST_SPIRIT_THREADSAFE



¤³¤Î¥É¥­¥å¥á¥ó¥È¤ÎÂоÝ: Boost Version 1.30.0
ºÇ¿·Èǥɥ­¥å¥á¥ó¥È¡Ê±Ñ¸ì¡Ë