· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/JLex-TRANS

JLex Manual

JLex Manual

Elliot Berk

Department of Computer Science, Princeton University

¹ÚÁ¾¼ö

JLex : Java¿ë Lexical analyzer generator ÃֽŠ¹öÁ¯À» http://www.cs.princeton.edu/~appel/modern/java/JLex¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù.

고친 과정
고침 ¹ø¿ª 1.12003³â 9¿ù 22ÀÏ고친이 ¹ÚÁ¾¼ö
고침 ¹ø¿ª 1.02001³â 3¿ù 20ÀÏ고친이 ¹ÚÁ¾¼ö
고침 Version1.21997³â 5¿ù 5ÀÏ
고침 Manual revision1997³â 10¿ù 29ÀÏ
고침 Last updated for JLex 1.2.52000³â 9¿ù 6ÀÏ

차례
1. ¼Ò°³
2. JLex specifications
2.1. User Code
2.2. JLex Áö½Ã¹®
2.2.1. Lexical analyzer Ŭ·¡½ºÀÇ ³»ºÎ ÄÚµå
2.2.2. Lexical analyzer Ŭ·¡½ºÀÇ ÃʱâÈ­ ÄÚµå
2.2.3. Lexical analyzer Ŭ·¡½ºÀÇ End-of-File ÄÚµå
2.2.4. ¸ÅÅ©·Î Á¤ÀÇ
2.2.5. State ¼±¾ð
2.2.6. ¹®ÀÚ¼ö ¼¼±â ±â´É
2.2.7. ÁÙ¹øÈ£ ¼¼±â ±â´É
2.2.8. Java CUP°úÀÇ È£È¯¼º
2.2.9. Lexical Analyzer ±¸¼º¿ä¼Ò À̸§ º¯°æ¹ý
2.2.10. Default ÅäÅ« Çü
2.2.11. Default ÅäÅ«Çü II: Wrapped Integer
2.2.12. End-of-FileÀÇ YYEOF
2.2.13. °³Ç๮ÀÚÀÇ ¿î¿µÃ¼Á¦°£ ȣȯ¼º
2.2.14. Character Sets
2.2.15. ÆÄÀÏ ÀÔÃâ·Â½ÃÀÇ ¹®ÀÚ Çü½Ä
2.2.16. Lexical actionµé¿¡¼­ ¹ß»ýµÇ´Â exceptionµé"
2.2.17. End-of-File¿¡¼­ÀÇ ¸®ÅÏ°ª
2.2.18. ImplementÇÒ InterfaceÀÇ ¸í½Ã¹ý
2.2.19. Lexical analyzer Ŭ·¡½º¸¦ publicÀ¸·Î ÇÏ´Â ¹æ¹ý
2.3. Á¤±Ô½Ä ±ÔÄ¢µé
2.3.1. Lexical States
2.3.2. Á¤±Ô½Ä
2.3.3. ¿¬°üµÈ Actionµé
2.3.3.1. Action°ú Àç±ÍÈ£Ãâ
2.3.3.2. State Àüȯ
2.3.3.3. »ç¿ë °¡´ÉÇÑ Lexical º¯¼öµé
3. »ý¼ºµÇ´Â Lexical Anaylzer
4. ¼º´É
5. ÇöÀçÀÇ ±¸Çö»óÀÇ ÃÊÁ¡µé
5.1. ±¸ÇöµÇÁö ¾ÊÀº ±â´Éµé
5.2. À¯´ÏÄÚµå¿Í ¾Æ½ºÅ° ÄÚµå
5.3. State ¸ñ·Ï¿¡¼­ÀÇ ½°Ç¥
5.4. ±¸ÇöµÇÁö ¾Ê´Â ±â´É Áß ¾ÕÀ¸·Î °³¼±ÇÒ °èȹ ÁßÀÎ °Íµé
6. Credits and Copyrights
6.1. Credits
6.2. Copyright

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 specifications

JLex specificationÀº %%·Î ±¸ºÐµÈ ¼¼ sectionÀ¸·Î ±¸¼ºµÈ´Ù. Çü½ÄÀº ´ÙÀ½°ú °°´Ù

»ç¿ëÀÚ ÄÚµå
%%
JLex Áö½Ã¹®
%%
Á¤±Ô½Ä rules
%%´Â °¢ 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 Ŭ·¡½º¿¡ º¹»çµÉ ÀÚ¹Ù Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

