¹®¹ý¿¡ ¸Â°Ô ÀÛ¼ºµÈ 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ÀÌ¸ç ´ÙÀ½°ú °°ÀÌ ÇÔ¼ö ÇüŰ¡ Á¤ÀǵǾî ÀÖ´Ù.
class Yylex { ...
public Yytoken yylex() {
... } |
»ç¿ëÀÚ´Â Yytoken ÇüÀ» Á¤ÀÇÇØ¾ß¸¸ Çϸç, À̰ÍÀº JLex specificationÀÇ Ã¹ ¹øÂ° section¿¡¼ ½±°Ô ÇÒ ¼ö ÀÖ´Â ÀÛ¾÷ÀÌ´Ù. ¿¹¸¦ µé¾î, Yylex.yylex()°¡ integerÀÇ wrapper¸¦ ¸®ÅÏÇÏ´Â °æ¿ì, ù ¹øÂ° %% ¾Õ¿¡ ´ÙÀ½°ú °°Àº Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
class Yytoken { int field; Yytoken(int f) { field=f; } } |
ÀÌ·¸°Ô ÇÑ µÚ, lexical action¿¡¼ ´ÙÀ½°ú °°ÀÌ wrapped integer¸¦ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù.
{ ...
return new Yytoken(0);
... } |
¸¶Âù°¡Áö·Î, »ç¿ëÀÚ ÄÚµå section¿¡¼ °¢ ÅäÅ«Çü¿¡ ÇØ´çÇÏ´Â »ó¼ö¸¦ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.
class TokenCodes { ...
public static final STRING = 0;
public static final INTEGER = 1;
... } |
ÀÌ·¸°Ô ÇÑ µÚ, À̵é Áß Çϳª¸¦ ´ÙÀ½°ú °°ÀÌ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù.
{ ...
return new Yytoken(STRING);
... } |
ÀÌ»óÀº ¾ÆÁÖ °£´ÜÇÑ ¿¹µé·Î, ½ÇÁ¦·Î´Â ÈξÀ ¸¹Àº Á¤º¸¸¦ ´ãÀ» ¼ö ÀÖ´Â ÅäÅ« Ŭ·¡½º¸¦ ¸¸µé¾î¾ß ÇÏ´Â °æ¿ì°¡ ¸¹´Ù.
Yylex.yylex()¿¡¼ ¸®ÅϵǴ ÅäÅ«ÇüÀ» º¸´Ù ´Ù¾çÇÏ°Ô Çϱâ À§Çؼ ¿©·¯°¡Áö °´Ã¼ ÁöÇâÀûÀÎ ±â¹ýµéÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¿¹¸¦ µé¾î, »ó¼ÓÀ» »ç¿ëÇϸé Çϳª ÀÌ»óÀÇ ÅäÅ«ÇüÀ» »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ¹®ÀÚ¿°ú Á¤¼öµé¿¡ ´ëÇØ ÅäÅ«ÇüÀ» ±¸º°ÇÏ°í ½ÍÀº °æ¿ì ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
class Yytoken { ... }
class IntegerToken extends Yytoken { ... }
class String extends Yytoken { ... } |
ÀÌ·¸°Ô ÇÑ µÚ, IntegerToken°ú StringToken ÇüÀ» ±¸º°ÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ´Ù.
lexical analyzer Ŭ·¡½º¸í, ÅäÅ«È ÇÔ¼ö¸í°ú ¸®ÅÏÇüÀº JLex Áö½Ã¹®À» ÅëÇÏ¿© º¯°æµÉ ¼ö ÀÖ´Ù. 2.2.9 section¿¡ º¸´Ù ÀÚ¼¼ÇÑ ¼³¸íÀÌ ÀÖ´Ù.