Next: YYSTYPE and yylval, Previous: Flex and Bison, Up: Flex and Bison [Contents][Index]
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: YYSTYPE and yylval, Previous: Flex and Bison, Up: Flex and Bison [Contents][Index]