lex & yaccãã¨ã¯ãã
ã¨ãã峿¸é¤¨ã§lex & yaccã¨ããæ¬ã廿£å¦çæ±ãããã¦ããã®ã§ãããã£ã¦ããã®ã§ããæ¶åãã¦ããªãã£ãã®ã§ãæ¶åãããã¦lex & yaccã«ã¤ãã¦ã®èª¿æ»ãªã©ãã¦ã¿ã¾ããã
ãããã§ã®è³æã¨ãã¦ã¯ Lex and Yacc Primerã®è³æãç§é¸ã§ãã¨ããããããã«æ¸ãã¦ããäºãçè§£ããã°æä½élex & yaccã使ããããã«ãªããã¨æãã¾ãã
lex & yacc ã«ããã¦ãè¨èªå¦çãä½ãã«ãããã©ã£ã¡ãéè¦ãã¨ããäºã«ãªãã¨ãã¯ãyaccã®æ¹ãéè¦ï¼ï¼ãã¨ããã®ã¯lexã£ã¦ã®ã¯åå¥è§£æãªã®ã§é å¼µãã°èªåã§ãæ§ç¯å¯è½ã ããã§ããyaccã®æ§æè§£æãé å¼µãã°ç¡çãããªãããããã¾ããããã¤ãã¨æãã¾ãã
ã¨ã£ã¤ããããã®ã¯ã©ã¡ããã¨ããã¨lexã®æ¹ã§ãããlexã¯åä½ã§ãåå¥è§£æãã§ãããããã®ã§ãlexåä½ã§ãã¡ãã£ã¨ããäºã¯ã§ããã®ã§ãããyaccã®å ´åã¯å¦çå å®¹ã¯æ§æè§£æã§ããã®ã§ãåå¥è§£æã®å¦çã¯ããªãã®ã§å¤é¨ããã°ã©ã ãé ¼ãã«ãªãããã§ããã¾ãyaccã使ãéã«ã¯åå¥è§£æãå¿ è¦ã¨ãªãã¨ãã訳ãªã®ã§ãããã¨ããããã§ãyaccã使ãéã«ã¯lexã¨ãèªä½ï¼åå¥è§£æã使ãå¿ è¦ãããã®ã§ãããã
å®éã®è¨èªå¦çã ã¨yaccç¨ã®ãã¡ã¤ã«ã¯ããããã©ãlexç¨ã®ã¯ç¡ãã¨ãããã¿ã¼ã³ãå¤ãï¼æãããã¾ãããã¯ãããã¨ããããã§yaccéè¦ã LR LR !!!
ã¨ããããlexããããã£ã¦ã¿ãã
lexã®ããã°ã©ã ã¯åç´ã§ãæ£è¦è¡¨ç¾ãå©ç¨ãã¦åå¥è§£æãããã ãã§ãã
以ä¸ã¯ç°¡åãªãµã³ãã«
%{ #include <stdio.h> %} %% tukasa printf("barusamikosu~~\n"); kagami printf("kagaminmin\n");; konata printf("konatanntann\n"); %%
ã§ããã®ãã¡ã¤ã«ãtest.lã¨ãã¦ä¿åã以ä¸ã®ããã«ã³ã³ãã¤ã«ããã¨
gcc -o test test.l -ll
testãã¤ããªãã§ããã®ã§ãåå¥è§£æãåºæ¥ã¦ããã調ã¹ã. tukasa, kagami, konataã¨ãã£ãæãã§å ¥åããã¨ä»¥ä¸ã®ãããªæãã«ãªãã¯ã
./test
tukasa
barusamikosu~~kagami
kagaminminkonata
konatanntann
ã¨ããããlexã®æä½é度ã®åä½ã確èªã§ãããæ¬¡ã¯yaccã¨ã®é£æºãè¡ãã
yaccã¨lexã¨ã®é£æºã«é¢ãã¦lexã§è¡ãäºã¯ã¨ããã¨ãyaccã§å®ç¾©ãããã¼ã¯ã³ã¨ãããã®ãlexå é¨ã§åå¥è§£æãè¡ãè¿ãã¦ãyaccã§ã¯ãã®è¿ãå¤(ãã¼ã¯ã³)ããã¨ã«yaccå é¨ã§å®ç¾©ããææ³å®ç¾©ãå ã«è²ã ã¨å¦çããã¦ããï¼ï¼ï¼ãã¨ããæããã
ã¨ããããã§lexå é¨ã§ã¯ãyaccã§å®ç¾©ããå®ç¾©ãåèããããã«yaccãã¡ã¤ã«ãyaccã³ãã³ããè¡ã£ãéã«ç¾ãããy.tab.hãã¤ã³ã¯ã«ã¼ãããå¿ è¦ãããã¨ãã訳ãªãã§ãããã主å¾é¢ä¿çã«èããã¨yaccã®æ¹ãä¸çãªãã¸ã·ã§ã³ã¨ãã£ã¦ããããã§ããã
䏿¹ãyaccã¯ã¨ããã¨ããã£ã¡ã¯ææ³ãå®ç¾©ãã¦æ§æè§£æãè¡ãã¨ãã¾ãã
ã¨ããããç°¡åãªãµã³ãã«ã½ã¼ã¹ãä½ã£ãã®ã§æ²è¼ãªã©
ã¨ãããããã¡ã¤ã«åã¯tete.l tete.y ã¨ãã
tete.l
%{ #include <stdio.h> #include "y.tab.h" %} %% tukasa return TUKASA; kagami return KAGAMI; konata return KONATA; [0-9]+ yylval=atoi(yytext); return NUMBER; %%
ã¡ãªã¿ã«returnããããã¦ããNUMBERã¨ãã¯yaccãã¡ã¤ã«å é¨ã§å®ç¾©ãã¦ãã¾ã
tete.y
%{ #include <stdio.h> #include <string.h> void yyerror(const char *str) { fprintf(stderr,"error: %s\n",str); } int yywrap() { return 1; } main() { yyparse(); } %} %token TUKASA KAGAMI KONATA NUMBER %% commands: | commands command ; command: TUKASA NUMBER { printf("\tTUKASA is %d\n",$2); } ;
ã¨ã¾ããããªæãã§ã¨ãããã使ãã¦ãã¾ããyaccã®ææ³å®ç¾©ã¯TUKASA NUMBERã ããªã®ã§ããã®ææ³ã«ããã°TUKASA is %d(ãªããæ°å) ãåºåããã¾ãã
ã¨ããããã³ã³ãã¤ã«
ã§ããã¤ããªãå®è¡ãã. ãã¹ãã¨ãã¦tukasa 1, tukasa 3, tukasa 33ãªã©ã¨å ¥åãã¦ã¿ã
./tete
tukasa 1
TUKASA is 1tukasa 3
TUKASA is 3tukasa 33
TUKASA is 33
ã¨ã¾ããããªæãã§åºåãããã¯ãã§ããããã§æä½é度lex & yaccã®é£æºãã§ããã®ã§å¾ã¯ãããæ¡å¼µããã°ç°¡åãªè¨èªå¦çã¨ãã§ããããï¼ï¼ãã¨ããããã§ããã
åèãªã³ã¯:
- Lex and Yacc Primer
- ããã³ãµã³ãã«ã½ã¼ã¹
- ããã°ã©ãã³ã°è¨èªå¦ç
- çæ³¢ã®è³æ tinyCã¨ããCã©ã¤ã¯ãªè¨èªå¦çç³»ãyaccã使ãäºã§ä½ã£ã¦ããã
- Cã³ã³ãã¤ã©è¨è¨(yacc lexã®å¿ç¨
- Cã³ã³ãã¤ã©ãä½ãããã¨ãã«å½¹ç«ã¤ãã¨