| ʸˡ |
![]() |
![]() |
![]() |
ʸˡ¤Ï¥ë¡¼¥ë¤Î½¸¹ç¤ò¥«¥×¥»¥ë²½¤¹¤ë¡£ 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 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 ¤ò»²¾È¡Ï
ʸˡ¤ÎÄêµÁ¤¬³°Â¦¤Îʸˡ¤Ø¤Î 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
![]() |
![]() |
![]() |
Copyright © 1998-2003 Joel de Guzman
Permission to copy, use, modify, sell and distribute this document
is granted provided this copyright notice appears in all copies. This document
is provided "as is" without express or implied warranty, and with
no claim as to its suitability for any purpose.
Japanese Translation Copyright © 2003 Kent.N
¥ª¥ê¥¸¥Ê¥ë¤Î¡¢µÚ¤Ó¤³¤ÎÃøºî¸¢É½¼¨¤¬Á´¤Æ¤ÎÊ£À½¤ÎÃæ¤Ë¸½¤ì¤ë¸Â¤ê¡¢¤³¤Îʸ½ñ¤ÎÊ£À½¡¢ÍøÍÑ¡¢Êѹ¹¡¢ÈÎÇ䤽¤·¤ÆÇÛÉÛ¤òǧ¤á¤ë¡£¤³¤Î¥É¥¥å¥á¥ó¥È¤Ï¡Ö¤¢¤ë¤¬¤Þ¤Þ¡×¤ËÄ󶡤µ¤ì¤Æ¤ª¤ê¡¢¤¤¤«¤Ê¤ëÌÀ¼¨Åª¡¢°ÅÌÛŪÊݾڤâ¹Ô¤ï¤Ê¤¤¡£¤Þ¤¿¡¢¤¤¤«¤Ê¤ëÌÜŪ¤ËÂФ·¤Æ¤â¡¢¤½¤ÎÍøÍѤ¬Å¬¤·¤Æ¤¤¤ë¤³¤È¤ò´ØÃΤ·¤Ê¤¤¡£
¤³¤Î¥É¥¥å¥á¥ó¥È¤ÎÂоÝ: Boost Version 1.30.0
ºÇ¿·Èǥɥ¥å¥á¥ó¥È¡Ê±Ñ¸ì¡Ë