2. JLex specifications

JLex specificationÀº %%·Î ±¸ºÐµÈ ¼¼ sectionÀ¸·Î ±¸¼ºµÈ´Ù. Çü½ÄÀº ´ÙÀ½°ú °°´Ù
»ç¿ëÀÚ ÄÚµå
%%
JLex Áö½Ã¹®
%%
Á¤±Ô½Ä rules
%%´Â °¢ sectionÀ» ±¸ºÐÇÏ´Â ¿ªÇÒÀ» Çϸç, ÇØ´ç ¶óÀÎÀÇ Á¦ÀÏ Ã³À½¿¡ À§Ä¡Çؾ߸¸ ÇÑ´Ù. ÀÌ¿ÜÀÇ À§Ä¡¿¡ ÀÖ´Â %%´Â ¹«½ÃµÇ¸ç Ãß°¡ÀÇ ¼±¾ð¹®À̳ª ÄÚµåµéÀÇ ¸íÈ®ÇÑ ÇØ¼®À» À§ÇØ »ç¿ëÀ» ÀÚÁ¦ÇØ¾ß ÇÑ´Ù.

specification ÆÄÀÏÀÇ Ã¹ sectionÀÎ »ç¿ëÀÚ ÄÚµå sectionÀº Ãâ·Â ÆÄÀÏ¿¡ ±×´ë·Î º¹»çµÇ´Â ºÎºÐÀÌ´Ù. ÀÌ ¿µ¿ªÀº À¯Æ¿¸®Æ¼ Ŭ·¡½º³ª ¸®ÅÏ typeÀ» ±â¼úÇÒ ¼ö ÀÖµµ·Ï Á¦°øµÇ´Â °ø°£ÀÌ´Ù.

µÎ ¹ø °ÀÎ JLex Áö½Ã¹® section¿¡¼­´Â, ¸ÅÅ©·Î°¡ Á¤ÀÇµÇ°í »óÅ À̸§ÀÌ ¼±¾ðµÈ´Ù.

¼¼ ¹øÂ° section¿¡¼­´Â lexical analyzerÀÇ ruleÀÌ Á¤ÀǵȴÙ. : °¢ ruleÀº option »óÅ list, Á¤±Ô½Ä, actionÀÇ ¼¼ ºÎºÐÀ¸·Î ±¸¼ºµÈ´Ù.

2.1. User Code

»ç¿ëÀÚ ÄÚµå´Â ù ¹øÂ° %%ÀÇ ¾ÕºÎºÐ¿¡ ÇØ´çµÇ¸ç À̰÷ÀÇ ³»¿ëÀº, JLexÀÇ Ãâ·Â¹°ÀÎ lexical analyzer ¼Ò½ºÄÚµåÀÇ Ã³À½¿¡ ±×´ë·Î º¹»çµÈ´Ù. µû¶ó¼­, lexer ¼Ò½º°¡ package ¼±¾ðÀ̳ª Áß¿ä ¿ÜºÎ Å¬·¡½º¸¦ ÇÊ¿ä·Î ÇÏ´Â °æ¿ì, »ç¿ëÀÚ ÄÚµå section ù ºÎºÐ¿¡ ¼±¾ðÇÒ ¼ö ÀÖ´Ù.

2.2. JLex Áö½Ã¹®

JLex Áö½Ã¹® sectionÀº ù ¹øÂ° %%¿¡¼­ºÎÅÍ µÎ ¹øÂ° %%±îÁö °è¼ÓµÈ´Ù. °¢ JLex Áö½Ã¹®Àº ÁÙÀÇ Ã³À½ºÎÅÍ ½ÃÀÛµÇ¾î ±× ÁÙ¿¡¼­ ¾È¿¡¼­ ³¡³ª¾ß ÇÑ´Ù.

2.2.1. Lexical analyzer Ŭ·¡½ºÀÇ ³»ºÎ ÄÚµå

%{...%} Áö½Ã¹®¾È¿¡´Â lexical analyzer Ŭ·¡½º¿¡ º¹»çµÉ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. Çü½ÄÀº ´ÙÀ½°ú °°´Ù.
%{
<code>
%}
%{¿Í %}´Â °¢ ÁÙÀÇ Ã³À½¿¡ À§Ä¡Çؾ߸¸ ÇÑ´Ù. <code>¿¡ ÀÖ´Â ÀÚ¹Ù ÄÚµå´Â ´ÙÀ½°ú °°Àº ÇüÅ·Πlexical analyzer Ŭ·¡½º¿¡ º¹»çµÈ´Ù.
class Yylex {
... <code> ...
}
À§¿Í °°ÀÌÇÏ¿© »ý¼ºµÉ lexical analyzer Ŭ·¡½º¿¡ µé¾î°¥ º¯¼ö¿Í ÇÔ¼öµéÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. yy·Î ½ÃÀ۵Ǵ º¯¼ö À̸§Àº lexical analyzer classµéÀ» À§ÇÏ¿© ¿¹¾àµÇ¾î Àֱ⠶§¹®¿¡ ÇÇÇØ¾ß ÇÑ´Ù.

2.2.2. Lexical analyzer Ŭ·¡½ºÀÇ ÃʱâÈ­ ÄÚµå

%init{ ... %init} Áö½Ã¹®¾È¿¡´Â lexical analyzer Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡ º¹»çµÉ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
%init{
<code>
%init}
%init{¿Í %init} Áö½Ã¹®µéÀº ÁÙÀÇ Ã³À½¿¡ À§Ä¡Çؾ߸¸ ÇÑ´Ù. <code>¿¡ ÀÖ´Â ÀÚ¹Ù ÄÚµå´Â ´ÙÀ½°ú °°Àº ÇüÅ·Πlexical analyzer Ŭ·¡½º »ý¼ºÀÚ¿¡ º¹»çµÈ´Ù.
class YYlex {
Yylex( ) {
... <code> ...
}
}
À§¿Í °°ÀÌÇÏ¿© lexical analyzer Ŭ·¡½ºÀÇ »ý¼ºÀÚ Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. yy·Î ½ÃÀ۵Ǵ º¯¼ö À̸§Àº lexical analyzer classµéÀ» À§ÇÏ¿© ¿¹¾àµÇ¾î Àֱ⠶§¹®¿¡ ÇÇÇØ¾ß ÇÑ´Ù.

