Next: , Previous: The Database Language, Up: Another Example of Flex and Bison   [Contents][Index]


4.5.2 ¼ÂÁõ¡§¥³¥Þ¥ó¥Éʸ¥Ñ¡¼¥µ

¾å¤ÎÀá¤Ç¡¢ ¾®µ¬ÌϤʸÀ¸ì¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Þ¤·¤¿¡£ ¼¡¤Ë¤½¤ì¤ò¼ÂÁõ¤·¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤ç¤¦¡£ °Ê²¼¤Î¥Õ¥¡¥¤¥ë¤¬¤³¤ì¤ò¼Â¸½¤·¤Þ¤¹¡£

Ãí¡§¤³¤ì¤Ï¤¢¤¯¤Þ¤Ç¤â£±¤Ä¤ÎÎã¤È¤·¤Æ¸«¤Æ¤¯¤À¤µ¤¤¡£ ÆÃ¤Ëʸˡ¤ÎÉôʬ¤Ï¡¢ ±Ñ¸ì¤Î¥Ñ¡¼¥¹½èÍý¤È¤·¤Æ¤Ï¤¢¤Þ¤êÎɤ¤Îã¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£

°Ê²¼¤ÏBison¤Î¥Õ¥¡¥¤¥ë¤Ç¤¹¡£ %union¤ÎÉôʬ¡¢ ¤ª¤è¤Ó¡¢ yylval¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤¿¤á¤Ë$$¤È$n¤ò»È¤¦ÊýË¡¤ËÃíÌܤ·¤Æ¤¯¤À¤µ¤¤¡£

/* C¥³¡¼¥É¤Ï¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬¤ÇÄ󶡤¹¤ë */

%{

#include <stdio.h>                          
#include <string.h>

extern int  yylexlinenum;  /* lex.yy.c¤Ë¸ºß¤¹¤ë */
extern char *yytext;       /* ¥«¥ì¥ó¥È¡¦¥È¡¼¥¯¥ó */

%}

/* ¥­¡¼¥ï¡¼¥É¤ÈͽÌó¸ì¤¬¤³¤³¤«¤é»Ï¤Þ¤ë */

%union{                    /* ¤³¤ì¤Ï¥Ç¡¼¥¿¤Î¶¦ÍÑÂÎ */
    char   name[128];      /* ̾Á°                 */
}

/*------------- ͽÌó¸ì ------------------*/

%token PERIOD
%token NEWLINE
%token POSITIONAL

%token VERB
%token ADVERB

%token PROPER_NOUN
%token NOUN

%token DECLARATIVE
%token CONDITIONAL
%type  <name> declarative
%type  <name> verb_phrase
%type  <name> noun_phrase
%type  <name> position_phrase
%type  <name> adverb

%type  <name> POSITIONAL VERB ADVERB PROPER_NOUN 
%type  <name> NOUN DECLARATIVE CONDITIONAL

%%

sentence_list : sentence
              | sentence_list NEWLINE sentence
              ;
sentence : verb_phrase noun_phrase position_phrase 
           adverb period 
           {
             printf("I understand that sentence.\n");
             printf("VP = %s \n",$1);
             printf("NP = %s \n",$2);
             printf("PP = %s \n",$3);
             printf("AD = %s \n",$4);
           }
         | { yyerror("That's a strange sentence!");  }
         ;

position_phrase : POSITIONAL  declarative PROPER_NOUN 
                  {
                    sprintf($$,"%s %s %s",$1,$2,$3);
                  }   
                | /* ¶õ */ { strcpy($$,""); }
                ;
verb_phrase : VERB { strcpy($$,$1); strcat($$," "); }
            | adverb VERB  
              {
                sprintf($$,"%s %s",$1,$2);
              }
            ;

adverb : ADVERB      { strcpy($$,$1); }
       | /* ¶õ */    { strcpy($$,""); }
       ;

