Next: , Previous: Flex and Bison, Up: Flex and Bison   [Contents][Index]


4.4.1 Flex¤ÈBison¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹

Flex¤ÈBison¤Î´Ö¤Ç¾ðÊó¤òÅϤ¹´ðËÜŪ¤ÊÊýË¡¤Ï¡¢ ´Ø¿ôyylex()¤ò»È¤¦¤³¤È¤Ç¤¹¡£ ¤³¤ì¤Ï¡¢ Flex¤Ë¤è¤êÀ¸À®¤µ¤ì¤ë¥¹¥­¥ã¥Ê¤Ë¤ª¤¤¤Æ¡¢ ¥¹¥­¥ã¥ó½èÍý¤ò¼Â¹Ô¤¹¤ë´Ø¿ô¤Î̾Á°¤Ç¤¹¡£ Flex¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥¢¥¯¥·¥ç¥óÉôʬ¤Ë¤ª¤¤¤Æreturnʸ¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤Æ¡¢ ñ¤Ê¤ë0¤ä1°Ê³°¤ÎÃͤòÊÖ¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ¤³¤ÎÊýË¡¤Ç¡¢ yylex()¤ÏºÇ¸å¤Ëǧ¼±¤µ¤ì¤¿¥È¡¼¥¯¥ó¤òɽ¤¹À°¿ôÃͤòÊÖ¤¹¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

Bison¤ò‘-d’¥ª¥×¥·¥ç¥óÉÕ¤­¤Ç»È¤¦¤È¡¢ Bison¤Ï.tab.h¤È¤¤¤¦³ÈÄ¥»Ò¤ò»ý¤Ä¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢ µ­½Ò¾ðÊóÃæ¤Ë¤¢¤ëÀµÅö¤Ê¥È¡¼¥¯¥ó¤Î£±¤Ä£±¤Ä¤ËÂФ¹¤ë°ì°Õ¤ÊÄêµÁ¾ðÊ󤬴ޤޤì¤Þ¤¹¡£ ¤³¤Î½ÐÎϾðÊó¤Ï¡¢ ÆÃ¤Ë¥¹¥­¥ã¥Ê¤Ë¤è¤Ã¤Æ»ÈÍѤµ¤ì¤ë¤³¤È¤òÁÛÄꤷ¤ÆÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤òFlex¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿¥¹¥­¥ã¥Ê¤Ë´Þ¤á¤ë¤³¤È¤Ç¡¢ £²¤Ä¤Î¥×¥í¥°¥é¥à¤Î´Ö¤ËÈó¾ï¤ËÌÀ³Î¤Ê¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤òºî¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ Îã¤È¤·¤Æ¡¢ °Ê²¼¤ËBison¤Î¥Õ¥¡¥¤¥ë¤ò¼¨¤·¤Þ¤¹¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤Î̾Á°¤òexpr.y¤È¤·¤Þ¤·¤ç¤¦¡£

/*
 * expr.y : Bison¥Þ¥Ë¥å¥¢¥ëÃæ¤ÎÎã¤Ë´ð¤Å¤¯
 *          Bison¤Ë¤è¤ë´Êñ¤Êɽ¸½¼°¥Ñ¡¼¥µ
 */

%{
#include <stdio.h>
#include <math.h>

%}

%union {
   float val;
}

%token NUMBER
%token PLUS MINUS MULT DIV EXPON
%token EOL
%token LB RB

%left  MINUS PLUS
%left  MULT DIV
%right EXPON

%type  <val> exp NUMBER

%%
input   :
        | input line
        ;

line    : EOL
        | exp EOL { printf("%g\n",$1);}

exp     : NUMBER                 { $$ = $1;        }
        | exp PLUS  exp          { $$ = $1 + $3;   }
        | exp MINUS exp          { $$ = $1 - $3;   }
        | exp MULT  exp          { $$ = $1 * $3;   }
        | exp DIV   exp          { $$ = $1 / $3;   }
        | MINUS  exp %prec MINUS { $$ = -$2;       }
        | exp EXPON exp          { $$ = pow($1,$3);}
        | LB exp RB              { $$ = $2;        }
        ;

%%

void yyerror(char *s)
{
  printf("%s\n",s);
}

int main()
{
  yyparse();
}

¤³¤ì¤ÏÈó¾ï¤Ë´Êñ¤Ê·×»»µ¡¤ÎʸˡÄêµÁ¤Ç¤¹¡£

-y -d’¥ª¥×¥·¥ç¥óÉÕ¤­¤Ç¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢ Bison¤Ïy.tab.h¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤òÀ¸À®¤·¤Þ¤¹¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤ÊÄêµÁ¤«¡¢ ¤½¤ì¤Ë¤­¤ï¤á¤Æ¤è¤¯»÷¤¿ÄêµÁ¤¬´Þ¤Þ¤ì¤Þ¤¹¡£

typedef union  {
   float val;
} YYSTYPE;
extern YYSTYPE yylval;
#define NUMBER  258
#define PLUS    259
#define MINUS   260
#define MULT    261
#define DIV     262
#define EXPON   263
#define EOL     264
#define LB      265
#define RB      266