%init{ ... %init} Áö½Ã¹®¾È¿¡¼­´Â exceptionÀ» throwÇϰųª ´Ù¸¥ ÇÔ¼ö·ÎºÎÅÍÀÇ °ÍÀ» ÀüÆÄ½Ãų ¼ö ÀÖ´Ù. À̵é exceptionÀ» ¼±¾ðÇÏ·Á¸é %initthrow{ ... %initthrow} Áö½Ã¹®À» »ç¿ëÇÏ¸é µÈ´Ù.
%initthrow{
<exception[1]>[,<exception[1]>,...]
%initthrow}
ÀÌ·¸°Ô ¼±¾ðµÈ exceptionµéÀº lexical analyzer »ý¼ºÀÚ¿¡ ´ÙÀ½°ú °°Àº ÇüÅ·Πº¹»çµÈ´Ù.
Yylex()
throws <exception[1]>[,<exception[1]>,...]
{
... <code> ...
}
%init{ ... %init} Áö½Ã¹®¾ÈÀÇ ÀÚ¹Ù Äڵ忡¼­ ¼±¾ðµÇÁö ¾ÊÀº exceptionÀ» throwÇÏ´Â °æ¿ì »ý¼ºµÈ lexical analyzer ¼Ò½º ÆÄÀÏÀÌ ¼º°øÀûÀ¸·Î ÄÄÆÄÀÏ µÇÁö ¸øÇÒ °ÍÀÌ´Ù.

2.2.3. Lexical analyzer Ŭ·¡½ºÀÇ End-of-File ÄÚµå

%eof{ ... %eof} Áö½Ã¹®¾È¿¡´Â lexical analyzer Ŭ·¡½º°¡ end-of-fileÀ» ¸¸³­ ÀÌÈÄ¿¡ ¼öÇàÇÒ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
%eof{
<code>
%eof}
%eof{¿Í %eof} Áö½Ã¹®µéÀº °¢ ÁÙÀÇ Ã³À½¿¡ À§Ä¡Çؾ߸¸ ÇÑ´Ù. <code>ºÎºÐ¿¡ ÀÖ´Â ÀÚ¹Ù ÄÚµå´Â lexical analyzer°¡ ó¸®ÇÏ´Â ÀÔ·Â ÆÄÀÏÀÇ end-of-file¿¡ µµ´ÞµÈ Á÷ÈÄ¿¡ ÃÖ´ë 1¹ø±îÁö ¼öÇàµÈ´Ù.

%eof{ ... %eof} Áö½Ã¹®¾ÈÀÇ codeµéÀº exceptionÀ» throwÇϰųª ´Ù¸¥ ÇÔ¼ö·ÎºÎÅÍÀÇ °ÍÀ» ÀüÆÄ½Ãų ¼ö ÀÖ´Ù. À̵é exceptionÀ» ¼±¾ðÇÏ·Á¸é %eofthrow{ ... %eofthrow} Áö½Ã¹®À» »ç¿ëÇÏ¸é µÈ´Ù.
%eofthrow{
<exception[1]>[,<exception[1]>,...]
%eofthrow}
ÀÌ·¸°Ô ¼±¾ðµÈ exceptionµéÀº lexical analyzer¾ÈÀÇ end-of-file µµ´Þ ÈÄ È£ÃâµÇ´Â ÇÔ¼ö ¼±¾ð ºÎ¿¡ ´ÙÀ½°ú °°Àº ÇüÅ·Πº¹»çµÈ´Ù.
private void yy_do_eof()
throws <exception[1]>[,<exception[1]>,...]
{
... <code> ...
}
ÇÔ¼öÀÇ ¸öü ºÎ¿¡ ÀÖ´Â <code>´Â %eof{ ... %eof} Áö½Ã¹®¾ÈÀÇ <code>·ÎºÎÅÍ º¹»çµÈ´Ù. ¸¸¾à ¿©±â¼­ %eofthrow{ ... %eofthrow} Áö½Ã¹®¿¡¼­ ¼±¾ðÇÏÁö ¾ÊÀº exceptionÀ» throwÇÏ´Â °æ¿ì »ý¼ºµÈ lexical analyzer ¼Ò½º ÆÄÀÏÀÌ ¼º°øÀûÀ¸·Î ÄÄÆÄÀÏ µÇÁö ¸øÇÒ °ÍÀÌ´Ù.

2.2.4. ¸ÅÅ©·Î Á¤ÀÇ

¸ÅÅ©·Î Á¤ÀÇ´Â specification ÆÄÀÏÀÇ JLex Áö½Ã¹® section¿¡¼­ ÀÌ·ç¾îÁø´Ù. °¢°¢ÀÇ ¸ÅÅ©·Î Á¤Àǹ®Àº ¸ÅÅ©·Î À̸§, =, Á¤ÀǺΰ¡ µé¾î°£ ÇϳªÀÇ ÁÙ·Î ÀÛ¼ºµÈ´Ù. ´ÙÀ½°ú °°ÀÌ Çü½ÄÀ» ¿ä¾àÇÒ ¼ö ÀÖ´Ù.
<name>=<definition>
ºóÄ­À̳ª Åǰú °°Àº °³Çà ¹®ÀÚ°¡ ¾Æ´Ñ °ø¹éµéÀº, ¸ÅÅ©·Î À̸§°ú µîÈ£ »çÀ̳ª µîÈ£¿Í Á¤ÀǺΠ»çÀÌ¿¡ ¼±ÅÃÀûÀ¸·Î »ðÀ﵃ ¼ö ÀÖ´Ù. °¢ ¸ÅÅ©·Î Á¤Àǹ®Àº ÇÑ ÁÙ ¾È¿¡¼­ ³¡³ª¾ß¸¸ ÇÑ´Ù.