%{
<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. State ¼±¾ð

Lexical stateµéÀº ÁÖ¾îÁø ÀԷ¿¡ ¾î¶² Á¤±Ô½ÄÀ» Àû¿ëÇØ¾ß ÇÒÁö¸¦ ÆÇ´ÜÇÒ ¶§ »ç¿ëµÈ´Ù. ´ÙÀ½°ú °°Àº ÇüÅ·ΠJLex Áö½Ã¹®¾È¿¡ ¼±¾ðµÈ´Ù.

%state state[0][,state[1],state[2],...]
°¢ lexical state ¼±¾ð¹®Àº ÇÑ ÁÙ ¾È¿¡ Æ÷ÇԵǾî¾ß ÇÑ´Ù. ¿©·¯ ¼±¾ð¹®µéÀÌ °°Àº JLex specification¿¡ Æ÷Ç﵃ ¼ö Àֱ⠶§¹®¿¡, ¿©·¯ state ¼±¾ð¹®µéÀÌ ¿©·¯ ÁÙ·Î ÂÉ°³¾îÁ® ÀÛ¼ºµÉ ¼ö ÀÖ´Ù.

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 Áö½Ã¹®¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½Ãų ¼ö ÀÖ´Ù.

%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 ±â¹Ý ¿î¿µÃ¼Á¦¿¡¼­´Â "\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 state list, Á¤±Ô½Ä, actionÀÇ ¼¼ ºÎºÐÀ¸·Î ³ª´©¾îÁö¸ç, ´ÙÀ½°ú °°Àº Çü½ÄÀ» °®´Â´Ù.

[<states>]<Á¤±Ô½Ä>{<action>}
°¢ ºÎºÐ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº ÀÌÈÄ¿¡ ÇÏ°Ú´Ù.

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

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

°á±¹, ¸ðµç ÀԷµéÀº Àû¾îµµ ÇϳªÀÇ ±ÔÄ¢¿¡ Àû¿ëµÉ ¼ö ÀÖ¾î¾ß Çϸç, ÀÌ°ÍÀº ´ÙÀ½°ú °°Àº ±ÔÄ¢À» Á¦ÀÏ ¸¶Áö¸·¿¡ Ãß°¡ÇÏ´Â ¹æ¹ýÀ¸·Î º¸ÀåÇÒ ¼ö ÀÖ´Ù.

. { java.lang.System.out.println("Unmatched input:" + yytext()); }
Á¡(.)Àº °³Çà ¹®ÀÚ¸¦ Á¦¿ÜÇÑ ¸ðµç ÀÔ·ÂÀ» ÀǹÌÇÑ´Ù.


2.3.1. Lexical States

Optional lexical state ¸®½ºÆ®´Â ±ÔÄ¢ÀÇ ¾Õ ºÎºÐ¿¡ À§Ä¡Çϸç, ´ÙÀ½°ú °°Àº Çü½ÄÀ» µû¸¥´Ù.

<state[0][,state[1],stateg[2],...]>
stateÀÇ Áߺ¹ ¼±¾ðÀº ¼±ÅûçÇ×À̸ç, ²©¼â ¦(<>)¾È¿¡ À§Ä¡ÇØ¾ß ÇÑ´Ù. state list´Â ¾î¶² Ãʱâ 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µéÀÌ´Ù.

? * + | ( ) ^ $ . [ ] { } " \

´Ù¸¥ ¹®ÀÚµéÀº ÀÚ±â ÀÚ½ÅÀ» ³ªÅ¸³½´Ù.

  • 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·Î »ý¼ºµÈ state-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 stateµéÀÌ ¼±¾ðµÈ °æ¿ì, Á¤±Ô½Ä action¿¡ state ÀüȯÀ» ´ÙÀ½°ú °°Àº ÇüÅ·ΠÁö½ÃÇÒ ¼ö ÀÖ´Ù.

yybegin(state);
voidÇü yybegin()ÇÔ¼ö´Â state À̸§ÀÎ state¸¦ ³Ñ°Ü¹Þ¾Æ¼­ ÇØ´ç state·Î ÀüȯÀ» ÇÑ´Ù.

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


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 Çà¹øÈ£


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ÀÌ¸ç ´ÙÀ½°ú °°ÀÌ ÇÔ¼ö ÇüÅ°¡ Á¤ÀǵǾî ÀÖ´Ù.

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¿¡ º¸´Ù ÀÚ¼¼ÇÑ ¼³¸íÀÌ ÀÖ´Ù.


4. ¼º´É

JLex¿¡ ÀÇÇØ »ý¼ºµÈ lexical analyzer¿Í ¼öµ¿À¸·Î ÀÛ¼ºµÈ lexical analyzerÀÇ ¼º´ÉÀ» ºñ±³ÇÑ º¥Ä¡¸¶Å· °á°ú°¡ ÀÖ´Ù. ½ÇÇè ½Ã »ç¿ëµÈ ¿¹Á¦ ÀÔ·ÂÀº °£´ÜÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾î¿´À¸¸ç, ¼öµ¿À¸·Î ÀÛ¼ºµÈ lexical analyzerµµ ÀÚ¹Ù·Î ÀÛ¼ºÀÌ µÇ¾ú´Ù.

µÎ°³ÀÇ °£´ÜÇÑ ÇÁ·Î±×·¡¹Ö ¾ð¾î ¼Ò½º ÆÄÀÏ¿¡ ´ëÇØ °¢°¢ÀÇ lexical analyzer¸¦ µ¿ÀÛ½ÃÅ°°í, 󸮽ð£À» ÃøÁ¤ÇÏ¿´´Ù. °¢°¢ÀÇ lexical analyzer´Â ÀÚ¹Ù·Î ÀÛ¼ºµÈ driver¿¡ ÀÇÇØ ¼öÇàµÇ¾ú´Ù.

JLex·Î »ý¼ºµÈ lexical analyzer°¡ ´õ ºü¸£´Ù´Â °ÍÀÌ ´ÙÀ½ ½ÇÇè °á°ú¿Í °°ÀÌ ÆǸíµÇ¾ú´Ù.

표 2.

Size of Source FileJLex-Generated Lexical AnaylzerHand-Written Lexical Analyzer
177 lines0.42 seconds0.52 seconds
897 lines0.98 seconds1.28 seconds

JLex lexical analyzer°¡ ¼öµ¿À¸·Î ÀÛ¼ºµÈ lexerº¸´Ù ÃæºÐÈ÷ ºü¸¥ ¼Óµµ¸¦ °¡Áö°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù.

JLex¿Í °°Àº ÇÁ·Î±×·¥¿¡ ÀÇÇØ ¸¸µé¾îÁø table-driven lexical analyzerµéÀÇ °¡Àå Å« ¹®Á¦Á¡ Áß Çϳª´Â ¼öµ¿À¸·Î ÀÛ¼ºµÈ °Í¿¡ ºñÇØ ¼Óµµ°¡ ´À¸®´Ù´Â Á¡À̾ú´Ù. ±×·¯¹Ç·Î, ÀÌ°ÍÀº JLex lexical analyzerÀÇ »ó´ëÀûÀÎ ¼Óµµ¸¦ ÀÔÁõÇÏ´Â Áß¿äÇÑ ½ÇÇè °á°ú·Î º¼ ¼ö ÀÖ´Ù.


5. ÇöÀçÀÇ ±¸Çö»óÀÇ ÃÊÁ¡µé

5.1. ±¸ÇöµÇÁö ¾ÊÀº ±â´Éµé

´ÙÀ½µéÀº JLex¿¡¼­ ±¸ÇöµÇÁö ¾ÊÀº ±â´ÉÀÇ ¸ñ·ÏÀÌ´Ù. (¿ÏÀüÇÑ ¸ñ·ÏÀÌ ¾Æ´Ò ¼öµµ ÀÖ´Ù.)

  • Á¤±Ô½ÄÀÇ lookahead ¿¬»êÀÚ°¡ ±¸ÇöµÇÁö ¾Ê¾ÒÀ¸¸ç, Ưº°ÇÑ ¸î¸î Á¤±Ô½ÄÀÇ metacharacterµéÀ» Æ÷ÇÔÇÏÁö ¸øÇÏ¿´´Ù.

  • ÇàÀÇ ½ÃÀÛÀ» ³ªÅ¸³»´Â ¿¬»êÀÚ(^)ÀÇ µ¿ÀÛÀÌ ºñÁ¤»óÀûÀÎ °ÍÀ¸·Î ¿©°ÜÁø´Ù. ÀÌ ¿¬»êÀÚ°¡ »ç¿ëµÈ Á¤±Ô½ÄÀÌ Àû¿ëµÇ¾úÀ» ¶§ ¾ÕÀÇ °³Ç๮ÀÚ°¡ ¹ö·ÁÁö´Â ÀÏÀÌ ¹ß»ýÇÑ´Ù.


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³ª ¼º´É¿¡ ¹ÌÄ¡´Â ¾ÇÈ¿°ú µîÀ» °í·ÁÇÏ¿© ¾ÆÁ÷ ±¸ÇöµÇÁö ¾ÊÀº ±â´ÉµéÀÌ´Ù.

  • lexical action¿¡¼­ÀÇ ¿­°í ´Ý´Â Ƚ¼ö°¡ ¸ÂÁö ¾Ê´Â ÁÖ¼® Ç¥½ÃÀÚÀÇ °ËÃâ

  • ¸ÅÅ©·Î Á¤Àǹ®¿¡¼­ÀÇ ¼øȯ


6. Credits and Copyrights

6.1. Credits

The 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. Copyright

JLex 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.


ID
Password
Join
A man who fishes for marlin in ponds will put his money in Etruscan bonds.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2003-09-22 17:54:06
Processing time 0.0052 sec