Flex¤¬¥È¡¼¥¯¥ó¤ÎÃͤòÀµ¤·¤¯Bison¤ËÊÖ¤¹¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¡¢ ¡Ê#include¤ò»È¤Ã¤Æ¡Ë ¤³¤ì¤ò¥¹¥­¥ã¥Ê¤Ë´Þ¤á¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ¤½¤Î¥³¡¼¥É¤Ï°Ê²¼¤Î¤è¤¦¤Ê¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£

/*
 * expr.lex : ´Êñ¤Êɽ¸½¼°¥Ñ¡¼¥µ¤Î¤¿¤á¤Î¥¹¥­¥ã¥Ê
 */

%{
#include "y.tab.h"
%}

%%

[0-9]+     { yylval.val = atof(yytext);
             return(NUMBER);
           }
[0-9]+\.[0-9]+ { 
             sscanf(yytext,"%f",&yylval.val);
             return(NUMBER);
           }
"+"        return(PLUS);
"-"        return(MINUS);
"*"        return(MULT);
"/"        return(DIV);
"^"        return(EXPON);
"("        return(LB);
")"        return(RB);
\n         return(EOL);
.          { yyerror("Illegal character"); 
             return(EOL);
           }
%%

¾åµ­¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢ °Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

bison -d -y expr.y
flex -I  expr.lex
cc -o expr y.tab.c lex.yy.c alloca.c 

¤Þ¤¿¡¢ ¤³¤ÎÎã¤Î¥½¡¼¥¹¤¬¼ê¸µ¤Ë¤¢¤ì¤Ð¡¢ examples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤ª¤¤¤Æ‘make expr’¤ò¼Â¹Ô¤¹¤ë¤À¤±¤Ç¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤Þ¤¹¡£ ¤É¤Á¤é¤ÎÊýË¡¤Ç¤â¡¢ expr¤È¤¤¤¦Ì¾Á°¤Î´Êñ¤Ê·×»»µ¡¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ ¤³¤ì¤Ï°Ê²¼¤Î¤è¤¦¤Êɽ¸½¼°¤ò¥Ñ¡¼¥¹¤·¤Æ¡¢ ¤½¤Î·ë²Ì¤ò½ÐÎϤ·¤Þ¤¹¡£

1 + 2 * (199*2)

¤³¤ì¤ò¸«¤Æ¤ªÊ¬¤«¤ê¤Î¤è¤¦¤Ë¡¢ ¤³¤Î¼ï¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ÏÈó¾ï¤Ë½ÀÆð¤Ç¤¢¤ê¡¢ ¤«¤Ä¡¢ Êݼé¤âÈó¾ï¤ËÍÆ°×¤Ç¤¹¡£ ¡Ê¥È¡¼¥¯¥ó¤òÄêµÁ¤¹¤ë̾Á°¤¬ÊѤï¤é¤Ê¤¤¸Â¤ê¡Ë Bison¤ÈFlex¤Î´Ö¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤òÊѹ¹¤¹¤ë¤³¤È¤Ê¤¯¡¢ Flex¡¢ Bison¤¤¤º¤ì¤ÎÆþÎϾðÊó¤Ë¤ª¤¤¤Æ¤â¡¢ µ¡Ç½¤ÎÄɲääºï½ü¡¢ ÄêµÁ¤ä¥³¡¼¥É¤ÎÊѹ¹¤ò¹Ô¤¦¤³¤È¤¬²Äǽ¤Ç¤¹¡£

¤³¤ÎÎã¤Ç¤Ï¡¢ Flex¤ÈBison¤Î´Ö¤Ç¾ðÊó¤òÅϤ¹¤¿¤á¤ÎÊ̤ÎÊýË¡¤òƳÆþ¤·¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤³¤ÎÎã¤Ç¤Ï¡¢ ¿ô»ú¤ÎÃͤòBison¤ËÊÖ¤¹¤Î¤Ëyylval¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£ ¤³¤ì¤Ë¤Ä¤¤¤Æ¤Ï¼¡¤ÎÀá¤Ç¤è¤ê¾ÜºÙ¤ËÀâÌÀ¤·¤Þ¤¹¡£ ¤³¤³¤Ç¤Ï¤È¤ê¤¢¤¨¤º¡¢ returnʸ¤Î»È¤¤Êý¤ò³Ø¤ó¤Ç¤ª¤¤¤Æ¤¯¤À¤µ¤¤¡£

Ãí¡§¤³¤ì¤Ïñ½ã¤ÊÎã¤Ç¤¹¡£ ɽ¸½¼°¤Î¥Ñ¡¼¥¹½èÍý¤Ë¤Ä¤¤¤Æ¤è¤ê¾Ü¤·¤¯ÃΤꤿ¤¤¿Í¤Ï¡¢ Bison¤Î¥Þ¥Ë¥å¥¢¥ë¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£


Next: , Previous: Flex and Bison, Up: Flex and Bison   [Contents][Index]