JLex specificationÀº %%·Î ±¸ºÐµÈ ¼¼ sectionÀ¸·Î ±¸¼ºµÈ´Ù. Çü½ÄÀº ´ÙÀ½°ú °°´Ù
»ç¿ëÀÚ ÄÚµå %% JLex Áö½Ã¹® %% Á¤±Ô½Ä rules |
specification ÆÄÀÏÀÇ Ã¹ sectionÀÎ »ç¿ëÀÚ ÄÚµå sectionÀº Ãâ·Â ÆÄÀÏ¿¡ ±×´ë·Î º¹»çµÇ´Â ºÎºÐÀÌ´Ù. ÀÌ ¿µ¿ªÀº À¯Æ¿¸®Æ¼ Ŭ·¡½º³ª ¸®ÅÏ typeÀ» ±â¼úÇÒ ¼ö ÀÖµµ·Ï Á¦°øµÇ´Â °ø°£ÀÌ´Ù.
µÎ ¹ø °ÀÎ JLex Áö½Ã¹® section¿¡¼´Â, ¸ÅÅ©·Î°¡ Á¤ÀÇµÇ°í »óÅ À̸§ÀÌ ¼±¾ðµÈ´Ù.
¼¼ ¹øÂ° section¿¡¼´Â lexical analyzerÀÇ ruleÀÌ Á¤ÀǵȴÙ. : °¢ ruleÀº option »óÅ list, Á¤±Ô½Ä, actionÀÇ ¼¼ ºÎºÐÀ¸·Î ±¸¼ºµÈ´Ù.
»ç¿ëÀÚ ÄÚµå´Â ù ¹øÂ° %%ÀÇ ¾ÕºÎºÐ¿¡ ÇØ´çµÇ¸ç À̰÷ÀÇ ³»¿ëÀº, JLexÀÇ Ãâ·Â¹°ÀÎ lexical analyzer ¼Ò½ºÄÚµåÀÇ Ã³À½¿¡ ±×´ë·Î º¹»çµÈ´Ù. µû¶ó¼, lexer ¼Ò½º°¡ package ¼±¾ðÀ̳ª Áß¿ä ¿ÜºÎ Å¬·¡½º¸¦ ÇÊ¿ä·Î ÇÏ´Â °æ¿ì, »ç¿ëÀÚ ÄÚµå section ù ºÎºÐ¿¡ ¼±¾ðÇÒ ¼ö ÀÖ´Ù.
JLex Áö½Ã¹® sectionÀº ù ¹øÂ° %%¿¡¼ºÎÅÍ µÎ ¹øÂ° %%±îÁö °è¼ÓµÈ´Ù. °¢ JLex Áö½Ã¹®Àº ÁÙÀÇ Ã³À½ºÎÅÍ ½ÃÀÛµÇ¾î ±× ÁÙ¿¡¼ ¾È¿¡¼ ³¡³ª¾ß ÇÑ´Ù.
%{...%} Áö½Ã¹®¾È¿¡´Â lexical analyzer Ŭ·¡½º¿¡ º¹»çµÉ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. Çü½ÄÀº ´ÙÀ½°ú °°´Ù.
%{ <code> %} |
class Yylex { ... <code> ... } |
%init{ ... %init} Áö½Ã¹®¾È¿¡´Â lexical analyzer Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡ º¹»çµÉ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
%init{ <code> %init} |
class YYlex { Yylex( ) { ... <code> ... } } |
%init{ ... %init} Áö½Ã¹®¾È¿¡¼´Â exceptionÀ» throwÇϰųª ´Ù¸¥ ÇÔ¼ö·ÎºÎÅÍÀÇ °ÍÀ» ÀüÆÄ½Ãų ¼ö ÀÖ´Ù. À̵é exceptionÀ» ¼±¾ðÇÏ·Á¸é %initthrow{ ... %initthrow} Áö½Ã¹®À» »ç¿ëÇÏ¸é µÈ´Ù.
%initthrow{ <exception[1]>[,<exception[1]>,...] %initthrow} |
Yylex() throws <exception[1]>[,<exception[1]>,...] { ... <code> ... } |
%eof{ ... %eof} Áö½Ã¹®¾È¿¡´Â lexical analyzer Ŭ·¡½º°¡ end-of-fileÀ» ¸¸³ ÀÌÈÄ¿¡ ¼öÇàÇÒ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
%eof{ <code> %eof} |
%eof{ ... %eof} Áö½Ã¹®¾ÈÀÇ codeµéÀº exceptionÀ» throwÇϰųª ´Ù¸¥ ÇÔ¼ö·ÎºÎÅÍÀÇ °ÍÀ» ÀüÆÄ½Ãų ¼ö ÀÖ´Ù. À̵é exceptionÀ» ¼±¾ðÇÏ·Á¸é %eofthrow{ ... %eofthrow} Áö½Ã¹®À» »ç¿ëÇÏ¸é µÈ´Ù.
%eofthrow{ <exception[1]>[,<exception[1]>,...] %eofthrow} |
private void yy_do_eof() throws <exception[1]>[,<exception[1]>,...] { ... <code> ... } |
¸ÅÅ©·Î Á¤ÀÇ´Â specification ÆÄÀÏÀÇ JLex Áö½Ã¹® section¿¡¼ ÀÌ·ç¾îÁø´Ù. °¢°¢ÀÇ ¸ÅÅ©·Î Á¤Àǹ®Àº ¸ÅÅ©·Î À̸§, =, Á¤ÀǺΰ¡ µé¾î°£ ÇϳªÀÇ ÁÙ·Î ÀÛ¼ºµÈ´Ù. ´ÙÀ½°ú °°ÀÌ Çü½ÄÀ» ¿ä¾àÇÒ ¼ö ÀÖ´Ù.
<name>=<definition> |
¸ÅÅ©·Î À̸§Àº ¾ËÆÄºªÀ̳ª ¹ØÁÙ·Î ½ÃÀÛÇÏ¿© ¾ËÆÄºª, ¾Æ¶óºñ¾Æ ¼ýÀÚ, ¹ØÁÙÀÇ ³ª¿ÀÌ µû¶ó¿À´Â ÇüÅÂÀÇ Àû¹ýÇÑ identifier¿©¾ß ÇÑ´Ù.
¸ÅÅ©·Î Á¤Àǹ®Àº Àû¹ýÇÑ Á¤±Ô½ÄÀ̾î¾ß ÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ¾Æ·¡ sectionÀ» Âü°íÇ϶ó.
¸ÅÅ©·Î Á¤Àǹ®Àº Á¤±Ô½Ä Áß°£¿¡ {<name>}°ú °°Àº Çü½ÄÀ¸·Î ´Ù¸¥ ¸ÅÅ©·Î Á¤Àǰ¡ Æ÷ÇԵǴ °ÍÀ» Çã¿ëÇÑ´Ù. ÇÏÁö¸¸, ÇÔ¼ö³ª nonterminal°ú °°ÀÌ »óÈ£ Àç±ÍÀûÀ¸·Î È£ÃâµÇ´Â °ÍÀ» Çã¿ëÇÏÁö ¾Ê´Â '¸ÅÅ©·Î'¶ó´Â °ÍÀ» ¸í½ÉÇØ¾ß ÇÑ´Ù. ¸ÅÅ©·Î Á¤Àǹ®¿¡¼ ¹ß»ýÇÏ´Â ¼øÈ¯ ¹®Á¦´Â ¿¹»óÄ¡ ¸øÇÑ °á°ú¸¦ ¹ß»ý½Ãų ¼ö ÀÖ´Ù.
Lexical »óŵéÀº ÁÖ¾îÁø ÀԷ¿¡ ¾î¶² Á¤±Ô½ÄÀ» Àû¿ëÇØ¾ß ÇÒÁö¸¦ ÆÇ´ÜÇÒ ¶§ »ç¿ëµÈ´Ù. ´ÙÀ½°ú °°Àº ÇüÅ·ΠJLex Áö½Ã¹®¾È¿¡ ¼±¾ðµÈ´Ù.
%»óÅÂ state[0][,state[1],state[2],...] |
»óŸíÀº ¾ËÆÄºªÀ̳ª ¹ØÁÙ·Î ½ÃÀÛÇÏ¿© ¾ËÆÄºª, ¾Æ¶óºñ¾Æ ¼ýÀÚ, ¹ØÁÙÀÇ ³ª¿ÀÌ µû¶ó¿À´Â ÇüÅÂÀÇ Àû¹ýÇÑ identifier¿©¾ß ÇÑ´Ù.
JLex¿¡ ÀÇÇØ ÇϳªÀÇ lexical »óŰ¡ ¾Ï½ÃÀûÀ¸·Î ¼±¾ðµÈ´Ù. »ý¼ºµÈ lexical analyzer°¡ ½ÃÀÛµÉ ¶§ YYINITIALÀ̶ó ºÒ¸®´Â »óŸ¦ °®´Â´Ù.
lexical analyzeÀÇ ±ÔÄ¢µéÀº optional »óÅ ¸®½ºÆ®·Î ½ÃÀ۵ȴÙ. »óÅ list°¡ ÁÖ¾îÁø °æ¿ì lexical analyzer°¡ ¸í½ÃµÈ »óÅ ÁßÀÇ ÇϳªÀÏ °æ¿ì¿¡¸¸ lexical ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù. »óÅ list°¡ ¾ø´Â °æ¿ì lexical ±ÔÄ¢Àº ÇöÀçÀÇ lexical analyzerÀÇ »óÅ¿¡ ¹«°üÇÏ°Ô Àû¿ëµÈ´Ù.
JLex specificationÀÌ »óŵµ ¼±¾ðÇÏÁö ¾Ê°í lexical ±ÔÄ¢ ¾Õ¿¡ »óÅ list¸¦ µÎÁöµµ ¾Ê´Â °æ¿ì, »ý¼ºµÇ´Â lexerÀÇ »óÅ´ YYINITIAL·Î °è¼Ó À¯ÁöµÈ´Ù. Lexical ±ÔÄ¢ ¾Õ¿¡ »óÅ list°¡ ¾ø±â ¶§¹®¿¡, ¾Ï½ÃÀûÀ¸·Î ¼±¾ðµÇ´Â YYINITAILÀ» Æ÷ÇÔÇÑ ¸ðµç »óÅ¿¡ ´ëÇØ ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù. µû¶ó¼, specification¿¡¼ »óŰ¡ ÀüÇô »ç¿ëµÇÁö ¾ÊÀº °æ¿ì¶óµµ ¿¹»óÄ¡ ¸øÇÑ °á°ú°¡ ¹ß»ýÇÏÁø ¾Ê´Â´Ù.
StateµéÀº »ý¼ºµÉ lexical analyzer Ŭ·¡½º¾È¿¡¼ »ó¼ö·Î ¼±¾ðµÈ´Ù. ¼±¾ðµÈ »óÅ¿¡ ´ëÀÀµÇ´Â »ó¼ö´Â »óŸí°ú °°Àº À̸§À» °®´Â´Ù. µû¶ó¼, ±ÔÄ¢ÀÇ action ºÎºÐ¿¡ ¼±¾ðµÈ º¯¼ö¸íÀÌ »óŸí°ú ÁßøµÇ´Â °ÍÀ» Á¶½ÉÇØ¾ß ÇÑ´Ù. °ü·ÊÀûÀ¸·Î »óŸíÀ» ÀüºÎ ´ë¹®ÀÚ·Î ÇÏ¿© »ó¼ö¶ó´Â °ÍÀ» »ó±â½ÃŰ°Ô²û ÇÑ´Ù.
¹®ÀÚ¼ö ¼¼±â ±â´ÉÀº default·Î ²¨Á®ÀÖÁö¸¸, %char Áö½Ã¹®¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù.
%char |
ÁÙ¹øÈ£ ¼¼±â´Â default·Î ²¨Á®ÀÖÁö¸¸, %line Áö½Ã¹®¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù.
%line |
Java CUPÀº Georgia Tech UniversityÀÇ Scott HudsonÀÌ Ã³À½ ¸¸µé±â ½ÃÀÛÇÏ¿©, Frank Flannery, Dan Wang, C.Scott Ananian¿¡ ÀÇÇØ °ü¸®, È®ÀåµÈ parser generatorÀÌ´Ù. ÀÚ¼¼ÇÑ ¼³¸íÀº ´ÙÀ½ URL¿¡¼ ã¾Æº¼ ¼ö ÀÖ´Ù. http://www.cs.princeton.edu/~appel/modern/java/CUP/. Java CUP°úÀÇ È£È¯±â´ÉÀº default·Î ²¨Á®ÀÖÁö¸¸, ´ÙÀ½°ú °°Àº JLex Áö½Ã¹®¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù.
%cup |
%implements java_cup.runtime.Scanner %function next_token %type java_cup.runtime.Symbol |
¿©±â¼ ¼³¸íÇÒ Áö½Ã¹®µéÀ» »ç¿ëÇÏ¿© »ý¼ºµÉ lexical analyzer Ŭ·¡½º, ÅäÅ«È ÇÔ¼ö, ÅäÅ« ¸®ÅÏÇüÀ» ¹Ù²Ü ¼ö ÀÖ´Ù. Lexical analyzer Ŭ·¡½ºÀÇ À̸§À» YylexÀ¸·ÎºÎÅÍ º¯°æÇÒ ¶§´Â %class Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
%class <name> |
%function <name> |
%type <name> |
Scoping Ãæµ¹À» ÇÇÇϱâ À§ÇØ lexical analyzerÀÇ ÇÔ¼ö¿Í º¯¼ö¿¡ ¿¹¾àµÈ À̸§µéÀº yy·Î ½ÃÀÛÇÑ´Ù.
32-bit primitive Á¤¼öÇüÀÎ int¸¦ ÅäÅ«È ÇÔ¼öÀÇ ¸®ÅÏÇüÀ¸·Î Çϱâ À§ÇÏ¿© %integer Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
%integer |
class Yylex { ... public Yytoken yylex() { ... } |
class Yylex { ... public int yylex() { ... } |
{ ... return 7; ... } |
integer ¸®ÅÏÇüÀ» »ç¿ëÇÏ·Á¸é end of file Äڵ嵵 ¹Ù²ãÁà¾ß ÇÑ´Ù. ±âº»°ªÀ¸·Ð, java.lang.Object Ŭ·¡½º³ª ÀÚ½Ä Å¬·¡½ºÀÇ ÀνºÅϽºµéÀÌ Yylex.yylex()·ÎºÎÅÍ ¸®ÅϵȴÙ. »ý¼ºµÈ Yylex lexer°¡ ¼öÇàµÇ´Â °úÁ¤ Áß¿¡¼ end-of-fileÀ» ¸¸³ª°Ô µÇ¸é Yylex.yylex()·ÎºÎÅÍ null°ªÀÌ ¸®ÅϵǾî¾ß ÇÑ´Ù.
Yylex.yylex()ÀÇ ¸®ÅÏ °ªÀÌ int·Î ¹Ù²î¸é, nullÀÌ ´õ ÀÌ»ó ¸®Å쵃 ¼ö ¾ø´Ù. ´ë½Å, -1ÀÇ °ªÀ» °®´Â Yylex.YYEOF »ó¼ö°¡ ¸®ÅϵȴÙ. %integer Áö½Ã¹®¿¡´Â %yyeof°¡ ³»Æ÷µÇ¾î ÀÖ´Ù
java.lang.Integer¸¦ ÅäÅ«È ÇÔ¼öÀÇ ¸®ÅÏÇüÀ¸·Î Çϱâ À§ÇÏ¿© %intwrap Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
%intwrap |
class Yylex { ... public Yytoken yylex() { ... } |
class Yylex { ... public java.lang.Integer yylex() { ... } |
{ ... return new java.lang.Integer(0); ... } |
%intwrap Áö½Ã¹®Àº ´ÙÀ½°ú °°ÀÌ %type Áö½Ã¹®À» »ç¿ëÇÑ °Í°ú µ¿ÀÏÇÑ È¿°ú¸¦ °®´Â´Ù.
%type java.lang.Integer |
%yyeof Áö½Ã¹®Àº Yylex.YYEOF »ó¼ö¸¦ ¼±¾ðÇÏ°Ô ÇÑ´Ù. %integer Áö½Ã¹®ÀÌ ¼±¾ðµÈ °æ¿ì, Yylex.YYEOF°¡ end-of-file¿¡¼ ¸®ÅϵȴÙ.
%yyeof |
public final int YYEOF = -1; |
UNIX ¿î¿µÃ¼Á¦¿¡¼´Â °³Ç๮ÀÚ·Î '\n' ´ÜÀÏ character¸¦ »ç¿ëÇÑ´Ù. ¹Ý¸é, DOS ±â¹Ý ¿î¿µÃ¼Á¦¿¡¼´Â "\r\n"(carriage return + newline)ÀÌ °³Ç๮ÀÚ·Î »ç¿ëµÈ´Ù. %notunix Áö½Ã¹®Àº carriage returnÀ̳ª newlineÀÌ °³Ç๮ÀÚ·Î Àνĵǵµ·Ï ÇÑ´Ù.
%notunix |
Default·Î´Â ¹®ÀÚ code Áß 0¿¡¼ 127»çÀ̸¦ »ç¿ëÇÑ´Ù. ÀÌ ¹üÀ§¸¦ ¹þ¾î³ª´Â ¹®ÀÚ°¡ µé¾î¿À¸é lexer°¡ Á¦´ë·Î µ¿ÀÛÀ» ÇÏÁö ¸øÇÑ´Ù.
%full Áö½Ã¹®Àº ¹üÀ§¸¦ 8 bitÀ¸·Î ³ªÅ¸³¾ ¼ö ÀÖ´Â ¸ðµç °ªÀ¸·Î È®ÀåÇÑ´Ù.
%full |
%unicode Áö½Ã¹®Àº ¹üÀ§¸¦ 16 bitÀ¸·Î ³ªÅ¸³¾ ¼ö ÀÖ´Â ¸ðµç À¯´ÏÄÚµå·Î È®ÀåÇÑ´Ù.
%unicode |
%ignorecase Áö½Ã¹®Àº ´ë¼Ò¹®ÀÚ ±¸º°À» ÇÏÁö ¾Ê´Â lexer¸¦ »ý¼ºÇÏ°Ô ÇÑ´Ù.
%ignorecase |
ÇöÀç JLex ¹öÁ¯¿¡¼ »ý¼ºµÇ´Â lexical analyzer¿¡¼´Â ÇÑ ¹®ÀÚ ´ç ÇÑ ¹ÙÀÌÆ®°¡ ÇÒ´çµÇ´Â ¾Æ½ºÅ° Çü½ÄÀÇ ÅØ½ºÆ® ÆÄÀϸ¸À» Áö¿øÇÑ´Ù. ÇÏÁö¸¸, ¾ÕÀ¸·ÎÀÇ È®À强À» À§ÇÏ¿© ºñ·Ï 16 ºñÆ®ÀÇ Àüü Ç¥Çö ¹üÀ§¸¦ ¸ðµÎ Áö¿øÇÏÁö´Â ¾ÊÁö¸¸, ¸ðµç JLexÀÇ ³»ºÎ ¹®ÀÚ Ã³¸®¿¡ 16 ºñÆ® ÀÚ¹Ù ¹®ÀÚÇüÀ» »ç¿ëÇϰí ÀÖ´Ù.
JLexÀÇ 3¹øÂ° section¿¡ ÇØ´çµÇ´Â Á¤±Ô½Ä ±ÔÄ¢ÀÇ actionºÎ ÄÚµåµéÀº exceptionÀ» throwÇϰųª ´Ù¸¥ ÇÔ¼ö·ÎºÎÅÍÀÇ °ÍÀ» ÀüÆÄ½Ãų ¼ö ÀÖ´Ù. À̵é exceptionÀ» ¼±¾ðÇÏ·Á¸é %yylexthrow{ ... %yylexthrow} Áö½Ã¹®À» »ç¿ëÇÏ¸é µÈ´Ù.
%yylexthrow{ <exception[1]>[,<exception[1]>,...] %yylexthrow} |
public Yytoken yylex() throws <exception[1]>[,<exception[1]>,...] { ... } |
%eofval{ ... %eofval} Áö½Ã¹®Àº end-of-fileÀÇ ¸®ÅϰªÀ» ¸í½ÃÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ Áö½Ã¹®Àº lexical analyzer°¡ end-of-fileÀ» ¸¸³µÀ» ¶§ ¼öÇàµÇ´Â Yylex.yylex()¾È¿¡ ³ÖÀ» Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÀÌ Äڵ忡¼´Â ÅäÅ«È ÇÔ¼ö Yylex.yylex()ÀÇ ¸®ÅÏ Å¸ÀÔ°ú ÀÏÄ¡ÇÏ´Â °ªÀ» ¸®ÅÏÇØ¾ß ÇÑ´Ù.
%eofval{ <code> %eofval} |
´ÙÀ½Àº %eofval{ ... %eofval} Áö½Ã¹®ÀÇ »ç¿ë ¿¹ÀÌ´Ù. End-of-fileÀÇ ¸®ÅÏ °ªÀ¸·Î ±âº»°ªÀÎ nullÀÌ ¾Æ´Ñ (new token(sym.EOF))¸¦ ¿øÇÏ´Â °æ¿ì ´ÙÀ½°ú °°ÀÌ specification ÆÄÀÏ¿¡ Ãß°¡ÇÏ¸é µÈ´Ù.
%eofval{ return (new token(sym.EOF)); %eofval} |
public Yytoken yylex(){ ... return (new token(sym.EOF)); ... } |
JLex¿¡¼´Â Yylex Ŭ·¡½º°¡ ƯÁ¤ interface¸¦ implementÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°Àº ¼±¾ð¹®À» Ãß°¡ÇÏ¸é µÈ´Ù.
%implements <classname> |
class Yylex implements classname { ... |
%public Áö½Ã¹®À» ¼±¾ðÇϸé JLex°¡ lexical analyzer Ŭ·¡½º¸¦ public Ŭ·¡½º·Î ¸¸µç´Ù.
%public |
JLex specification ÆÄÀÏÀÇ ¼¼ ¹øÂ° ºÎºÐ¿¡´Â ÀÔ·Â ½ºÆ®¸²À» ÅäÅ«À¸·Î ºÐÇØÇÏ´Â ±ÔÄ¢µéÀ» ¿°ÅÇÑ´Ù. ÀÌµé ±ÔÄ¢µéÀº Á¤±Ô½Ä°ú ÀÌ¿¡ ¿¬°áµÈ actionÀ» ¼³¸íÇÏ´Â ÀÚ¹Ù ÄÚµå·Î ±¸¼ºµÇ¾î ÀÖ´Ù.
ÇϳªÀÇ ±ÔÄ¢Àº Optional »óÅ list, Á¤±Ô½Ä, actionÀÇ ¼¼ ºÎºÐÀ¸·Î ³ª´©¾îÁö¸ç, ´ÙÀ½°ú °°Àº Çü½ÄÀ» °®´Â´Ù.
[<»óÅÂs>]<Á¤±Ô½Ä>{<action>} |
ÀÔ·Â ¹®ÀÚ¿ÀÌ Çϳª ÀÌ»óÀÇ ±ÔÄ¢°ú ÀÏÄ¡ÇÏ´Â °æ¿ì, lexer´Â ±æÀ̰¡ °¡Àå ±ä ¹®ÀÚ¿°ú ÀÏÄ¡ÇÏ´Â ±ÔÄ¢À» ¼±ÅÃÇÑ´Ù. ±×·¡µµ, ±æÀ̰¡ °°Àº ¹®ÀÚ¿ÀÌ ¿©·¯ °³ÀÎ °æ¿ì JLex specification¿¡ ¸ÕÀú ¸í½ÃµÈ ±ÔÄ¢À» ¼±ÅÃÇÑ´Ù. °á±¹, specification¿¡¼ ´õ ¾Õ¿¡ ÀÖ´Â ±ÔÄ¢µéÀÌ ´õ ³ôÀº ¿ì¼±±ÇÀ» °®´Â´Ù°í º¼ ¼ö ÀÖ´Ù.
JLex specification ÆÄÀÏ¿¡ ¼±¾ðµÈ ±ÔÄ¢µéÀº °¡´ÉÇÑ ¸ðµç ÀԷ¿¡ Àû¿ëµÉ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¸¸¾à, lexical anaylzer°¡ ÀÌµé ±ÔÄ¢¿¡ Àû¿ëµÇÁö ¸øÇÏ´Â ÀÔ·ÂÀ» ¹Þ´Â °æ¿ì ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.
°á±¹, ¸ðµç ÀԷµéÀº Àû¾îµµ ÇϳªÀÇ ±ÔÄ¢¿¡ Àû¿ëµÉ ¼ö ÀÖ¾î¾ß Çϸç, À̰ÍÀº ´ÙÀ½°ú °°Àº ±ÔÄ¢À» Á¦ÀÏ ¸¶Áö¸·¿¡ Ãß°¡ÇÏ´Â ¹æ¹ýÀ¸·Î º¸ÀåÇÒ ¼ö ÀÖ´Ù.
. { java.lang.System.out.println("Unmatched input:" + yytext()); } |
Optional lexical »óÅ ¸®½ºÆ®´Â ±ÔÄ¢ÀÇ ¾Õ ºÎºÐ¿¡ À§Ä¡Çϸç, ´ÙÀ½°ú °°Àº Çü½ÄÀ» µû¸¥´Ù.
<»óÅÂ[0][,state[1],stateg[2],...]> |
¿¹¸¦ µé¾î, yylex()°¡ »óÅ AÀ϶§ È£ÃâµÈ °æ¿ì, lexer´Â »óÅ list¿¡ A°¡ Æ÷ÇÔµÈ ±ÔÄ¢µé¸¸À» Àû¿ë½Ãų ¼ö ÀÖ´Ù.
»óÅ list°¡ ¾ø´Â °ÍÀº, ¸ðµç »óÅ¿¡¼ ÇØ´ç ±ÔÄ¢ÀÌ Àû¿ë °¡´ÉÇÔÀ» ³ªÅ¸³½´Ù.
White space´Â Á¤±Ô½ÄÀÇ Á¾·á·Î ÇØ¼®µÇ±â ¶§¹®¿¡ Á¤±Ô½Ä Áß¿¡ white space°¡ Æ÷ÇÔµÇ¸é ¾ÈµÈ´Ù. ÇѰ¡Áö ¿¹¿Ü·Î °³Ç๮ÀÚ¸¦ Á¦¿ÜÇÑ white space´Â µû¿ÈÇ¥·Î µÑ·¯½ÓÀ¸·Î½á ÀÚ±â ÀÚ½ÅÀ¸·Î Ç¥ÇöµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, " "´Â black space·Î ÇØ¼®µÈ´Ù.
JLex´Â Á¤±Ô½Ä¿¡ 0~127»çÀÌÀÇ Ascii code¸¦ »ç¿ëÇÑ´Ù.
´ÙÀ½ ¹®ÀÚµéÀº JLexÀÇ Á¤±Ô½Ä¿¡¼ Ưº°ÇÑ Àǹ̸¦ °¡Áö´Â metacharacterµéÀÌ´Ù.
? * + | ( ) ^ $ . [ ] { } " \
´Ù¸¥ ¹®ÀÚµéÀº ÀÚ±â ÀÚ½ÅÀ» ³ªÅ¸³½´Ù.
ef ¿¬¼ÓµÈ Á¤±Ô½ÄÀº ±×µéÀÇ ¿¬¼â¸¦ ³ªÅ¸³½´Ù.
e|f ¼öÁ÷ ¹Ù(|)´Â ¾çÂÊÀÇ Á¤±Ô½ÄÀ» ¼±ÅÃÇÒ ¼ö ÀÖÀ½À» ³ªÅ¸³»¹Ç·Î, e ¶Ç´Â f¸¦ ¶æÇÑ´Ù.
Backslash µÚ¿¡ µû¶ó¿À´Â ¹®ÀÚ¿Àº ´ÙÀ½°ú °°ÀÌ ÇØ¼®µÈ´Ù.
\b Backspace
\n newline
\t Tab
\f Formfeed
\r Carriage return
\ddd 3ÀÚ¸® 8Áø¼ö ¼ýÀÚ¿¡ ÇØ´çÇÏ´Â character code
\xdd 2ÀÚ¸® 16Áø¼ö ¼ýÀÚ¿¡ ÇØ´çÇÏ´Â character code
\udddd 4ÀÚ¸® 16Áø¼ö ¼ýÀÚ¿¡ ÇØ´çÇÏ´Â Unicode character code
\^C Control character
\c ÀÌ¿ÜÀÇ ´Ù¸¥ ¹®ÀÚ°¡ backslash µÚ¿¡ ¿À´Â °æ¿ì ±× ¹®ÀÚ ÀÚ½ÅÀ» ³ªÅ¸³½´Ù
$ ´Þ¶ó ±âÈ£´Â ÁÙÀÇ ¸¶Áö¸·À» ÀǹÌÇÑ´Ù. Á¤±Ô½ÄÀÇ ¸¶Áö¸·¿¡ ´Þ¶ó ±âÈ£°¡ ÀÖ´Â °æ¿ì ±× Á¤±Ô½ÄÀº ÁÙÀÇ ¸¶Áö¸·¿¡¼¸¸ Àû¿ëµÊÀ» ÀǹÌÇÑ´Ù.
. °³Ç๮ÀÚ¸¦ Á¦¿ÜÇÑ ¸ðµç ¹®ÀÚ. [^\n]°ú µ¿ÀÏÇÏ´Ù.
"..." µû¿ÈÇ¥ ¾È¿¡ metacharacter°¡ ÀÖ´Â °æ¿ì, ¿ø·¡ Àǹ̸¦ ÀÒ°í ÀÚ±â ÀÚ½ÅÀ» Ç¥ÇöÇÑ´Ù. \"´Â ¿¹¿ÜÀûÀ¸·Î µû¿ÈÇ¥ ¹®ÀÚ "¸¦ °¡¸®Å²´Ù.
{name} ¸ÅÅ©·Î expansion.
* Kleen closure·Î ¾ÕÀÇ Á¤±Ô½ÄÀÇ 0¹ø ¶Ç´Â ±× ÀÌ»óÀÇ ¹Ýº¹.
+ ¾ÕÀÇ Á¤±Ô½ÄÀÇ Çѹø ÀÌ»óÀÇ ¹Ýº¹. µû¶ó¼, e+´Â ee*¿Í µ¿ÀÏÇÏ´Ù
? ¾ÕÀÇ Á¤±Ô½ÄÀÇ 0¹ø ¶Ç´Â ÇѹøÀÇ ¹Ýº¹.
(...) Á¤±Ô½ÄÀ» ¹´Â´Ù.
[...] ´ë°ýÈ£´Â ¹®ÀÚ ÁýÇÕÀ» ³ªÅ¸³»¸ç, ÁýÇÕ¿¡ Æ÷ÇÔµÈ ¾î´À ÇϳªÀÇ ¹®ÀÚ¿¡ ´ëÇØ Á¤±Ô½ÄÀÌ Àû¿ëµÈ´Ù. ´ë°ýÈ£ ¾ÈÀÇ Ã¹ ¹®ÀÚ°¡ ^ÀÎ °æ¿ì ¿©ÁýÇÕÀÌ µÇ¾î ´ë°ýÈ£ ¾È¿¡ Æ÷ÇÔµÈ °Íµé ÀÌ¿ÜÀÇ ¹®ÀÚ¿¡ ´ëÇØ Á¤±Ô½ÄÀÌ Àû¿ëµÈ´Ù. ´ë°ýÈ£ ¾È¿¡¼´Â ´ÙÀ½°ú °°Àº ´Ù¸¥ metacharacter ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù.
{name} ¸ÅÅ©·Î expansion
"..." µû¿ÈÇ¥ ¾È¿¡ metacharacter°¡ ÀÖ´Â °æ¿ì, ¿ø·¡ Àǹ̸¦ ÀÒ°í ÀÚ±â ÀÚ½ÅÀ» Ç¥ÇöÇÑ´Ù. \"´Â ¿¹¿ÜÀûÀ¸·Î µû¿ÈÇ¥ ¹®ÀÚ "¸¦ °¡¸®Å²´Ù.
\ backslashµÚÀÇ metacharacter´Â ¿ø·¡ÀÇ Æ¯º°ÇÑ Àǹ̸¦ ÀҴ´Ù.
- ´ë°ýÈ£ ¾ÈÀÇ Ã¹ ±ÛÀÚ³ª ³¡ ±ÛÀÚ°¡ -ÀÎ °æ¿ì -´Â ¿ø·¡ÀÇ Æ¯º°ÇÑ Àǹ̸¦ ÀҴ´Ù.
Lexical ±ÔÄ¢¿¡ ¿¬°üµÈ ActionÀº Áß°ýÈ£·Î ¹¿©Áø ÀÚ¹Ù ÄÚµå·Î ÀÛ¼ºÇÑ´Ù.
{ action } |
action ºÎºÐÀÇ ¹®ÀÚ¿À̳ª ÁÖ¼®À» Á¦¿ÜÇÑ ºÎºÐ¿¡ ÀÖ´Â ¿°í ´Ý´Â Áß°ýÈ£µéÀÇ ¼ýÀÚ´Â ÀÏÄ¡ÇØ¾ß ÇÑ´Ù.
Action¿¡¼ ¾Æ¹«·± °ªµµ ¸®ÅϵÇÁö ¾Ê´Â °æ¿ì, lexical analyzer´Â ÀÔ·Â ½ºÆ®¸²À¸·ÎºÎÅÍ ´ÙÀ½ ÅäÅ«À» ã°í ¸®ÅÏÇÒ ¶§±îÁö ·çÇÁ¸¦ µ·´Ù.
´ÙÀ½°ú °°ÀÌ ÇÏ¿© yylex¸¦ ¸í½ÃÀûÀ¸·Î Àç±ÍÈ£Ãâ ÇÒ ¼ö ÀÖ´Ù.
{ ... return yylex(); ... } |
¾ÕÀÇ ÄÚµå´Â È£ÃâÇÏ´Â ÇÔ¼öÀÇ ³¡¿¡¼ Àç±ÍÈ£ÃâÀÌ ÀϾ±â ¶§¹®¿¡ tail recursionÀÌ´Ù. ¾Æ·¡ ÄÚµå´Â tail recursionÀÌ ¾Æ´Ñ Àç±ÍÈ£ÃâÀÇ ¿¹ÀÌ´Ù.
{ ... next = yylex(); ... } |
JLex Áö½Ã¹® section¿¡ lexical »óŵéÀÌ ¼±¾ðµÈ °æ¿ì, Á¤±Ô½Ä action¿¡ »óÅ ÀüȯÀ» ´ÙÀ½°ú °°Àº ÇüÅ·ΠÁö½ÃÇÒ ¼ö ÀÖ´Ù.
yybegin(»óÅÂ); |
yybeginÀÇ parameter´Â JLex Áö½Ã¹® section¿¡¼ ¼±¾ðµÇ¾î¾ß Çϸç, ±×·¸Áö ¾ÊÀº °æ¿ì »ý¼ºµÈ ¼Ò½ºÀÇ ÄÄÆÄÀÏ °úÁ¤¿¡¼ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. ¿¹¿ÜÀûÀ¸·Î YYINITIALÀº ¾Ï½ÃÀûÀ¸·Î JLex¿¡ ÀÇÇØ ¼±¾ðµÇ¾î Àֱ⠶§¹®¿¡ Ãß°¡ÀÇ ¼±¾ð¹®ÀÌ ÇÊ¿ä ¾ø´Ù. »ý¼ºµÈ lexer´Â YYINITIAL »óÅ·ΠºÎÅÍ ½ÃÀÛµÇ¸ç »óÅ ÀüȯÀÌ ÀÖ±â Àü±îÁö ÀÌ »óÅ¿¡ ¸Ó¹®´Ù.
¾Æ·¡ÀÇ º¯¼öµéÀº Yylex Ŭ·¡½º¿¡ ³»ºÎÀûÀ¸·Î ¼±¾ðµÇ´Â °Íµé·Î lexical ±ÔÄ¢ÀÇ action ºÎ¿¡¼ »ç¿ë °¡´ÉÇÏ´Ù.