¸ÅÅ©·Î À̸§Àº ¾ËÆÄºªÀ̳ª ¹ØÁÙ·Î ½ÃÀÛÇÏ¿© ¾ËÆÄºª, ¾Æ¶óºñ¾Æ ¼ýÀÚ, ¹ØÁÙÀÇ ³ª¿­ÀÌ µû¶ó¿À´Â ÇüÅÂÀÇ Àû¹ýÇÑ identifier¿©¾ß ÇÑ´Ù.

¸ÅÅ©·Î Á¤Àǹ®Àº Àû¹ýÇÑ Á¤±Ô½ÄÀ̾î¾ß ÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ¾Æ·¡ sectionÀ» Âü°íÇ϶ó.

¸ÅÅ©·Î Á¤Àǹ®Àº Á¤±Ô½Ä Áß°£¿¡ {<name>}°ú °°Àº Çü½ÄÀ¸·Î ´Ù¸¥ ¸ÅÅ©·Î Á¤Àǰ¡ Æ÷ÇԵǴ °ÍÀ» Çã¿ëÇÑ´Ù. ÇÏÁö¸¸, ÇÔ¼ö³ª nonterminal°ú °°ÀÌ »óÈ£ Àç±ÍÀûÀ¸·Î È£ÃâµÇ´Â °ÍÀ» Çã¿ëÇÏÁö ¾Ê´Â '¸ÅÅ©·Î'¶ó´Â °ÍÀ» ¸í½ÉÇØ¾ß ÇÑ´Ù. ¸ÅÅ©·Î Á¤Àǹ®¿¡¼­ ¹ß»ýÇÏ´Â ¼øÈ¯ ¹®Á¦´Â ¿¹»óÄ¡ ¸øÇÑ °á°ú¸¦ ¹ß»ý½Ãų ¼ö ÀÖ´Ù.

2.2.5. »óÅ ¼±¾ð

Lexical »óŵéÀº ÁÖ¾îÁø ÀԷ¿¡ ¾î¶² Á¤±Ô½ÄÀ» Àû¿ëÇØ¾ß ÇÒÁö¸¦ ÆÇ´ÜÇÒ ¶§ »ç¿ëµÈ´Ù. ´ÙÀ½°ú °°Àº ÇüÅ·ΠJLex Áö½Ã¹®¾È¿¡ ¼±¾ðµÈ´Ù.
%»óÅÂ state[0][,state[1],state[2],...]
°¢ lexical »óÅ ¼±¾ð¹®Àº ÇÑ ÁÙ ¾È¿¡ Æ÷ÇԵǾî¾ß ÇÑ´Ù. ¿©·¯ ¼±¾ð¹®µéÀÌ °°Àº JLex specification¿¡ Æ÷Ç﵃ ¼ö Àֱ⠶§¹®¿¡, ¿©·¯ »óÅ ¼±¾ð¹®µéÀÌ ¿©·¯ ÁÙ·Î Âɰ³¾îÁ® ÀÛ¼ºµÉ ¼ö ÀÖ´Ù.

»óŸíÀº ¾ËÆÄºªÀ̳ª ¹ØÁÙ·Î ½ÃÀÛÇÏ¿© ¾ËÆÄºª, ¾Æ¶óºñ¾Æ ¼ýÀÚ, ¹ØÁÙÀÇ ³ª¿­ÀÌ µû¶ó¿À´Â ÇüÅÂÀÇ Àû¹ýÇÑ 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 ºÎºÐ¿¡ ¼±¾ðµÈ º¯¼ö¸íÀÌ »óŸí°ú ÁßøµÇ´Â °ÍÀ» Á¶½ÉÇØ¾ß ÇÑ´Ù. °ü·ÊÀûÀ¸·Î »óŸíÀ» ÀüºÎ ´ë¹®ÀÚ·Î ÇÏ¿© »ó¼ö¶ó´Â °ÍÀ» »ó±â½ÃŰ°Ô²û ÇÑ´Ù.

2.2.6. ¹®ÀÚ¼ö ¼¼±â ±â´É

¹®ÀÚ¼ö ¼¼±â ±â´ÉÀº default·Î ²¨Á®ÀÖÁö¸¸, %char Áö½Ã¹®¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù.
%char
Á¤±Ô½Ä°ú ÀÏÄ¡µÈ ¿µ¿ªÀÇ Zero-based ¹®ÀÚ ¹øÈ£°¡ yychar¶ó´Â À̸§ÀÇ integer º¯¼ö¿¡ ±â·ÏµÈ´Ù.

2.2.7. ÁÙ¹øÈ£ ¼¼±â ±â´É

ÁÙ¹øÈ£ ¼¼±â´Â default·Î ²¨Á®ÀÖÁö¸¸, %line Áö½Ã¹®¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù.
%line
Á¤±Ô½Ä°ú ÀÏÄ¡µÈ ¿µ¿ªÀÇ Zero-based ÁÙ¹øÈ£°¡ yyline¶ó´Â À̸§ÀÇ integer º¯¼ö¿¡ ±â·ÏµÈ´Ù.

