Previous: Token Positions, Up: Lexical   [Contents][Index]


4.2.4 ºÆÆþ²Äǽ¹½Ê¸²òÀÏ´ï¤ò¸Æ¤Ó½Ð¤¹ÊýË¡

½ã¿è¤Ê¡¢¤Ä¤Þ¤êºÆÆþ²Äǽ¤Ê¡¢¹½Ê¸²òÀÏ´ï¤òÀ¸À®¤¹¤ë¤¿¤á¤Ë¡¢ %pure_parser¤òBisonÀë¸À¤¹¤ë¤È¡¢¹­°èÊÑ¿ôyylval¤È yylloc¤ò»È¤¨¤Ê¤¯¤Ê¤ê¤Þ¤¹ ¡Êsee A Pure (Reentrant) Parser¡Ë¡£ ¤³¤Î¤è¤¦¤Ê¹½Ê¸²òÀÏ´ï¤Ç¤Ï¡¢2¤Ä¤Î¹­°èÊÑ¿ô¤ÎÂå¤ï¤ê¤Ë¡¢ yylex¤Ø¤Î°ú¿ô¤È¤·¤ÆÅϤµ¤ì¤ë¥Ý¥¤¥ó¥¿¤ò»È¤¤¤Þ¤¹¡£ yylex¤ò¼¡¤Î¤è¤¦¤ËÀë¸À¤·¡¢ ¤³¤ì¤é¤Î¥Ý¥¤¥ó¥¿¤òÄ̤·¤Æ¾ðÊó¤ò¼õ¤±ÅϤ·¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

yylex (lvalp, llocp)
     YYSTYPE *lvalp;
     YYLTYPE *llocp;
{
  …
  *lvalp = value;  /* ÃͤòBison¥¹¥¿¥Ã¥¯¤ËÀѤࡣ  */
  return INT;      /* ¥È¡¼¥¯¥ó·¿¤òÊÖ¤¹¡£ */
  …
}

ʸˡ¥Õ¥¡¥¤¥ë¤¬¥Æ¥­¥¹¥ÈÃæ¤Î°ÌÃÖ¤ò»²¾È¤¹¤ë¤¿¤á¤Î‘@’µ¡Ç½¤ò »È¤Ã¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï¡¢YYLTYPE¤ÏÄêµÁ¤µ¤ì¤Þ¤»¤ó¡£ ¤³¤Î¾ì¹ç¡¢Âè2°ú¿ô¤ò¾Êά¤·¡¢yylex¤Ï 1¸Ä¤Î°ú¿ô¤ò¤È¤â¤Ê¤Ã¤Æ¸Æ¤Ó½Ð¤µ¤ì¤Þ¤¹¡£

ºÆÆþ²Äǽ¤Ê¹½Ê¸²òÀÏ´ï¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢ ºÆÆþ²Äǽ¤ÊÊýË¡¤Ç¹½Ê¸²òÀÏ´ï¤ËÄɲäΰú¿ô¤òÅϤ¹ÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ ¤½¤Î¤¿¤á¤Ë¤Ï¡¢¥Þ¥¯¥íYYPARSE_PARAM¤òÊÑ¿ô̾¤È¤·¤ÆÄêµÁ¤·¤Þ¤¹¡£ ¤¹¤ë¤È¡¢´Ø¿ôyyparse¤Ï¡¢ÄêµÁ¤µ¤ì¤¿Ì¾Á°¤Ç¡¢·¿¤¬void *¤Î Äɲäΰú¿ô¤ò¼õ¤±¼è¤ê¤Þ¤¹¡£

yyparse¤ò¸Æ¤Ó½Ð¤¹¤È¤­¤Ë¡¢¥ª¥Ö¥¸¥§¥¯¥È¤ÎÈÖÃϤò void *·¿¤Ë¥­¥ã¥¹¥È¤·¤ÆÅϤ·¤Þ¤¹¡£ ʸˡ¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢¥Ý¥¤¥ó¥¿¤òŬÀڤʷ¿¤Ø¤Î¥Ý¥¤¥ó¥¿¤Ø¥­¥ã¥¹¥È¤·¡¢ µÕ»²¾È¤·¤Æ¡¢¥ª¥Ö¥¸¥§¥¯¥È¤ÎÆâÍÆ¤ò»²¾È¤Ç¤­¤Þ¤¹¡£ Îã¤ò¼¨¤·¤Þ¤¹¡£

%{
struct parser_control
{
  int nastiness;
  int randomness;
};

#define YYPARSE_PARAM parm
%}

¼¡¤Î¤è¤¦¤Ë¹½Ê¸²òÀÏ´ï¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£

struct parser_control
{
  int nastiness;
  int randomness;
};

…

{
  struct parser_control foo;
  …  /* foo¤ËÀµ¤·¤¤¥Ç¡¼¥¿¤òµ­²±  */
  value = yyparse ((void *) &foo);
  …
}

ʸˡ¥¢¥¯¥·¥ç¥ó¤ÎÃæ¤Ç¤Ï¡¢¥Ç¡¼¥¿¤ò»²¾È¤¹¤ë¤¿¤á¤Ë¼¡¤Î¤è¤¦¤Ê¼°¤ò»È¤¤¤Þ¤¹¡£

((struct parser_control *) parm)->randomness

yylex¤ËÄɲäΰú¿ô¤òÅϤ·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢ YYPARSE_PARAM¤ÈƱÍͤˡ¢¥Þ¥¯¥íYYLEX_PARAM¤òÄêµÁ¤·¤Þ¤¹¡£ Îã¤ò¼¨¤·¤Þ¤¹¡£

%{
struct parser_control
{
  int nastiness;
  int randomness;
};

#define YYPARSE_PARAM parm
#define YYLEX_PARAM parm
%}

¤½¤·¤Æ¡¢yylex¤¬Äɲäΰú¿ô¡¢parm¤ÎÃͤò¼õ¤±¼è¤ë¤è¤¦¤Ë¡¢ yylex¤òÄêµÁ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹ ¡Ê·¿YYLTYPE¤Î¤É¤Î°ú¿ô¤¬ÅϤµ¤ì¤ë¤«¤Ë±þ¤¸¤Æ¡¢ °ú¿ô¤Î¹ç·×¤¬2¸Ä¤Þ¤¿¤Ï3¸Ä¤Ë¤Ê¤ê¤Þ¤¹¡Ë¡£ °ú¿ô¤òÀµ¤·¤¤¥ª¥Ö¥¸¥§¥¯¥È·¿¤È¤·¤ÆÀë¸À¤Ç¤­¤Þ¤¹¡£¤¹¤Ê¤ï¤Ávoid *¤È¤·¤Æ Àë¸À¤·¡¢¾åµ­¤ÎÈÖÃϤò»²¾È¤Ç¤­¤Þ¤¹¡£

YYPARSE_PARAM¤ò»È¤ï¤º¤Ë¡¢‘%pure_parser’¤ò»È¤Ã¤Æ¡¢ ºÆÆþ²Äǽ¤Ê¹½Ê¸²òÀÏ´ï¤òÀ¸À®¤¹¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£ ¤½¤Î¾ì¹ç¡¢°ú¿ô¤ò¤Ä¤±¤º¤Ëyyparse¤ò¸Æ¤Ó½Ð¤¹¤Ù¤­¤Ç¤¹¡£