á©áá¯ááºá 2 ááẠáá±á¬ááŒá¬áá±á·ááœááºá C ááŸáá·áº C++ áá¬áá¬á áá¬ážáá»á¬ážá¡ááœáẠá¡ááá²á· lexical ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááá¯ááºáᬠáá¯ááºáá±ážááá·áº re2c ááᯠááŒáá·áºáá»ááá²á·áááºá ááááá±ážáá»ááºá¡áá±ááŒáá·áºá re2c ááᯠ1993 áá¯ááŸá áºááœáẠPeter Bambiulis ááŸáá¯ááºáá¯ááºáá¬ážáá±á¬áá¯ááºáá¡ááŒááºááŸá¯ááºážááŸáá·áºá¡ááŒá¬ážáá»ááºááá±áá¬áá»á¬ážááŸáá·áºááœá²ááŒá¬ážáá±á¬á¡ááœááºáá»ááºááŒááºáá±á¬ lexical ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááá¯ááºáá¬á ááºážáááºáá¯ááºáá¯ááºáá°á¡ááŒá ẠPeter Bambiulis ááŸáá±ážáá¬ážáá²á·ááẠááŸáááŒá®ážáá¬ážáá¯ááºá¡ááŒá±áá¶á ááá¯á¡áá»áááºááŸá á ááá±á¬áá»ááºááᯠáááºááœá¬áá°áá¯á០áá®ááœááºáá²á·ááŒá®áž ááá¬ážáááºááá¹áá«ááŸáá·áº á¡ááá·áºá¡áááºááŸááá±á¬ á ááºáá»á¬ážáááºáááºááœáẠá ááºážáááºááŸá¯áá»á¬ážááŸáá·áº áá¯áá±áááá»á¬ážá¡ááœáẠááááºáá±á¬ááºážáá áºáá¯á¡ááŒá ẠáááºáááºáááºááŸááá±áá«áááºá
áá¬ážááŸááºáž 1.2 ááœáẠá¡ááá áá®ááœááºáááºážáá áºááŸá¯áá»á¬áž-
-
ááá·áºááœááºážáá±áá¬áá¡áá¯á¶ážááᯠá á áºáá±ážááẠ(ááá¯ážááŸááºážáá±á¬) áááºážáááºážá¡áá áºááᯠáá±á«ááºážááá·áºáá²á·áááºá
(á¡ááºá¹ááááẠâEOF ruleâ)á
áááºážá¡ááœááºá re2c:eof configuration ááᯠáá±á«ááºážááá·áºáá¬ážáááºá
terminal character ááᯠááœá±ážáá»ááºááá¯ááºá á±ááŒááºážá
ááŸáá·áº lexer ááŒá áºáá»áŸáẠáá®ážááœááºááá·áº á¡áá°áž $ á ááºážáá»ááºáž
ááá·áºááœááºážáá±áá¬áá¡áá¯á¶ážááá¯á· á¡á±á¬ááºááŒááºá áœá¬áá±á¬ááºááŸááá²á·áááºá
áááá¯ááºážááŒá±á¬ááºážá¡áá re2c á¡ááœáẠá¡áááºááŒá¯ááŒááºážáááºážáááºážáá»á¬ážá áœá¬ááᯠááœá±ážáá»ááºáá±ážáá«áááºá
ááá·áºáááºáá»ááºáá»á¬ážá áááá±á¬ááºááŸá¯ááŸáá·áº ááá¯ážááŸááºážááŸá¯ááá¯á·ááœáẠááœááºážá¡á¬ážá á¯áá»á¬ážáá¡áá¯á¶áž
áá»áŸá±á¬ááºááœáŸá¬áá»á¬ážá áááºážáááºážá¡áá áºááẠáá¯ááºáá±ážáá±á ááºááœáẠááá¯ážááŸááºážá á±ááẠáá®ááá¯ááºážáá¯ááºáá¬ážáááºá
áá»ááºááŸááá±áá»áááºááŸá¬áá±á¬á· áááá±á¬ááºááŒá®áž áá»ááºáá»ááºááŒáá·áºááŒáá·áº á¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá áááºážáááºážáá±á¬ááºážáá»á¬áž
á¡áá¯ááºáá¯ááºáá²ááŒá áºááŒá®áž á¡áá»áá¯á·ááá á¹á áá»á¬ážááœáẠáŠážá á¬ážáá±ážááŒá áºááá¯ááºáááºá -
ááœáŸááºááŒá¬ážáá»ááºááᯠá¡áá¯á¶ážááŒá¯á ááŒááºáááá¯ááºáá»á¬ážááᯠááá·áºááœááºážááá¯ááºááá·áº á áœááºážáááºááᯠááá·áºááœááºážáá¬ážáááºá
/*!include:re2c "file.re" */ áá±áá¬ááœáẠfile.re
áá«ááá«áááºááá¯ááºáá²á·á¡áááºááŒá áºáá«áááºá Re2c ááẠfile directory á¡áá«á¡ááẠááá¯ááºáá»á¬ážááᯠááŸá¬ááœá±áááºá
ááá¯á·á¡ááŒáẠ-I ááœá±ážáá»ááºááŸá¯ááᯠá¡áá¯á¶ážááŒá¯á áááºááŸááºáá¬ážááá·áº áááºážááŒá±á¬ááºážáá»á¬ážá á¬áááºážááœáẠáááºáž áá«áááºáááºá
áá«áááºáá±á¬ááá¯ááºáá»á¬ážááẠá¡ááŒá¬ážááá¯ááºáá»á¬áž áá«áááºááá¯ááºáááºá
Re2c ááẠáá«áááºáá±á¬/áááºážááœáŸááºááœáẠ"á á¶" ááá¯ááºáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºá
ááá±á¬áá»áẠ- á¡áá¯á¶ážáááºáá±á¬ á¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºáá»á¬áž ááá¯áá±áá¬ááœáẠá á¯ááŒá¯á¶áá¬áááá·áºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá
áá¯á¶ááŸááºá¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážá á á¶á á¬ááŒáá·áºááá¯ááºáá²á·ááá¯á· á¡áá¬áá áºáá¯á
ááá¯á¡áá»áááºá¡áá á¡áá¯ááºááá¬ážáá»á¬ážá áá±á¬ááºážááá¯áá»ááºá¡á áá°áá®áá¯áẠá¡áá»áá¯ážá¡á á¬ážáá»á¬ážá á¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºáá«áá±á¬ ááá¯ááºáá áºááá¯ááºááᯠááá·áºááœááºážáá¬ážáá«áááºá -
áá±á«ááºážá á®ážááá¯ááºáá»á¬ážááᯠá¡áá»á¬ážáá°ááŸá¬ áá¯ááºáá±ážááá¯ááºá áœááºážááᯠááá·áºááœááºážáá¬ážáááºá
-t --type-header options (ááá¯á·ááá¯áẠááá·áºáá»á±á¬áºáá±á¬) ááᯠá¡áá¯á¶ážááŒá¯á á¡ááŒá±á¬ááºážá¡áá¬
ááŒááºáááºááŸá¯áá»á¬áž) ááŸáá·áº áááºážááœáŸááºáá»ááºá¡áá áºáá»á¬áž /*!header:re2c:on*/ ááŸáá·áº
/*!header:re2c:off*/á áááºážááẠáááºááá·áºááá á¹á áá»á¬ážááœáẠá¡áá¯á¶ážáááºááá¯ááºáááºáááºážá
re2c ááẠvariablesá structures ááŸáá·áº macro ááá¯á·á á¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºáá»á¬ážááᯠáááºáá®ážáááºááá¯á¡ááºáá±á¬á¡áá«á
á¡ááŒá¬ážáá¬áá¬ááŒááºáá°áá áºáá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯áááºá -
ááᯠRe2c ááẠáá¯á¶ááŸááºá¡áá¯á¶ážá¡ááŸá¯ááºážáá»á¬ážááœáẠUTF8 á á¬áá¯á¶ážáá»á¬ážááŸáá·áº áá¬ááºáá±á¬ááºá¡áááºážáá»á¬ážááᯠáá¬ážáááºáááºá
áá°áááºážá¡á¬ážááŒáá·áºá re2c ááẠ"âx ây" áá²á·ááá¯á· á áá¬ážáááºáá»á¬ážááᯠááœá²ááŒááºážá áááºááŒá¬áááºá
1-bit ASCII á¡áá¹ááá¬áá»á¬ážá á á®á á¥áº e2 88 80 78 20 e2 88 83 79
( hex áá¯ááºáá»á¬áž ) ááŸáá·áº á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááẠáá°áá®áá¯áẠá¡áá¹ááá¬áá»á¬ážááᯠááá¯ááºááá¯áẠááœááºááŒá±á¬ááºááẠááá¯á¡ááºááẠá
"u2200x u2203y"á áá«á áá±á¬áºáá±á¬áºááᯠá¡áááºáááŒá±áááᯠáá°áá±á¬áºáá±á¬áºáá»á¬ážáá»á¬ážá¡ááœáẠááá»áŸá±á¬áºááá·áºáá¬ážáá«áá°ážá
á¡áá¯á¶ážááŒá¯áá°áá»á¬áž (á¡áááºáááŒáẠbug á¡á á®áááºáá¶áá»ááºáá»á¬ážá០áááºáá±ááŒáá¬ážááá·áºá¡ááá¯ááºáž)á áá«ááᯠá¡áá¯
re2c ááẠ--input-encoding option ááá¯áá±ážáááºá á
áááºážááẠááá·áºá¡á¬áž á¡ááŒá¯á¡áá°ááᯠááŒá±á¬ááºážáá²á á±ááŒá®áž "âx ây" á¡ááŒá Ạááœá²ááŒááºážá áááºááŒá¬ááá¯ááºá á±áá«áááºá
2200 78 20 2203 79 á -
ááᯠRe2c ááẠ-r --reuse áá¯ááºááœáẠáá¯á¶ááŸáẠre2c ááááºááá¯á·ááŒááºážááᯠá¡áá¯á¶ážááŒá¯ááœáá·áº ááŒá¯áááºá
ááá·áºááœááºážááá·áºááá¯ááºááœáẠááá±á¬ááºáá»á¬ážá áœá¬áá«áááºááŒá®áž áááºážááá¯á·áá²ááŸá¡áá»áá¯á·áᬠááŸááá«á áááºážááẠá¡áááºááŒá±áááºá
ááŒááºáááºá¡áá¯á¶ážááŒá¯áááºááá¯á¡ááºáááºá -
ááᯠáááºááẠááááá±ážáá»ááºáá»á¬ážááŸáá·áº á¡ááŸá¬ážáááºáá±á·áá»áºáá»á¬ážá áá±á¬áºáááºááᯠáááºááŸááºááá¯ááºáá«ááŒá®á
--location-format option á¡áá áºááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá . GNU áá±á¬áºáááºááᯠááŒááá¬ážáááºá
ááá¯ááºá¡áááº-ááá¯ááºáž:áá±á¬áºáá¶-á¡ááŒá áºá ááá¯ááºá¡áááº(ááá¯ááºážá áá±á¬áºáá¶) á¡ááŒá ẠMSVC áá±á¬áºáááºá
á€á¡ááºá¹áá«áááºááẠIDE ááŸá áºáááºáá°áá»á¬ážá¡ááœáẠá¡áá¯á¶ážáááºááá¯ááºáá«áááºá
á¡á±á¬ááºááŒááºáá«á á¡á±á¬ááºááœá²áá¶á á¬ááá¯ááᯠááá¯ááºááŸáááºáá±ážááá·áº --verbose ááœá±ážáá»ááºááœáá·áºááá¯áááºáž ááá·áºááœááºážáá¬ážáááºá -
flex ááŸáá·áº "ááá¯ááºáááºáá®ááŸá¯" áá¯ááºááᯠááŒáŸáá·áºáááºááŒá®ážááŒá áºáááº- á¡áá»áá¯á·áá±á¬ ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡ááŸá¬ážáá»á¬ážááᯠááŒááºáááºááŒá®áž
ááŸá¬ážááŸá¬ážáá«ážáá«áž ááá á¹á áá»á¬ážááœáẠááŸá¬ážááœááºážáá±á¬ á¡á±á¬áºááá±áᬠáŠážá á¬ážáá±ážá
áááá¯ááºážá¡áá -F --flex-support option ááẠááá·áºá¡á¬áž áá¯ááºáá±ážááẠááœáá·áºááŒá¯áá¬ážáááºá
ááœá²ááŒááºážá áááºááŒá¬ááẠá¡áááºážáááºáááºáá²á á±áááºá
Flex compatibility mode ááᯠáá¯ááºá¡áá áºááœáẠá¡áá¯á¶ážááŒá¯áá²áááºá
ááá¯á·áá±á¬áº re2c ááẠáá±á¬ááºááŒááºááá¯ááºáááºááŸá¯ááŸáá á±ááẠáááºáááºáá¶á·ááá¯ážáá±ážáá«áááºá -
á¡áá¹ááᬠá¡áááºážá¡á á¬áž á¡áá¯ááºá¡á±á¬áºááá±áᬠ/ ááᯠá¡áá»á¯á¶ážáááºáá«áááºá
áá¯ááºáá¶áá«ááºááᯠáá»á²á·ááœááºááŒááºážáááŒá¯áá®á áááºážááᯠá¡áá±á¡ááœáẠááá¯áá»á¬ážáá±á¬ ááá á¹á áá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯ááẠááœáá·áºááŒá¯áá±ážáá±á¬á
ááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ á¡áá¹ááá¬á¡ááŸááºááᯠáá¯ááºáá¶áá«ááºááᯠá¡áá¯á¶ážááŒá¯áá«á (á¥ááᬠUTF8)á -
á¡ááœááºááá¯ááºááᯠááᯠá¡ááºáááºáááºážááŒáá·áº áááºáá®ážáá¬ážáááº- re2c ááẠáá¬áá®ááá¯ááºááᯠáŠážá áœá¬ áááºáá®ážáááºá
ááááºááᯠáááºážááœááºáá±ážááŒá®áž áá¬áá®ááá¯ááºááᯠoutput ááá¯á· á¡áááºááŒá±á¬ááºážáá«á
á á áºáááºáá±ážáá áºáá¯á -
á á¬ááœááºá á¬áááºážá¡á¬áž ááŒá®ážááŒá±á¬ááºááŒá®áž ááŒááºáááºáá±ážáá¬ážááŒááºážá á¡áá°ážáááŒáá·áº á¡áá áºááœá± áááºááá·áºáááºá
á¡áááºážáá»á¬áž ááŒá¬ážáá¶ááŒáá·áºááŒááºážá¡ááŒá±á¬ááºáž
О input data áá¡áá¯á¶ážááá¯á á áºáá±ážáááºáááºážáááºážáá»á¬ážá¡ááŒá±á¬ááºáž.
á á¬ááœááºá á¬áááºážá¡áá áºááᯠáá¯á¶á á¶ááŒáá·áº á á¯áá±á¬ááºážáá¬ážáááºá
ááŒáá·áºá á¯á¶áá±á¬ á á¬áá»ááºááŸá¬áá áºáá»ááºááŸá¬áá« áááºá áœá²á á¬á¡á¯ááº
á¥ááá¬áá»á¬ážááŒáá·áº (áá°áá®áá±á¬áááºážááŒá áºáá»á¬ážááᯠmanpage ááŸáá·áº á¡áœááºááá¯ááºážá á¬ááœááºá á¬áááºážáá»á¬ážááœáẠááŒááºááá¯áá¬ážáááº)á
áá¯ááºážáá»á¬ážááœáẠáááºááá¯ááºá áááºááŸá¯ááá¯ááºááŸá¯ááᯠááŒáŸáá·áºáááºááẠáá¶á·áá»ááºážáá±á¬ ááŒáá¯ážáááºážááŸá¯áá»á¬áž ááŒá¯áá¯ááºáá¬ážáááºá -
developer áá»á¬ážáá¡ááŒááºá¡á re2c ááẠááá¯ááá¯ááŒá®ážááŒáá·áºá á¯á¶áá±á¬ á áá áºááœá²áá áºáá¯ááᯠáááŸááá²á·áááºá
á¡ááŸá¬ážááŸá¬ááŒááºážá ááá¯ááœááºááŸááá¬ážáá±á¬ áááºáá±á¬ááºááŸá¯áá»á¬ážááœáẠá¡ááŸá¬ážááŸá¬ááŒááºááŒááºážáá¯ááºááᯠááááºáá¬ážáááºá
configure option --enable-debug ááᯠá¡áá¯á¶ážááŒá¯á ááœáá·áºááá¯ááºáááºá
á€áá¯ááºáá±ááŸá¯ááẠáá
áºááŸá
áºáááºáá¯á¶ážáá®ážáá«ážááŒá¬ááŒáá·áºáááºá
á¡áá»áááºá¡áá»á¬ážá
á¯ááᯠáá®á¡áá¯áá®áá±á¬ááºááŸáá·áº á
á¬áá±ážááŒááºážá¡ááœáẠá¡áá»áááºá¡áá»á¬ážá
á¯ááᯠáá¯á¶ážá
áœá²áá²á·áááºá
áá±á¬ááºážáá«ážáá»á¬áž "NFA ááŸá áááá±á¬ááºáá±á¬ POSIX Submatch Extraction".
áá±á¬ááºážáá«ážááœááºáá±á¬áºááŒáá¬ážááá·áº á¡ááºáááá¯áá®áááºáá»á¬ážááᯠá
ááºážáááºá
á¬ááŒáá·áºááá¯áẠlibre2c ááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºáá¬ážáááºá
(á
á¬ááŒáá·áºááá¯ááºáááºáá±á¬ááºááŒááºážááŸáá·áº á
á¶áááºááŸááºáá»ááºáá»á¬ážááᯠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº ááááºáá¬ážááŒá®áž configure option ááŒáá·áº ááœáá·áºáá¬ážáááºá
--enable-libs)á á
á¬ááŒáá·áºááá¯ááºááẠááŸáááŒá®ážáá¬ážááŸáá·áº ááŒáá¯ááºáááºá¡ááŒá
Ạááá°ááá«á
RE2 áá²á·ááá¯á· ááá±á¬áá»ááºáá»á¬ážáá¬áá á¡áá
áºááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠáá¯áá±ááááááºáá±á¬ááºážáá
áºáá¯á¡áá±ááŒáá·áº ááŒá
áºáááºá
algorithms (ááá¯á·áá±á¬áẠre2c ááá¯á·ááá¯áẠá¡ááŒá¬ážááá±á¬áá»ááºáá»á¬ážááœáẠáá¯á¶ážááá¯ááºáááº)á
á
ááºážáááºááŒááºážá á
á¶áááºááŸááºáá»ááºáá»á¬ážááŸáá·áº á¡ááŒá¬ážáá¬áá¬á
áá¬ážáá»á¬ážááá¯á· áá»áááºáááºááŸá¯áá»á¬ážááᯠáááºáá®ážááŒááºážá
ááá·áº ááŸá¯áá±á¬áá·áºááŸáááºáž á¡áááºááŒá±áá«áááºá
á€áá¯ááºáá±ááŸá¯ááŒá
áºááŒá±á¬ááºá¡á±á¬áẠáá°áá®áá±á¬ááºááœááºáá±ážáá°á¡á¬ážáá¯á¶ážááᯠre2c developer áá»á¬ážá០áá»á±ážáá°ážáááºááŸááá«áááºá
áá±áá¯áá»á¡á¬ážááŒáá·áº á¡ááŒá¶á¥á¬ááºáá»á¬ážá áá»áá¯á·ááœááºážáá»ááºá¡á
á®áááºáá¶á
á¬áá»á¬ážá áá¬áá±ážááŸá¯áá»á¬ážá á
áááºáá¬áẠá
áááºááá¯á·á¡ááœáẠáá°á·á¡ááœá²á·á¡á
ááºážá¡ááœáẠ;]
source: linux.org.ru