2.2.8. Java CUP°úÀÇ È£È¯¼º

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
ÀÌ·¸°Ô Çϸé java_cup.runtime.Scanner interface¿¡¼­ Á¤ÀÇµÈ ±ÔÄ¢¿¡ µû¸£µµ·Ï scanner°¡ »ý¼ºµÈ´Ù. ´ÙÀ½°ú °°Àº Áö½Ã¹®µé·Î ¶È°°Àº °á°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
%implements java_cup.runtime.Scanner
%function next_token
%type java_cup.runtime.Symbol
´ÙÀ½ section¿¡¼­ À̵é Áö½Ã¹®¿¡ ´ëÇÑ º¸´Ù ÀÚ¼¼ÇÑ ¼³¸íÀ» ¾òÀ» ¼ö ÀÖÀ¸¸ç, CUP ¸Å´º¾ó¿¡¼­ CUP°ú JLex¸¦ °°ÀÌ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ º¸´Ù ÀÚ¼¼ÇÑ ¼³¸íÀ» ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.

2.2.9. Lexical Analyzer ±¸¼º¿ä¼Ò À̸§ º¯°æ¹ý

¿©±â¼­ ¼³¸íÇÒ Áö½Ã¹®µéÀ» »ç¿ëÇÏ¿© »ý¼ºµÉ lexical analyzer Ŭ·¡½º, Åäūȭ ÇÔ¼ö, ÅäÅ« ¸®ÅÏÇüÀ» ¹Ù²Ü ¼ö ÀÖ´Ù. Lexical analyzer Ŭ·¡½ºÀÇ À̸§À» YylexÀ¸·ÎºÎÅÍ º¯°æÇÒ ¶§´Â %class Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
%class <name>
Åäūȭ ÇÔ¼öÀÇ À̸§À» yylexÀ¸·ÎºÎÅÍ º¯°æÇÒ ¶§´Â %function Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
%function <name>
Åäūȭ ÇÔ¼öÀÇ ¸®ÅÏÇüÀ» YytokenÀ¸·ÎºÎÅÍ º¯°æÇÒ ¶§´Â %type Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
%type <name>
À̵é Áö½Ã¹®µéÀ» »ç¿ëÇÏÁö ¾Ê´Â °æ¿ì, Åäūȭ ÇÔ¼ö¸í°ú ¸®ÅÏÇüÀº ±âº»°ªÀ¸·Î Yylex.yylex( )¿Í YytokenÀÌ »ç¿ëµÈ´Ù.

Scoping Ãæµ¹À» ÇÇÇϱâ À§ÇØ lexical analyzerÀÇ ÇÔ¼ö¿Í º¯¼ö¿¡ ¿¹¾àµÈ À̸§µéÀº yy·Î ½ÃÀÛÇÑ´Ù.

2.2.10. Default ÅäÅ« Çü