noun_phrase : DECLARATIVE NOUN 
              {
                sprintf($$,"%s %s",$1,$2);
              }
            | CONDITIONAL declarative NOUN 
              {
                sprintf($$,"%s %s %s",$1,$2,$3);
              }   
            | NOUN { strcpy($$,$1); strcat($$," "); }
            ;

declarative : DECLARATIVE { strcpy($$,$1); }
            | /* ¶õ */    { strcpy($$,""); }
            ;

period : /* ¶õ */
       | PERIOD
       ;

%%

/* main()¤ª¤è¤Óyyerror()´Ø¿ô¤òÄ󶡤¹¤ë */

void main(int argc, char **argv)
{
  yyparse();       /* ¥Õ¥¡¥¤¥ë¤ò¥Ñ¡¼¥¹¤¹¤ë */
}

int yyerror(char *message)
{
  extern FILE *yyout;

  fprintf(yyout,"\nError at line %5d.  (%s) \n",
                     yylexlinenum,message);
}

°Ê²¼¤ÏFlex¤Î¥Õ¥¡¥¤¥ë¤Ç¤¹¡£ ʸ»úÎó¤¬ÅϤµ¤ì¤ëÊýË¡¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤³¤ì¤ÏºÇŬ²½¤µ¤ì¤¿ÊýË¡¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢ ºÇ¤âÍý²ò¤·¤ä¤¹¤¤ÊýË¡¤Ç¤¹¡£

%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"      /* ¤³¤ì¤ÏBison¤Ë¤è¤êÀ¸À®¤µ¤ì¤ë */

#define TRUE  1
#define FALSE 0

#define copy_and_return(token_type) \
         { \
             strcpy(yylval.name,yytext);\
             return(token_type); \
         }

int yylexlinenum = 0;  /* ¹Ô¿ô¥«¥¦¥ó¥ÈÍÑ */
%}

%%
   /* »ú¶ç²òÀϥ롼¥ë¤¬¤³¤³¤«¤é»Ï¤Þ¤ë */

MEN|WOMEN|STOCKS|TREES      copy_and_return(NOUN)
MISTAKES|GNUS|EMPLOYEES     copy_and_return(NOUN)
LOSERS|USERS|CARS|WINDOWS   copy_and_return(NOUN)

DATABASE|NETWORK|FSF|GNU    copy_and_return(PROPER_NOUN)
COMPANY|HOUSE|OFFICE|LPF    copy_and_return(PROPER_NOUN)

THE|THIS|THAT|THOSE         copy_and_return(DECLARATIVE)

ALL|FIRST|LAST              copy_and_return(CONDITIONAL)

FIND|SEARCH|SORT|ERASE|KILL copy_and_return(VERB)
ADD|REMOVE|DELETE|PRINT     copy_and_return(VERB)

QUICKLY|SLOWLY|CAREFULLY    copy_and_return(ADVERB)

IN|AT|ON|AROUND|INSIDE|ON   copy_and_return(POSITIONAL)

"."                         return(PERIOD);                             
"\n"                        yylexlinenum++; return(NEWLINE);            
.  
%%

¤³¤ì¤é¤Î¥Õ¥¡¥¤¥ë¤Ï¡¢ °Ê²¼¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ç¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤Þ¤¹¡£

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

¤Þ¤¿¤Ï¡¢ ¤³¤ÎÎã¤Î¥½¡¼¥¹¤¬¼ê¸µ¤Ë¤¢¤ì¤Ð¡¢ examples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤ª¤¤¤Æ‘make front’¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ç¤â¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤Þ¤¹¡£

Ãí¡§Bison¥Ñ¡¼¥µ¤Ïalloca.c¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤òɬÍפȤ·¤Þ¤¹¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤Ïexamples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤¢¤ê¤Þ¤¹¡£ Bison¤ÎÂå¤ï¤ê¤Ëyacc¤ò»È¤¦¤Î¤Ç¤¢¤ì¤Ð¡¢ ¤³¤Î¥Õ¥¡¥¤¥ë¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£


Next: , Previous: The Database Language, Up: Another Example of Flex and Bison   [Contents][Index]