JLex ManualElliot BerkDepartment of Computer Science, Princeton University ¹ÚÁ¾¼öJLex : Java¿ë Lexical analyzer generator ÃֽŠ¹öÁ¯À» http://www.cs.princeton.edu/~appel/modern/java/JLex¿¡¼ ±¸ÇÒ ¼ö ÀÖ´Ù.
1. ¼Ò°³Lexical analyzer´Â ¹®ÀÚ¿ ÀÔ·Â ½ºÆ®¸²À» ÅäÅ«À¸·Î ºÐÇØÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ¾îÈÖ ºÐ¼®±â¸¦ ¼öµ¿À¸·Î ÀÛ¼ºÇÏ´Â °ÍÀº ³ÇØÇÑ ÀÛ¾÷À̹ǷÎ, Á» ´õ ½±°Ô ÇÒ ¼ö ÀÖ´Â µµ±¸µéÀÌ °³¹ßµÇ¾ú´Ù. ÀÌÁß °¡Àå Àß ¾Ë·ÁÁø °ÍÀÌ LexÀÌ´Ù. Lex´Â C ¾ð¾î¸¦ Ÿ°ÙÀ¸·Î ÇÏ´Â UNIX ¿ë lexical analyzer generatorÀÌ´Ù. Lex´Â lexical analyzerÀÇ ¼¼ºÎ »çÇ×µéÀ» ´ã°í Àִ ƯÁ¤ÇÑ ÇüÅÂÀÇ specification ÆÄÀÏÀ» ºÐ¼®ÇÏ¿©, table-driven ¹æ½ÄÀÇ lexical analyzer C ¼Ò½º Äڵ带 »ý¼ºÇÑ´Ù. JLex´Â LexÀÇ lexical analyzer »ý¼º ¸ðµ¨À» ±â¹ÝÀ¸·Î ÇÑ´Ù. JLex´Â Lex¿Í ºñ½ÁÇÑ specification ÆÄÀÏÀ» ¹Þ¾Æµé¿©¼ ÇØ´ç ±â´ÉÀ» ¼öÇàÇÏ´Â Java ¼Ò½º Äڵ带 »ý¼ºÇÑ´Ù. 2. JLex specificationsJLex specificationÀº %%·Î ±¸ºÐµÈ ¼¼ sectionÀ¸·Î ±¸¼ºµÈ´Ù. Çü½ÄÀº ´ÙÀ½°ú °°´Ù
specification ÆÄÀÏÀÇ Ã¹ sectionÀÎ »ç¿ëÀÚ ÄÚµå sectionÀº Ãâ·Â ÆÄÀÏ¿¡ ±×´ë·Î º¹»çµÇ´Â ºÎºÐÀÌ´Ù. ÀÌ ¿µ¿ªÀº À¯Æ¿¸®Æ¼ Ŭ·¡½º³ª ¸®ÅÏ typeÀ» ±â¼úÇÒ ¼ö ÀÖµµ·Ï Á¦°øµÇ´Â °ø°£ÀÌ´Ù. µÎ ¹ø °ÀÎ JLex Áö½Ã¹® section¿¡¼´Â, ¸ÅÅ©·Î°¡ Á¤Àǵǰí state À̸§ÀÌ ¼±¾ðµÈ´Ù. ¼¼ ¹ø° section¿¡¼´Â lexical analyzerÀÇ ruleÀÌ Á¤ÀǵȴÙ. : °¢ ruleÀº option state 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 Ŭ·¡½º¿¡ º¹»çµÉ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. Çü½ÄÀº ´ÙÀ½°ú °°´Ù.
2.2.2. Lexical analyzer Ŭ·¡½ºÀÇ ÃʱâÈ ÄÚµå%init{ ... %init} Áö½Ã¹®¾È¿¡´Â lexical analyzer Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡ º¹»çµÉ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
%init{ ... %init} Áö½Ã¹®¾È¿¡¼´Â exceptionÀ» throwÇϰųª ´Ù¸¥ ÇÔ¼ö·ÎºÎÅÍÀÇ °ÍÀ» ÀüÆĽÃų ¼ö ÀÖ´Ù. À̵é exceptionÀ» ¼±¾ðÇÏ·Á¸é %initthrow{ ... %initthrow} Áö½Ã¹®À» »ç¿ëÇÏ¸é µÈ´Ù.
2.2.3. Lexical analyzer Ŭ·¡½ºÀÇ End-of-File ÄÚµå%eof{ ... %eof} Áö½Ã¹®¾È¿¡´Â lexical analyzer Ŭ·¡½º°¡ end-of-fileÀ» ¸¸³ ÀÌÈÄ¿¡ ¼öÇàÇÒ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
%eof{ ... %eof} Áö½Ã¹®¾ÈÀÇ codeµéÀº exceptionÀ» throwÇϰųª ´Ù¸¥ ÇÔ¼ö·ÎºÎÅÍÀÇ °ÍÀ» ÀüÆĽÃų ¼ö ÀÖ´Ù. À̵é exceptionÀ» ¼±¾ðÇÏ·Á¸é %eofthrow{ ... %eofthrow} Áö½Ã¹®À» »ç¿ëÇÏ¸é µÈ´Ù.
2.2.4. ¸ÅÅ©·Î Á¤ÀǸÅÅ©·Î Á¤ÀÇ´Â specification ÆÄÀÏÀÇ JLex Áö½Ã¹® section¿¡¼ ÀÌ·ç¾îÁø´Ù. °¢°¢ÀÇ ¸ÅÅ©·Î Á¤Àǹ®Àº ¸ÅÅ©·Î À̸§, =, Á¤ÀǺΰ¡ µé¾î°£ ÇϳªÀÇ ÁÙ·Î ÀÛ¼ºµÈ´Ù. ´ÙÀ½°ú °°ÀÌ Çü½ÄÀ» ¿ä¾àÇÒ ¼ö ÀÖ´Ù.
¸ÅÅ©·Î À̸§Àº ¾ËÆĺªÀ̳ª ¹ØÁÙ·Î ½ÃÀÛÇÏ¿© ¾ËÆĺª, ¾Æ¶óºñ¾Æ ¼ýÀÚ, ¹ØÁÙÀÇ ³ª¿ÀÌ µû¶ó¿À´Â ÇüÅÂÀÇ Àû¹ýÇÑ identifier¿©¾ß ÇÑ´Ù. ¸ÅÅ©·Î Á¤Àǹ®Àº Àû¹ýÇÑ Á¤±Ô½ÄÀ̾î¾ß ÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ¾Æ·¡ sectionÀ» Âü°íÇ϶ó. ¸ÅÅ©·Î Á¤Àǹ®Àº Á¤±Ô½Ä Áß°£¿¡ {<name>}°ú °°Àº Çü½ÄÀ¸·Î ´Ù¸¥ ¸ÅÅ©·Î Á¤ÀÇ°¡ Æ÷ÇԵǴ °ÍÀ» Çã¿ëÇÑ´Ù. ÇÏÁö¸¸, ÇÔ¼ö³ª nonterminal°ú °°ÀÌ »óÈ£ Àç±ÍÀûÀ¸·Î È£ÃâµÇ´Â °ÍÀ» Çã¿ëÇÏÁö ¾Ê´Â '¸ÅÅ©·Î'¶ó´Â °ÍÀ» ¸í½ÉÇØ¾ß ÇÑ´Ù. ¸ÅÅ©·Î Á¤Àǹ®¿¡¼ ¹ß»ýÇÏ´Â ¼øȯ ¹®Á¦´Â ¿¹»óÄ¡ ¸øÇÑ °á°ú¸¦ ¹ß»ý½Ãų ¼ö ÀÖ´Ù. 2.2.5. State ¼±¾ðLexical stateµéÀº ÁÖ¾îÁø ÀԷ¿¡ ¾î¶² Á¤±Ô½ÄÀ» Àû¿ëÇØ¾ß ÇÒÁö¸¦ ÆÇ´ÜÇÒ ¶§ »ç¿ëµÈ´Ù. ´ÙÀ½°ú °°Àº ÇüÅ·ΠJLex Áö½Ã¹®¾È¿¡ ¼±¾ðµÈ´Ù.
state¸íÀº ¾ËÆĺªÀ̳ª ¹ØÁÙ·Î ½ÃÀÛÇÏ¿© ¾ËÆĺª, ¾Æ¶óºñ¾Æ ¼ýÀÚ, ¹ØÁÙÀÇ ³ª¿ÀÌ µû¶ó¿À´Â ÇüÅÂÀÇ Àû¹ýÇÑ identifier¿©¾ß ÇÑ´Ù. JLex¿¡ ÀÇÇØ ÇϳªÀÇ lexical state°¡ ¾Ï½ÃÀûÀ¸·Î ¼±¾ðµÈ´Ù. »ý¼ºµÈ lexical analyzer°¡ ½ÃÀÛµÉ ¶§ YYINITIALÀ̶ó ºÒ¸®´Â state¸¦ °®´Â´Ù. lexical analyzeÀÇ ±ÔÄ¢µéÀº optional state ¸®½ºÆ®·Î ½ÃÀ۵ȴÙ. state list°¡ ÁÖ¾îÁø °æ¿ì lexical analyzer°¡ ¸í½ÃµÈ state ÁßÀÇ ÇϳªÀÏ °æ¿ì¿¡¸¸ lexical ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù. state list°¡ ¾ø´Â °æ¿ì lexical ±ÔÄ¢Àº ÇöÀçÀÇ lexical analyzerÀÇ state¿¡ ¹«°üÇÏ°Ô Àû¿ëµÈ´Ù. JLex specificationÀÌ stateµµ ¼±¾ðÇÏÁö ¾Ê°í lexical ±ÔÄ¢ ¾Õ¿¡ state list¸¦ µÎÁöµµ ¾Ê´Â °æ¿ì, »ý¼ºµÇ´Â lexerÀÇ state´Â YYINITIAL·Î °è¼Ó À¯ÁöµÈ´Ù. Lexical ±ÔÄ¢ ¾Õ¿¡ state list°¡ ¾ø±â ¶§¹®¿¡, ¾Ï½ÃÀûÀ¸·Î ¼±¾ðµÇ´Â YYINITAILÀ» Æ÷ÇÔÇÑ ¸ðµç state¿¡ ´ëÇØ ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù. µû¶ó¼, specification¿¡¼ state°¡ ÀüÇô »ç¿ëµÇÁö ¾ÊÀº °æ¿ì¶óµµ ¿¹»óÄ¡ ¸øÇÑ °á°ú°¡ ¹ß»ýÇÏÁø ¾Ê´Â´Ù. StateµéÀº »ý¼ºµÉ lexical analyzer Ŭ·¡½º¾È¿¡¼ »ó¼ö·Î ¼±¾ðµÈ´Ù. ¼±¾ðµÈ state¿¡ ´ëÀÀµÇ´Â »ó¼ö´Â state¸í°ú °°Àº À̸§À» °®´Â´Ù. µû¶ó¼, ±ÔÄ¢ÀÇ action ºÎºÐ¿¡ ¼±¾ðµÈ º¯¼ö¸íÀÌ state¸í°ú ÁßøµÇ´Â °ÍÀ» Á¶½ÉÇØ¾ß ÇÑ´Ù. °ü·ÊÀûÀ¸·Î state¸íÀ» ÀüºÎ ´ë¹®ÀÚ·Î ÇÏ¿© »ó¼ö¶ó´Â °ÍÀ» »ó±â½ÃÅ°°Ô²û ÇÑ´Ù. 2.2.6. ¹®ÀÚ¼ö ¼¼±â ±â´É¹®ÀÚ¼ö ¼¼±â ±â´ÉÀº default·Î ²¨Á®ÀÖÁö¸¸, %char Áö½Ã¹®¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù.
2.2.7. ÁÙ¹øÈ£ ¼¼±â ±â´ÉÁÙ¹øÈ£ ¼¼±â´Â default·Î ²¨Á®ÀÖÁö¸¸, %line Áö½Ã¹®¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù.
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 Áö½Ã¹®¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù.
2.2.9. Lexical Analyzer ±¸¼º¿ä¼Ò À̸§ º¯°æ¹ý¿©±â¼ ¼³¸íÇÒ Áö½Ã¹®µéÀ» »ç¿ëÇÏ¿© »ý¼ºµÉ lexical analyzer Ŭ·¡½º, ÅäÅ«È ÇÔ¼ö, ÅäÅ« ¸®ÅÏÇüÀ» ¹Ù²Ü ¼ö ÀÖ´Ù. Lexical analyzer Ŭ·¡½ºÀÇ À̸§À» YylexÀ¸·ÎºÎÅÍ º¯°æÇÒ ¶§´Â %class Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
Scoping Ãæµ¹À» ÇÇÇϱâ À§ÇØ lexical analyzerÀÇ ÇÔ¼ö¿Í º¯¼ö¿¡ ¿¹¾àµÈ À̸§µéÀº yy·Î ½ÃÀÛÇÑ´Ù. 2.2.10. Default ÅäÅ« Çü32-bit primitive Á¤¼öÇüÀÎ int¸¦ ÅäÅ«È ÇÔ¼öÀÇ ¸®ÅÏÇüÀ¸·Î Çϱâ À§ÇÏ¿© %integer Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
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 Integerjava.lang.Integer¸¦ ÅäÅ«È ÇÔ¼öÀÇ ¸®ÅÏÇüÀ¸·Î Çϱâ À§ÇÏ¿© %intwrap Áö½Ã¹®À» »ç¿ëÇÑ´Ù.
%intwrap Áö½Ã¹®Àº ´ÙÀ½°ú °°ÀÌ %type Áö½Ã¹®À» »ç¿ëÇÑ °Í°ú µ¿ÀÏÇÑ È¿°ú¸¦ °®´Â´Ù.
2.2.12. End-of-FileÀÇ YYEOF%yyeof Áö½Ã¹®Àº Yylex.YYEOF »ó¼ö¸¦ ¼±¾ðÇÏ°Ô ÇÑ´Ù. %integer Áö½Ã¹®ÀÌ ¼±¾ðµÈ °æ¿ì, Yylex.YYEOF°¡ end-of-file¿¡¼ ¸®ÅϵȴÙ.
2.2.13. °³Ç๮ÀÚÀÇ ¿î¿µÃ¼Á¦°£ ȣȯ¼ºUNIX ¿î¿µÃ¼Á¦¿¡¼´Â °³Ç๮ÀÚ·Î '\n' ´ÜÀÏ character¸¦ »ç¿ëÇÑ´Ù. ¹Ý¸é, DOS ±â¹Ý ¿î¿µÃ¼Á¦¿¡¼´Â "\n"(carriage return + newline)ÀÌ °³Ç๮ÀÚ·Î »ç¿ëµÈ´Ù. %notunix Áö½Ã¹®Àº carriage returnÀ̳ª newlineÀÌ °³Ç๮ÀÚ·Î Àνĵǵµ·Ï ÇÑ´Ù.
2.2.14. Character SetsDefault·Î´Â ¹®ÀÚ code Áß 0¿¡¼ 127»çÀ̸¦ »ç¿ëÇÑ´Ù. ÀÌ ¹üÀ§¸¦ ¹þ¾î³ª´Â ¹®ÀÚ°¡ µé¾î¿À¸é lexer°¡ Á¦´ë·Î µ¿ÀÛÀ» ÇÏÁö ¸øÇÑ´Ù. %full Áö½Ã¹®Àº ¹üÀ§¸¦ 8 bitÀ¸·Î ³ªÅ¸³¾ ¼ö ÀÖ´Â ¸ðµç °ªÀ¸·Î È®ÀåÇÑ´Ù.
%unicode Áö½Ã¹®Àº ¹üÀ§¸¦ 16 bitÀ¸·Î ³ªÅ¸³¾ ¼ö ÀÖ´Â ¸ðµç À¯´ÏÄÚµå·Î È®ÀåÇÑ´Ù.
%ignorecase Áö½Ã¹®Àº ´ë¼Ò¹®ÀÚ ±¸º°À» ÇÏÁö ¾Ê´Â lexer¸¦ »ý¼ºÇÏ°Ô ÇÑ´Ù.
2.2.15. ÆÄÀÏ ÀÔÃâ·Â½ÃÀÇ ¹®ÀÚ Çü½ÄÇöÀç JLex ¹öÁ¯¿¡¼ »ý¼ºµÇ´Â lexical analyzer¿¡¼´Â ÇÑ ¹®ÀÚ ´ç ÇÑ ¹ÙÀÌÆ®°¡ ÇÒ´çµÇ´Â ¾Æ½ºÅ° Çü½ÄÀÇ ÅؽºÆ® ÆÄÀϸ¸À» Áö¿øÇÑ´Ù. ÇÏÁö¸¸, ¾ÕÀ¸·ÎÀÇ È®À强À» À§ÇÏ¿© ºñ·Ï 16 ºñÆ®ÀÇ Àüü Ç¥Çö ¹üÀ§¸¦ ¸ðµÎ Áö¿øÇÏÁö´Â ¾ÊÁö¸¸, ¸ðµç JLexÀÇ ³»ºÎ ¹®ÀÚ Ã³¸®¿¡ 16 ºñÆ® ÀÚ¹Ù ¹®ÀÚÇüÀ» »ç¿ëÇÏ°í ÀÖ´Ù. 2.2.16. Lexical actionµé¿¡¼ ¹ß»ýµÇ´Â exceptionµé"JLexÀÇ 3¹ø° section¿¡ ÇØ´çµÇ´Â Á¤±Ô½Ä ±ÔÄ¢ÀÇ actionºÎ ÄÚµåµéÀº exceptionÀ» throwÇϰųª ´Ù¸¥ ÇÔ¼ö·ÎºÎÅÍÀÇ °ÍÀ» ÀüÆĽÃų ¼ö ÀÖ´Ù. À̵é exceptionÀ» ¼±¾ðÇÏ·Á¸é %yylexthrow{ ... %yylexthrow} Áö½Ã¹®À» »ç¿ëÇÏ¸é µÈ´Ù.
2.2.17. End-of-File¿¡¼ÀÇ ¸®ÅÏ°ª%eofval{ ... %eofval} Áö½Ã¹®Àº end-of-fileÀÇ ¸®ÅÏ°ªÀ» ¸í½ÃÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ Áö½Ã¹®Àº lexical analyzer°¡ end-of-fileÀ» ¸¸³µÀ» ¶§ ¼öÇàµÇ´Â Yylex.yylex()¾È¿¡ ³ÖÀ» Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ÀÌ Äڵ忡¼´Â ÅäÅ«È ÇÔ¼ö Yylex.yylex()ÀÇ ¸®ÅÏ Å¸ÀÔ°ú ÀÏÄ¡ÇÏ´Â °ªÀ» ¸®ÅÏÇØ¾ß ÇÑ´Ù.
´ÙÀ½Àº %eofval{ ... %eofval} Áö½Ã¹®ÀÇ »ç¿ë ¿¹ÀÌ´Ù. End-of-fileÀÇ ¸®ÅÏ °ªÀ¸·Î ±âº»°ªÀÎ nullÀÌ ¾Æ´Ñ (new token(sym.EOF))¸¦ ¿øÇÏ´Â °æ¿ì ´ÙÀ½°ú °°ÀÌ specification ÆÄÀÏ¿¡ Ãß°¡ÇÏ¸é µÈ´Ù.
2.2.18. ImplementÇÒ InterfaceÀÇ ¸í½Ã¹ýJLex¿¡¼´Â Yylex Ŭ·¡½º°¡ ƯÁ¤ interface¸¦ implementÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°Àº ¼±¾ð¹®À» Ãß°¡ÇÏ¸é µÈ´Ù.
2.2.19. Lexical analyzer Ŭ·¡½º¸¦ publicÀ¸·Î ÇÏ´Â ¹æ¹ý%public Áö½Ã¹®À» ¼±¾ðÇϸé JLex°¡ lexical analyzer Ŭ·¡½º¸¦ public Ŭ·¡½º·Î ¸¸µç´Ù.
2.3. Á¤±Ô½Ä ±ÔÄ¢µéJLex specification ÆÄÀÏÀÇ ¼¼ ¹ø° ºÎºÐ¿¡´Â ÀÔ·Â ½ºÆ®¸²À» ÅäÅ«À¸·Î ºÐÇØÇÏ´Â ±ÔÄ¢µéÀ» ¿°ÅÇÑ´Ù. ÀÌµé ±ÔÄ¢µéÀº Á¤±Ô½Ä°ú ÀÌ¿¡ ¿¬°áµÈ actionÀ» ¼³¸íÇÏ´Â ÀÚ¹Ù ÄÚµå·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ÇϳªÀÇ ±ÔÄ¢Àº Optional state list, Á¤±Ô½Ä, actionÀÇ ¼¼ ºÎºÐÀ¸·Î ³ª´©¾îÁö¸ç, ´ÙÀ½°ú °°Àº Çü½ÄÀ» °®´Â´Ù.
ÀÔ·Â ¹®ÀÚ¿ÀÌ Çϳª ÀÌ»óÀÇ ±ÔÄ¢°ú ÀÏÄ¡ÇÏ´Â °æ¿ì, lexer´Â ±æÀÌ°¡ °¡Àå ±ä ¹®ÀÚ¿°ú ÀÏÄ¡ÇÏ´Â ±ÔÄ¢À» ¼±ÅÃÇÑ´Ù. ±×·¡µµ, ±æÀÌ°¡ °°Àº ¹®ÀÚ¿ÀÌ ¿©·¯ °³ÀÎ °æ¿ì JLex specification¿¡ ¸ÕÀú ¸í½ÃµÈ ±ÔÄ¢À» ¼±ÅÃÇÑ´Ù. °á±¹, specification¿¡¼ ´õ ¾Õ¿¡ ÀÖ´Â ±ÔÄ¢µéÀÌ ´õ ³ôÀº ¿ì¼±±ÇÀ» °®´Â´Ù°í º¼ ¼ö ÀÖ´Ù. JLex specification ÆÄÀÏ¿¡ ¼±¾ðµÈ ±ÔÄ¢µéÀº °¡´ÉÇÑ ¸ðµç ÀԷ¿¡ Àû¿ëµÉ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¸¸¾à, lexical anaylzer°¡ ÀÌµé ±ÔÄ¢¿¡ Àû¿ëµÇÁö ¸øÇÏ´Â ÀÔ·ÂÀ» ¹Þ´Â °æ¿ì ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. °á±¹, ¸ðµç ÀԷµéÀº Àû¾îµµ ÇϳªÀÇ ±ÔÄ¢¿¡ Àû¿ëµÉ ¼ö ÀÖ¾î¾ß Çϸç, ÀÌ°ÍÀº ´ÙÀ½°ú °°Àº ±ÔÄ¢À» Á¦ÀÏ ¸¶Áö¸·¿¡ Ãß°¡ÇÏ´Â ¹æ¹ýÀ¸·Î º¸ÀåÇÒ ¼ö ÀÖ´Ù.
2.3.1. Lexical StatesOptional lexical state ¸®½ºÆ®´Â ±ÔÄ¢ÀÇ ¾Õ ºÎºÐ¿¡ À§Ä¡Çϸç, ´ÙÀ½°ú °°Àº Çü½ÄÀ» µû¸¥´Ù.
¿¹¸¦ µé¾î, yylex()°¡ state AÀ϶§ È£ÃâµÈ °æ¿ì, lexer´Â state list¿¡ A°¡ Æ÷ÇÔµÈ ±ÔÄ¢µé¸¸À» Àû¿ë½Ãų ¼ö ÀÖ´Ù. state list°¡ ¾ø´Â °ÍÀº, ¸ðµç state¿¡¼ ÇØ´ç ±ÔÄ¢ÀÌ Àû¿ë °¡´ÉÇÔÀ» ³ªÅ¸³½´Ù. 2.3.2. Á¤±Ô½ÄWhite space´Â Á¤±Ô½ÄÀÇ Á¾·á·Î Çؼ®µÇ±â ¶§¹®¿¡ Á¤±Ô½Ä Áß¿¡ white space°¡ Æ÷ÇÔµÇ¸é ¾ÈµÈ´Ù. ÇÑ°¡Áö ¿¹¿Ü·Î °³Ç๮ÀÚ¸¦ Á¦¿ÜÇÑ white space´Â µû¿ÈÇ¥·Î µÑ·¯½ÓÀ¸·Î½á ÀÚ±â ÀÚ½ÅÀ¸·Î Ç¥ÇöµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, " "´Â black space·Î Çؼ®µÈ´Ù. JLex´Â Á¤±Ô½Ä¿¡ 0~127»çÀÌÀÇ Ascii code¸¦ »ç¿ëÇÑ´Ù. ´ÙÀ½ ¹®ÀÚµéÀº JLexÀÇ Á¤±Ô½Ä¿¡¼ Ưº°ÇÑ Àǹ̸¦ °¡Áö´Â metacharacterµéÀÌ´Ù. ? * + | ( ) ^ $ . [ ] { } " \ ´Ù¸¥ ¹®ÀÚµéÀº ÀÚ±â ÀÚ½ÅÀ» ³ªÅ¸³½´Ù.
2.3.3. ¿¬°üµÈ ActionµéLexical ±ÔÄ¢¿¡ ¿¬°üµÈ ActionÀº Áß°ýÈ£·Î ¹¿©Áø ÀÚ¹Ù ÄÚµå·Î ÀÛ¼ºÇÑ´Ù.
action ºÎºÐÀÇ ¹®ÀÚ¿À̳ª ÁÖ¼®À» Á¦¿ÜÇÑ ºÎºÐ¿¡ ÀÖ´Â ¿°í ´Ý´Â Áß°ýÈ£µéÀÇ ¼ýÀÚ´Â ÀÏÄ¡ÇØ¾ß ÇÑ´Ù. 2.3.3.1. Action°ú Àç±ÍÈ£ÃâAction¿¡¼ ¾Æ¹«·± °ªµµ ¸®ÅϵÇÁö ¾Ê´Â °æ¿ì, lexical analyzer´Â ÀÔ·Â ½ºÆ®¸²À¸·ÎºÎÅÍ ´ÙÀ½ ÅäÅ«À» ã°í ¸®ÅÏÇÒ ¶§±îÁö ·çÇÁ¸¦ µ·´Ù. ´ÙÀ½°ú °°ÀÌ ÇÏ¿© yylex¸¦ ¸í½ÃÀûÀ¸·Î Àç±ÍÈ£Ãâ ÇÒ ¼ö ÀÖ´Ù.
¾ÕÀÇ ÄÚµå´Â È£ÃâÇÏ´Â ÇÔ¼öÀÇ ³¡¿¡¼ Àç±ÍÈ£ÃâÀÌ ÀϾ±â ¶§¹®¿¡ tail recursionÀÌ´Ù. ¾Æ·¡ ÄÚµå´Â tail recursionÀÌ ¾Æ´Ñ Àç±ÍÈ£ÃâÀÇ ¿¹ÀÌ´Ù.
2.3.3.2. State ÀüȯJLex Áö½Ã¹® section¿¡ lexical stateµéÀÌ ¼±¾ðµÈ °æ¿ì, Á¤±Ô½Ä action¿¡ state ÀüȯÀ» ´ÙÀ½°ú °°Àº ÇüÅ·ΠÁö½ÃÇÒ ¼ö ÀÖ´Ù.
yybeginÀÇ parameter´Â JLex Áö½Ã¹® section¿¡¼ ¼±¾ðµÇ¾î¾ß Çϸç, ±×·¸Áö ¾ÊÀº °æ¿ì »ý¼ºµÈ ¼Ò½ºÀÇ ÄÄÆÄÀÏ °úÁ¤¿¡¼ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. ¿¹¿ÜÀûÀ¸·Î YYINITIALÀº ¾Ï½ÃÀûÀ¸·Î JLex¿¡ ÀÇÇØ ¼±¾ðµÇ¾î Àֱ⠶§¹®¿¡ Ãß°¡ÀÇ ¼±¾ð¹®ÀÌ ÇÊ¿ä ¾ø´Ù. »ý¼ºµÈ lexer´Â YYINITIAL state·Î ºÎÅÍ ½ÃÀ۵Ǹç state ÀüȯÀÌ ÀÖ±â Àü±îÁö ÀÌ state¿¡ ¸Ó¹®´Ù. 2.3.3.3. »ç¿ë °¡´ÉÇÑ Lexical º¯¼öµé¾Æ·¡ÀÇ º¯¼öµéÀº Yylex Ŭ·¡½º¿¡ ³»ºÎÀûÀ¸·Î ¼±¾ðµÇ´Â °Íµé·Î lexical ±ÔÄ¢ÀÇ action ºÎ¿¡¼ »ç¿ë °¡´ÉÇÏ´Ù. 3. »ý¼ºµÇ´Â Lexical Anaylzer¹®¹ý¿¡ ¸Â°Ô ÀÛ¼ºµÈ specificationÀ¸·Î JLex¸¦ ½ÇÇà½ÃÅ°¸é, ÇØ´ç ±â´ÉÀ» ¼öÇàÇÏ´Â º¯È¯µÈ lexical analyzer ÀÚ¹Ù ¼Ò½º Äڵ带 ¾òÀ» ¼ö ÀÖ´Ù. »ý¼ºµÈ lexical analyzer´Â Yylex Ŭ·¡½º¿¡ ±¸ÇöµÈ´Ù. ¿©±â¿£ ÅäÅ«ÈÇÒ ÀÔ·Â ½ºÆ®¸²À» ÀÎÀÚ¸¦ ¹Þ´Â µÎ°³ÀÇ »ý¼ºÀÚ°¡ Á¸ÀçÇÑ´Ù. ÀÔ·Â ½ºÆ®¸²À¸·Î´Â java.io.InputStreamÀ̳ª java.io.Reader( ¿¹. StringReader )¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. JDK1.0ÀÇ java.io.InputStreamÀº À¯´ÏÄڵ带 Á¦´ë·Î ÀÐÁö ¸øÇϱ⠶§¹®¿¡, À¯´ÏÄڵ带 »ç¿ëÇÏ·Á´Â °æ¿ì java.io.Reader¸¦ »ç¿ëÇØ¾ß ÇÔ¿¡ À¯ÀÇÇÏÀÚ. lexer´Â Yylex.yylex()¸¦ »ç¿ëÇÏ¿© Á¢±Ù °¡´ÉÇÏ´Ù. ÀÌ ÇÔ¼ö´Â ÀÔ·Â ½ºÆ®¸²¿¡ Á¸ÀçÇÏ´Â ¹Ù·Î ´ÙÀ½ ÅäÅ«À» ¸®ÅÏÇÑ´Ù. ¸®ÅÏÇüÀº YytokenÀÌ¸ç ´ÙÀ½°ú °°ÀÌ ÇÔ¼ö ÇüÅ°¡ Á¤ÀǵǾî ÀÖ´Ù.
Yylex.yylex()¿¡¼ ¸®ÅϵǴ ÅäÅ«ÇüÀ» º¸´Ù ´Ù¾çÇÏ°Ô Çϱâ À§Çؼ ¿©·¯°¡Áö °´Ã¼ ÁöÇâÀûÀÎ ±â¹ýµéÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¿¹¸¦ µé¾î, »ó¼ÓÀ» »ç¿ëÇϸé Çϳª ÀÌ»óÀÇ ÅäÅ«ÇüÀ» »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¹®ÀÚ¿°ú Á¤¼öµé¿¡ ´ëÇØ ÅäÅ«ÇüÀ» ±¸º°ÇÏ°í ½ÍÀº °æ¿ì ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
lexical analyzer Ŭ·¡½º¸í, ÅäÅ«È ÇÔ¼ö¸í°ú ¸®ÅÏÇüÀº JLex Áö½Ã¹®À» ÅëÇÏ¿© º¯°æµÉ ¼ö ÀÖ´Ù. 2.2.9 section¿¡ º¸´Ù ÀÚ¼¼ÇÑ ¼³¸íÀÌ ÀÖ´Ù. 4. ¼º´ÉJLex¿¡ ÀÇÇØ »ý¼ºµÈ lexical analyzer¿Í ¼öµ¿À¸·Î ÀÛ¼ºµÈ lexical analyzerÀÇ ¼º´ÉÀ» ºñ±³ÇÑ º¥Ä¡¸¶Å· °á°ú°¡ ÀÖ´Ù. ½ÇÇè ½Ã »ç¿ëµÈ ¿¹Á¦ ÀÔ·ÂÀº °£´ÜÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿´À¸¸ç, ¼öµ¿À¸·Î ÀÛ¼ºµÈ lexical analyzerµµ ÀÚ¹Ù·Î ÀÛ¼ºÀÌ µÇ¾ú´Ù. µÎ°³ÀÇ °£´ÜÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾î ¼Ò½º ÆÄÀÏ¿¡ ´ëÇØ °¢°¢ÀÇ lexical analyzer¸¦ µ¿ÀÛ½ÃÅ°°í, 󸮽ð£À» ÃøÁ¤ÇÏ¿´´Ù. °¢°¢ÀÇ lexical analyzer´Â ÀÚ¹Ù·Î ÀÛ¼ºµÈ driver¿¡ ÀÇÇØ ¼öÇàµÇ¾ú´Ù. JLex·Î »ý¼ºµÈ lexical analyzer°¡ ´õ ºü¸£´Ù´Â °ÍÀÌ ´ÙÀ½ ½ÇÇè °á°ú¿Í °°ÀÌ ÆǸíµÇ¾ú´Ù. 표 2.
JLex lexical analyzer°¡ ¼öµ¿À¸·Î ÀÛ¼ºµÈ lexerº¸´Ù ÃæºÐÈ÷ ºü¸¥ ¼Óµµ¸¦ °¡Áö°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. JLex¿Í °°Àº ÇÁ·Î±×·¥¿¡ ÀÇÇØ ¸¸µé¾îÁø table-driven lexical analyzerµéÀÇ °¡Àå Å« ¹®Á¦Á¡ Áß Çϳª´Â ¼öµ¿À¸·Î ÀÛ¼ºµÈ °Í¿¡ ºñÇØ ¼Óµµ°¡ ´À¸®´Ù´Â Á¡À̾ú´Ù. ±×·¯¹Ç·Î, ÀÌ°ÍÀº JLex lexical analyzerÀÇ »ó´ëÀûÀÎ ¼Óµµ¸¦ ÀÔÁõÇÏ´Â Áß¿äÇÑ ½ÇÇè °á°ú·Î º¼ ¼ö ÀÖ´Ù. 5. ÇöÀçÀÇ ±¸Çö»óÀÇ ÃÊÁ¡µé5.1. ±¸ÇöµÇÁö ¾ÊÀº ±â´Éµé´ÙÀ½µéÀº JLex¿¡¼ ±¸ÇöµÇÁö ¾ÊÀº ±â´ÉÀÇ ¸ñ·ÏÀÌ´Ù. (¿ÏÀüÇÑ ¸ñ·ÏÀÌ ¾Æ´Ò ¼öµµ ÀÖ´Ù.)
5.2. À¯´ÏÄÚµå¿Í ¾Æ½ºÅ° ÄÚµåAnsi C¿¡¼ 8ºñÆ® ¹®ÀÚÇü(char)¸¦ »ç¿ëÇϴµ¥ ºñÇØ, ÀÚ¹Ù¿¡¼´Â 16ºñÆ® ¹®ÀÚÇü°ú À¯´ÏÄڵ带 Áö¿øÇϸç, ±âº»ÀûÀ¸·Î Á¦°øµÇ´Â String Ŭ·¡½º¿¡¼ À¯´Ï ÄÚµå ¹®ÀÚ¸¦ »ç¿ëÇÏ°í ÀÖ´Ù. 1.2.5 ¹öÁ¯¿¡ µé¾î¼ JLex´Â JDK 1.1ÀÇ Reader¿Í Write Ŭ·¡½º¸¦ lexical analyzerÀÇ ÀÔ·Â ÆÄÀÏÀÇ ÀÔÃâ·Â¿¡ »ç¿ëÇϱ⠽ÃÀÛÇß´Ù. ÀÌ°ÍÀº À¯´ÏÄڵ带 ÀÔÃâ·Â ¸ðµÎ¿¡¼ »ç¿ë °¡´ÉÇÏ´Ù´Â ¶æÀÌ´Ù. ¹°·Ð, »ý¼ºµÈ scanner°¡ À¯´ÏÄڵ带 Á¦´ë·Î »ç¿ëÇÒ ¼ö ÀÖ°Ô Çϱâ À§Çؼ´Â, scannerÀÇ »ý¼ºÀÚÀÇ ÀÎÀÚ·Î java.io.Reader ÀνºÅϽº¸¦ ÁÖ¾î¾ß Çϸç, OS °íÀ¯ÀÇ Çü½ÄÀ» À¯´ÏÄÚµå·Î Á¤È®È÷ ¹Ù²Ù¾î ÁÙ ¼ö ÀÖ´Â Reader¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. %unicode Áö½Ã¹®µµ ¼±¾ðÇØ ÁÖ¾î¾ß ÇÑ´Ù. (section 2.2.14 Âü°í) 5.3. State ¸ñ·Ï¿¡¼ÀÇ ½°Ç¥state ¼±¾ð ¸ñ·Ï°ú lexical ±ÔÄ¢ »çÀÌÀÇ ½°Ç¥´Â ¼±ÅûçÇ×ÀÌ´Ù. À̵éÀº ½°Ç¥ ºÐ¸®ÀÚ ¾øÀ̵µ °ø¹é ¹®ÀÚ¸¦ »ç¿ëÇÏ¿© ¿Ã¹Ù¸£°Ô Çؼ® °¡´ÉÇÏ´Ù. 5.4. ±¸ÇöµÇÁö ¾Ê´Â ±â´É Áß ¾ÕÀ¸·Î °³¼±ÇÒ °èȹ ÁßÀÎ °Íµé´ÙÀ½Àº °ð JLex¿¡ ±¸ÇöµÉ ¼ö ÀÖ´Â °ÍµéÀÌÁö¸¸, scope³ª ¼º´É¿¡ ¹ÌÄ¡´Â ¾ÇÈ¿°ú µîÀ» °í·ÁÇÏ¿© ¾ÆÁ÷ ±¸ÇöµÇÁö ¾ÊÀº ±â´ÉµéÀÌ´Ù.
6. Credits and Copyrights6.1. CreditsThe treatment of lexical analyzer generators given in Alan Holub's Compiler Design in C(Prentice-Hall, 1990) provided a starting point for my implementation. Discussions with Professor Andrew Appel of the Princeton University Computer Science Department provided guidance in the design of JLex Java is a trademart of Sun Microsystems Incorporated. 6.2. CopyrightJLex COPYRIGHT NOTICE, LICENSE AND DICSCLAIMER. Copyright 1996 by Elliot Joel Berk. Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copyes and that both the copyright notice and this permission notice and warranty disclaimer appear in supporting documentation, and that the name of Elliot Joel Berk not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Elliot Joel Berk discaims all warranties with regard to this software, including all implied warranties of merchantability and fitness. In no event shall Elliot Joel Berk be liable for any speicial, indirect or consequntial damages or any damages whatsoever resulting from loss of use, data or profits, whether in an action of contract, negligence or other tortous action, arising out of or in connection with the use or performance of this software. |
A man who fishes for marlin in ponds will put his money in Etruscan bonds. |