32-bit primitive Á¤¼öÇüÀÎ int¸¦ Åäūȭ ÇÔ¼öÀÇ ¸®ÅÏÇüÀ¸·Î Çϱâ À§ÇÏ¿© %integer Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
%integer
±âº»°ªÀ¸·Î, ´ÙÀ½°ú ÄÚµå¿Í °°ÀÌ YytokenÀÌ Yylex.yylex()ÀÇ ¸®ÅϰªÀ¸·Î »ç¿ëµÈ´Ù.
class Yylex { ...
public Yytoken yylex() {
... }
%integer Áö½Ã¹®Àº À§ÀÇ Äڵ带 ´ÙÀ½ ÄÚµå¿Í °°ÀÌ ÅäÅ«ÇüÀ» int·Î ¹Ù²Û´Ù.
class Yylex { ...
public int yylex() {
... }
ÀÌ·¸°Ô ÇÔÀ¸·Î½á lexical actionµéÀÌ ´ÙÀ½ ÄÚµå¿Í °°ÀÌ integer¸¦ ¸®ÅÏÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.
{ ...
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°¡ ³»Æ÷µÇ¾î ÀÖ´Ù

2.2.11. Default ÅäÅ«Çü II: Wrapped Integer

java.lang.Integer¸¦ Åäūȭ ÇÔ¼öÀÇ ¸®ÅÏÇüÀ¸·Î Çϱâ À§ÇÏ¿© %intwrap Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
%intwrap
±âº»°ªÀ¸·Î, ´ÙÀ½ ÄÚµå¿Í °°ÀÌ YytokenÀÌ Yylex.yylex()ÀÇ ¸®ÅϰªÀ¸·Î »ç¿ëµÈ´Ù.
class Yylex { ...
public Yytoken yylex() {
... }
%intwrap Áö½Ã¹®Àº À§ÀÇ Äڵ带 ´ÙÀ½ ÄÚµå¿Í °°ÀÌ ÅäÅ«ÇüÀ» java.lang.Integer·Î ¹Ù²Û´Ù.
class Yylex { ...
public java.lang.Integer yylex() {
... }
ÀÌ·¸°Ô ÇÔÀ¸·Î½á lexical actionµéÀÌ ´ÙÀ½ ÄÚµå¿Í °°ÀÌ wrapped integer¸¦ ¸®ÅÏÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.
{ ...
return new java.lang.Integer(0);
... }

%intwrap Áö½Ã¹®Àº ´ÙÀ½°ú °°ÀÌ %type Áö½Ã¹®À» »ç¿ëÇÑ °Í°ú µ¿ÀÏÇÑ È¿°ú¸¦ °®´Â´Ù.
%type java.lang.Integer
Yylex.yylex()ÀÇ return typeÀ» java.lang.Integer·Î ¼öµ¿À¸·Î ¹Ù²Ù´Â °ÍÀÌ´Ù.

2.2.12. End-of-FileÀÇ YYEOF

%yyeof Áö½Ã¹®Àº Yylex.YYEOF »ó¼ö¸¦ ¼±¾ðÇÏ°Ô ÇÑ´Ù. %integer Áö½Ã¹®ÀÌ ¼±¾ðµÈ °æ¿ì, Yylex.YYEOF°¡ end-of-file¿¡¼­ ¸®ÅϵȴÙ.
%yyeof
ÀÌ·¸°Ô ÇÏ¸é ´ÙÀ½°ú °°ÀÌ Yylex.YYEOF°¡ ¼±¾ðµÈ´Ù.
public final int YYEOF = -1;
%integer Áö½Ã¹®Àº %yyeof¸¦ ³»Æ÷ÇÑ´Ù.

2.2.13. °³Ç๮ÀÚÀÇ ¿î¿µÃ¼Á¦°£ ȣȯ¼º

UNIX ¿î¿µÃ¼Á¦¿¡¼­´Â °³Ç๮ÀÚ·Î '\n' ´ÜÀÏ character¸¦ »ç¿ëÇÑ´Ù. ¹Ý¸é, DOS ±â¹Ý ¿î¿µÃ¼Á¦¿¡¼­´Â "\r\n"(carriage return + newline)ÀÌ °³Ç๮ÀÚ·Î »ç¿ëµÈ´Ù. %notunix Áö½Ã¹®Àº carriage returnÀ̳ª newlineÀÌ °³Ç๮ÀÚ·Î Àνĵǵµ·Ï ÇÑ´Ù.
%notunix
¾î¶² ¹®ÀÚ¿­À» °³Ç๮ÀÚ·Î ÇÒ °ÍÀΰ¡ÀÇ ¹®Á¦´Â ÀÚ¹ÙÀÇ Ç÷§Æû µ¶¸³¼ºÀÇ Áß¿äÇÑ À̽´ÀÌ´Ù.

2.2.14. Character Sets

Default·Î´Â ¹®ÀÚ code Áß 0¿¡¼­ 127»çÀ̸¦ »ç¿ëÇÑ´Ù. ÀÌ ¹üÀ§¸¦ ¹þ¾î³ª´Â ¹®ÀÚ°¡ µé¾î¿À¸é lexer°¡ Á¦´ë·Î µ¿ÀÛÀ» ÇÏÁö ¸øÇÑ´Ù.

%full Áö½Ã¹®Àº ¹üÀ§¸¦ 8 bitÀ¸·Î ³ªÅ¸³¾ ¼ö ÀÖ´Â ¸ðµç °ªÀ¸·Î È®ÀåÇÑ´Ù.
%full
ÀÌ °æ¿ì, »ý¼ºµÉ lexical analyzer°¡ 0¿¡¼­ 255»çÀÌÀÇ °ªµéÀ» ¹Þ¾ÆµéÀδÙ.

%unicode Áö½Ã¹®Àº ¹üÀ§¸¦ 16 bitÀ¸·Î ³ªÅ¸³¾ ¼ö ÀÖ´Â ¸ðµç À¯´ÏÄÚµå·Î È®ÀåÇÑ´Ù.
%unicode
ÀÌ °æ¿ì, »ý¼ºµÉ lexical analyzer°¡ 0¿¡¼­ 2^16-1»çÀÌ °ªµéÀ» ¹Þ¾ÆµéÀδÙ.

%ignorecase Áö½Ã¹®Àº ´ë¼Ò¹®ÀÚ ±¸º°À» ÇÏÁö ¾Ê´Â lexer¸¦ »ý¼ºÇÏ°Ô ÇÑ´Ù.
%ignorecase
ÀÌ °æ¿ì, CUPÀÌ ¸ðµç ¹®ÀÚ ÁýÇÕµéÀ» À¯´ÏÄÚµåÀÇ ¹æ¹ý¿¡ µû¶ó È®ÀåÇÏ¿© ´ë¼Ò¹®ÀÚ¸¦ ±¸ºÐÇÏÁö ¾Ê´Â´Ù.

2.2.15. ÆÄÀÏ ÀÔÃâ·Â½ÃÀÇ ¹®ÀÚ Çü½Ä

ÇöÀç JLex ¹öÁ¯¿¡¼­ »ý¼ºµÇ´Â lexical analyzer¿¡¼­´Â ÇÑ ¹®ÀÚ ´ç ÇÑ ¹ÙÀÌÆ®°¡ ÇÒ´çµÇ´Â ¾Æ½ºÅ° Çü½ÄÀÇ ÅØ½ºÆ® ÆÄÀϸ¸À» Áö¿øÇÑ´Ù. ÇÏÁö¸¸, ¾ÕÀ¸·ÎÀÇ È®À强À» À§ÇÏ¿© ºñ·Ï 16 ºñÆ®ÀÇ Àüü Ç¥Çö ¹üÀ§¸¦ ¸ðµÎ Áö¿øÇÏÁö´Â ¾ÊÁö¸¸, ¸ðµç JLexÀÇ ³»ºÎ ¹®ÀÚ Ã³¸®¿¡ 16 ºñÆ® ÀÚ¹Ù ¹®ÀÚÇüÀ» »ç¿ëÇϰí ÀÖ´Ù.

2.2.16. Lexical actionµé¿¡¼­ ¹ß»ýµÇ´Â exceptionµé"

JLexÀÇ 3¹øÂ° section¿¡ ÇØ´çµÇ´Â Á¤±Ô½Ä ±ÔÄ¢ÀÇ actionºÎ ÄÚµåµéÀº exceptionÀ» throwÇϰųª ´Ù¸¥ ÇÔ¼ö·ÎºÎÅÍÀÇ °ÍÀ» ÀüÆÄ½Ãų ¼ö ÀÖ´Ù. À̵é exceptionÀ» ¼±¾ðÇÏ·Á¸é %yylexthrow{ ... %yylexthrow} Áö½Ã¹®À» »ç¿ëÇÏ¸é µÈ´Ù.
%yylexthrow{
<exception[1]>[,<exception[1]>,...]
%yylexthrow}
ÀÌ·¸°Ô ¼±¾ðµÈ exceptionµéÀº lexical analyzer Åäūȭ ÇÔ¼öÀÎ Yylex.yylex() ¼±¾ðºÎ¿¡ ´ÙÀ½°ú °°Àº ÇüÅ·Πº¹»çµÈ´Ù.
public Yytoken yylex()
throws <exception[1]>[,<exception[1]>,...]
{
...
}
%yylexthrow{ ... %yylexthrow} Áö½Ã¹®¾ÈÀÇ ÀÚ¹Ù Äڵ忡¼­ ¼±¾ðµÇÁö ¾ÊÀº exceptionÀ» throwÇÏ´Â °æ¿ì »ý¼ºµÈ lexical analyzer ¼Ò½º ÆÄÀÏÀÌ ¼º°øÀûÀ¸·Î ÄÄÆÄÀÏ µÇÁö ¸øÇÒ °ÍÀÌ´Ù.

2.2.17. End-of-File¿¡¼­ÀÇ ¸®Åϰª

%eofval{ ... %eofval} Áö½Ã¹®Àº end-of-fileÀÇ ¸®ÅϰªÀ» ¸í½ÃÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ Áö½Ã¹®Àº lexical analyzer°¡ end-of-fileÀ» ¸¸³µÀ» ¶§ ¼öÇàµÇ´Â Yylex.yylex()¾È¿¡ ³ÖÀ» Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÀÌ Äڵ忡¼­´Â Åäūȭ ÇÔ¼ö Yylex.yylex()ÀÇ ¸®ÅÏ Å¸ÀÔ°ú ÀÏÄ¡ÇÏ´Â °ªÀ» ¸®ÅÏÇØ¾ß ÇÑ´Ù.
%eofval{
<code>
%eofval}
À§¿Í °°Àº ¹æ¹ýÀ¸·Î lexical analyzer Ŭ·¡½º°¡ ÀÔ·Â ÆÄÀÏÀÇ ³¡¿¡ µµ´ÞÇÏ¿´À» ¶§ Yylex.yylex()ÀÇ ¸®ÅϰªÀ» °áÁ¤ÇÏ´Â code¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. end-of-file¿¡ ¿©·¯ ¹ø µµ´ÞÇÏ´Â °æ¿ì ±×¶§¸¶´Ù À§ÀÇ <code>¿¡¼­ Yylex.yylex()ÀÇ ¸®ÅϰªÀ» °áÁ¤ÇÑ´Ù. ´Ù¸¥ Áö½Ã¹®µé°ú ¸¶Âù°¡Áö·Î %eofval{°ú %eofval} Áö½Ã¹®Àº ¶óÀÎÀÇ Ã³À½¿¡ À§Ä¡ÇØ¾ß ÇÑ´Ù.

´ÙÀ½Àº %eofval{ ... %eofval} Áö½Ã¹®ÀÇ »ç¿ë ¿¹ÀÌ´Ù. End-of-fileÀÇ ¸®ÅÏ °ªÀ¸·Î ±âº»°ªÀÎ nullÀÌ ¾Æ´Ñ (new token(sym.EOF))¸¦ ¿øÇÏ´Â °æ¿ì ´ÙÀ½°ú °°ÀÌ specification ÆÄÀÏ¿¡ Ãß°¡ÇÏ¸é µÈ´Ù.
%eofval{
return (new token(sym.EOF));
%eofval}
ÀÌ·¸°Ô Çϸé Yylex.yylex()°¡ ´ÙÀ½°ú °°ÀÌ »ý¼ºµÈ´Ù.
public Yytoken yylex(){ ...
return (new token(sym.EOF));
... }

2.2.18. ImplementÇÒ InterfaceÀÇ ¸í½Ã¹ý

JLex¿¡¼­´Â Yylex Ŭ·¡½º°¡ ƯÁ¤ interface¸¦ implementÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°Àº ¼±¾ð¹®À» Ãß°¡ÇÏ¸é µÈ´Ù.
%implements <classname>
ÀÌ·¸°Ô ÇÏ¸é ´ÙÀ½°ú °°Àº lexical analyzer Ŭ·¡½º°¡ »ý¼ºµÈ´Ù.
class Yylex implements classname { ...

2.2.19. Lexical analyzer Ŭ·¡½º¸¦ publicÀ¸·Î ÇÏ´Â ¹æ¹ý

%public Áö½Ã¹®À» ¼±¾ðÇϸé JLex°¡ lexical analyzer Ŭ·¡½º¸¦ public Ŭ·¡½º·Î ¸¸µç´Ù.
%public
default·Î´Â ¾Æ¹«·± Ŭ·¡½º access specifierµµ ºÙÁö ¾Ê¾Æ¼­, °°Àº ÆÐŰÁö ¾È¿¡¼­¸¸ ÂüÁ¶ °¡´ÉÇÏ°Ô ÇÑ´Ù.

2.3. Á¤±Ô½Ä ±ÔÄ¢µé

JLex specification ÆÄÀÏÀÇ ¼¼ ¹øÂ° ºÎºÐ¿¡´Â ÀÔ·Â ½ºÆ®¸²À» ÅäÅ«À¸·Î ºÐÇØÇÏ´Â ±ÔÄ¢µéÀ» ¿­°ÅÇÑ´Ù. ÀÌµé ±ÔÄ¢µéÀº Á¤±Ô½Ä°ú ÀÌ¿¡ ¿¬°áµÈ actionÀ» ¼³¸íÇÏ´Â ÀÚ¹Ù ÄÚµå·Î ±¸¼ºµÇ¾î ÀÖ´Ù.

ÇϳªÀÇ ±ÔÄ¢Àº Optional »óÅ list, Á¤±Ô½Ä, actionÀÇ ¼¼ ºÎºÐÀ¸·Î ³ª´©¾îÁö¸ç, ´ÙÀ½°ú °°Àº Çü½ÄÀ» °®´Â´Ù.
[<»óÅÂs>]<Á¤±Ô½Ä>{<action>}
°¢ ºÎºÐ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ÀÌÈÄ¿¡ ÇϰڴÙ.

ÀÔ·Â ¹®ÀÚ¿­ÀÌ Çϳª ÀÌ»óÀÇ ±ÔÄ¢°ú ÀÏÄ¡ÇÏ´Â °æ¿ì, lexer´Â ±æÀ̰¡ °¡Àå ±ä ¹®ÀÚ¿­°ú ÀÏÄ¡ÇÏ´Â ±ÔÄ¢À» ¼±ÅÃÇÑ´Ù. ±×·¡µµ, ±æÀ̰¡ °°Àº ¹®ÀÚ¿­ÀÌ ¿©·¯ °³ÀÎ °æ¿ì JLex specification¿¡ ¸ÕÀú ¸í½ÃµÈ ±ÔÄ¢À» ¼±ÅÃÇÑ´Ù. °á±¹, specification¿¡¼­ ´õ ¾Õ¿¡ ÀÖ´Â ±ÔÄ¢µéÀÌ ´õ ³ôÀº ¿ì¼±±ÇÀ» °®´Â´Ù°í º¼ ¼ö ÀÖ´Ù.

JLex specification ÆÄÀÏ¿¡ ¼±¾ðµÈ ±ÔÄ¢µéÀº °¡´ÉÇÑ ¸ðµç ÀԷ¿¡ Àû¿ëµÉ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¸¸¾à, lexical anaylzer°¡ ÀÌµé ±ÔÄ¢¿¡ Àû¿ëµÇÁö ¸øÇÏ´Â ÀÔ·ÂÀ» ¹Þ´Â °æ¿ì ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

°á±¹, ¸ðµç ÀԷµéÀº Àû¾îµµ ÇϳªÀÇ ±ÔÄ¢¿¡ Àû¿ëµÉ ¼ö ÀÖ¾î¾ß Çϸç, À̰ÍÀº ´ÙÀ½°ú °°Àº ±ÔÄ¢À» Á¦ÀÏ ¸¶Áö¸·¿¡ Ãß°¡ÇÏ´Â ¹æ¹ýÀ¸·Î º¸ÀåÇÒ ¼ö ÀÖ´Ù.
. { java.lang.System.out.println("Unmatched input:" + yytext()); }
Á¡(.)Àº °³Çà ¹®ÀÚ¸¦ Á¦¿ÜÇÑ ¸ðµç ÀÔ·ÂÀ» ÀǹÌÇÑ´Ù.

2.3.1. Lexical States

Optional lexical »óÅ ¸®½ºÆ®´Â ±ÔÄ¢ÀÇ ¾Õ ºÎºÐ¿¡ À§Ä¡Çϸç, ´ÙÀ½°ú °°Àº Çü½ÄÀ» µû¸¥´Ù.
<»óÅÂ[0][,state[1],stateg[2],...]>
»óÅÂÀÇ Áߺ¹ ¼±¾ðÀº ¼±ÅûçÇ×À̸ç, ²©¼â ¦(<>)¾È¿¡ À§Ä¡ÇØ¾ß ÇÑ´Ù. »óÅ list´Â ¾î¶² Ãʱ⠻óÅÂÇÏ¿¡¼­ ±ÔÄ¢ÀÌ Àû¿ëµÉ ¼ö Àִ°¡¸¦ ³ªÅ¸³½´Ù.

¿¹¸¦ µé¾î, yylex()°¡ »óÅ AÀ϶§ È£ÃâµÈ °æ¿ì, lexer´Â »óÅ list¿¡ A°¡ Æ÷ÇÔµÈ ±ÔÄ¢µé¸¸À» Àû¿ë½Ãų ¼ö ÀÖ´Ù.

»óÅ list°¡ ¾ø´Â °ÍÀº, ¸ðµç »óÅ¿¡¼­ ÇØ´ç ±ÔÄ¢ÀÌ Àû¿ë °¡´ÉÇÔÀ» ³ªÅ¸³½´Ù.

2.3.2. Á¤±Ô½Ä

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´Â ¿ø·¡ÀÇ Æ¯º°ÇÑ Àǹ̸¦ ÀҴ´Ù.

    • - ´ë°ýÈ£ ¾ÈÀÇ Ã¹ ±ÛÀÚ³ª ³¡ ±ÛÀÚ°¡ -ÀÎ °æ¿ì -´Â ¿ø·¡ÀÇ Æ¯º°ÇÑ Àǹ̸¦ ÀҴ´Ù.

    ¿¹) [a-z] ÀÓÀÇÀÇ ¼Ò¹®ÀÚ [^0-9] ¾Æ¶óºñ¾Æ ¼ýÀÚ¸¦ Á¦¿ÜÇÑ ¸ðµç ¹®ÀÚ [0-9a-fA-F] ÀÓÀÇÀÇ 16Áø¼ö [\-\\] dash or backslash ["A-Z"] A, dash, or Z [+-] and [-+] '+' or '-'

2.3.3. ¿¬°üµÈ Actionµé

Lexical ±ÔÄ¢¿¡ ¿¬°üµÈ ActionÀº Áß°ýÈ£·Î ¹­¿©Áø ÀÚ¹Ù ÄÚµå·Î ÀÛ¼ºÇÑ´Ù.
{ action }
À§ÀÇ action ºÎºÐ ÀÚ¹Ù ÄÚµå´Â JLex·Î »ý¼ºµÈ »óÅÂ-driven lexical analyzer¿¡ º¹»çµÈ´Ù.

action ºÎºÐÀÇ ¹®ÀÚ¿­À̳ª ÁÖ¼®À» Á¦¿ÜÇÑ ºÎºÐ¿¡ ÀÖ´Â ¿­°í ´Ý´Â Áß°ýÈ£µéÀÇ ¼ýÀÚ´Â ÀÏÄ¡ÇØ¾ß ÇÑ´Ù.

2.3.3.1. Action°ú Àç±ÍÈ£Ãâ

Action¿¡¼­ ¾Æ¹«·± °ªµµ ¸®ÅϵÇÁö ¾Ê´Â °æ¿ì, lexical analyzer´Â ÀÔ·Â ½ºÆ®¸²À¸·ÎºÎÅÍ ´ÙÀ½ ÅäÅ«À» ã°í ¸®ÅÏÇÒ ¶§±îÁö ·çÇÁ¸¦ µ·´Ù.

´ÙÀ½°ú °°ÀÌ ÇÏ¿© yylex¸¦ ¸í½ÃÀûÀ¸·Î Àç±ÍÈ£Ãâ ÇÒ ¼ö ÀÖ´Ù.
{ ...
return yylex();
... }
ÀÌ·¸°Ô ÇÏ¸é ´ÙÀ½ ÅäÅ«À» ã°í ÇØ´ç °ªÀÌ ¸®Å쵃 ¶§±îÁö Àç±ÍÀûÀ¸·Î lexical analyzer°¡ µ¿ÀÛÇÑ´Ù. ÇÏÁö¸¸, ÁÖ¾îÁø action¿¡¼­ ¾Æ¹«·± °ªµµ ¸®ÅÏÇÏÁö ¾Ê°Ô ÇÔÀ¸·Î½á °°Àº È¿°ú¸¦ ¾òÀ» ¼ö ÀÖÀ¸¸ç, ÀÌ·¸°Ô Çϸé Àç±Í È£Ãâ·Î ÀÎÇÑ overhead¸¦ ÇÇÇÒ ¼ö ÀÖ´Ù.

¾ÕÀÇ ÄÚµå´Â È£ÃâÇÏ´Â ÇÔ¼öÀÇ ³¡¿¡¼­ Àç±ÍÈ£ÃâÀÌ ÀϾ±â ¶§¹®¿¡ tail recursionÀÌ´Ù. ¾Æ·¡ ÄÚµå´Â tail recursionÀÌ ¾Æ´Ñ Àç±ÍÈ£ÃâÀÇ ¿¹ÀÌ´Ù.
{ ...
next = yylex();
... }
tail recursionÀÌ ¾Æ´Ñ Àç±ÍÈ£ÃâÀÇ °æ¿ì¿¡µµ yylineÀ̳ª yychar¿Í °°Àº º¯¼öµéÀÇ °ªÀÌ Àç±ÍÈ£Ãâ µµÁß ¹Ù²î´Â Á¡¸¸ Àç¿ÜÇÑ´Ù¸é ¿Ã¹Ù¸£°Ô µ¿ÀÛÇÑ´Ù.

2.3.3.2. State Àüȯ

JLex Áö½Ã¹® section¿¡ lexical »óŵéÀÌ ¼±¾ðµÈ °æ¿ì, Á¤±Ô½Ä action¿¡ »óÅ ÀüȯÀ» ´ÙÀ½°ú °°Àº ÇüÅ·ΠÁö½ÃÇÒ ¼ö ÀÖ´Ù.
yybegin(»óÅÂ);
voidÇü yybegin()ÇÔ¼ö´Â »óÅ À̸§ÀÎ »óŸ¦ ³Ñ°Ü¹Þ¾Æ¼­ ÇØ´ç »óÅ·ΠÀüȯÀ» ÇÑ´Ù.

yybeginÀÇ parameter´Â JLex Áö½Ã¹® section¿¡¼­ ¼±¾ðµÇ¾î¾ß Çϸç, ±×·¸Áö ¾ÊÀº °æ¿ì »ý¼ºµÈ ¼Ò½ºÀÇ ÄÄÆÄÀÏ °úÁ¤¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. ¿¹¿ÜÀûÀ¸·Î YYINITIALÀº ¾Ï½ÃÀûÀ¸·Î JLex¿¡ ÀÇÇØ ¼±¾ðµÇ¾î Àֱ⠶§¹®¿¡ Ãß°¡ÀÇ ¼±¾ð¹®ÀÌ ÇÊ¿ä ¾ø´Ù. »ý¼ºµÈ lexer´Â YYINITIAL »óÅ·ΠºÎÅÍ ½ÃÀÛµÇ¸ç »óÅ ÀüȯÀÌ ÀÖ±â Àü±îÁö ÀÌ »óÅ¿¡ ¸Ó¹®´Ù.

2.3.3.3. »ç¿ë °¡´ÉÇÑ Lexical º¯¼öµé

¾Æ·¡ÀÇ º¯¼öµéÀº Yylex Ŭ·¡½º¿¡ ³»ºÎÀûÀ¸·Î ¼±¾ðµÇ´Â °Íµé·Î lexical ±ÔÄ¢ÀÇ action ºÎ¿¡¼­ »ç¿ë °¡´ÉÇÏ´Ù.

Ç¥ 1.

Variable or MethodActivation DirectiveDescription
java.lang.String yytext();Always active.Á¤±Ô½Ä°ú ÀÏÄ¡µÈ ÀÔ·Â ½ºÆ®¸²ÀÇ ¹®ÀÚ¿­ ºÎºÐ
int yychar;%charÁ¤±Ô½Ä°ú ÀÏÄ¡µÈ ºÎºÐÀÇ ÀÔ·Â ½ºÆ®¸²¿¡¼­ÀÇ zero-based ¹®ÀÚ index
int yyline;%lineÁ¤±Ô½Ä°ú ÀÏÄ¡µÈ ºÎºÐÀÇ ÀÔ·Â ½ºÆ®¸²¿¡¼­ÀÇ zero-based Çà¹øÈ£