#define INDATAΒ Β 3 /* Π² ΡΠ΅Π»Π΅ Π·Π°ΠΏΠΈΡΠΈ (Π²ΡΠ΅) */#define INTERMΒ Β 4 /* ΡΠ΅ΡΠΌΠΈΠ½Π°ΡΠΎΡ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ (RS = RS = regexp) */int state;...state = NOSTATE;...state = INLEADER;...if (state != INTERM) ...ΠΠ° ΡΡΠΎΠ²Π½Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ. ΠΠΎ ΠΎΠΏΡΡΡ-ΡΠ°ΠΊΠΈ, Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΊΠΎΠ΄ ΠΈΠ· GDB:
(gdb) <b>print state</b>$1 = 2ΠΠ΄Π΅ΡΡ Π²Ρ ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΈ ΡΠΌΠΎΡΡΠ΅ΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΡΡΠΎΠ±Ρ Π²ΡΡΡΠ½ΠΈΡΡ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ 2. ΠΠ°ΠΊΠΎΠ²Π° ΠΆΠ΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°?
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ: ΠΠ»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π²ΠΌΠ΅ΡΡΠΎ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ² ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ (enum). ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΠ°ΠΊΠΎΠ΅ ΠΆΠ΅, Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ enum ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ.
ΠΡΠΈΠΌΠ΅Ρ, ΡΠΎΠΆΠ΅ ΠΈΠ·
io.cgawktypedef enum scanstate {Β NOSTATE, Β /* ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΅ΡΠ΅ Π½Π΅ Π½Π°ΡΠ°ΡΠΎ (Π²ΡΠ΅) */Β INLEADER, /* ΠΏΡΠΎΠΏΡΡΠΊ Π½Π°ΡΠ°Π»ΡΠ½ΡΡ
Π΄Π°Π½Π½ΡΡ
(RS = "") */Β INDATA,Β Β /* Π² ΡΠ΅Π»Π΅ Π·Π°ΠΏΠΈΡΠΈ (Π²ΡΠ΅) */Β INTERM,Β Β /* ΡΠ΅ΡΠΌΠΈΠ½Π°ΡΠΎΡ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ (RS = "", RS = regexp) */} SCANSTATE;SCANSTATE state;/* ... ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠ΄ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ! ... */Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ state ΠΈΠ· GDB ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅:
(gdb) <b>print state</b>$1 = NOSTATE15.4.1.3. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²Π»ΡΠΉΡΠ΅ ΠΊΠΎΠ΄
ΠΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π²
ifwhile&&||stepnextΠ Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ: ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠΈΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄, ΡΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, ΡΠ°ΠΊ ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΈΡ Π² ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ΅. ΠΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΎΡ ΡΠ°Π½Π΅Π½ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π²Ρ (ΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ ΠΏΠΎΡΠ»Π΅ Π²Π°Ρ) ΠΌΠΎΠ³Π»ΠΈ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ.
ΠΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ: ΡΡΠ½ΠΊΡΠΈΡ
do_input()io.c gawk1Β /* do_input --- Π³Π»Π°Π²Π½ΡΠΉ ΡΠΈΠΊΠ» ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²Π²ΠΎΠ΄Π° */23Β void4Β do_input()5Β {6Β Β IOBUF *iop;7Β Β extern int exiting;8Β Β int rval1, rval2, rval3;910Β (void)setjmp(filebuf); /* for 'nextfile' */1112Β while ((iop = nextfile(FALSE)) != NULL) {13Β Β /*14Β Β Β * ΠΠ΄Π΅ΡΡ Π±ΡΠ»ΠΎ:15Β Β Β if (inrec(iop) == 0)16Β Β Β Β while (interpret(expression_value) && inrec(iop) == 0)17Β Β Β Β Β continue;18Β Β Β * Π’Π΅ΠΏΠ΅ΡΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΠΎ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΎΡΠ»Π°Π΄ΠΊΠΈ.19Β Β Β */20Β Β rvall = inrec(iop);21Β Β if (rvall == 0) {22Β Β Β for (;;) {23Β Β Β Β rval2 = rval3 = -1; /* Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ */24Β Β Β Β rval2 = interpret(expression_value);25Β Β Β Β if (rval2 != 0)26Β Β Β Β Β rval3 = inrec(iop);27Β Β Β Β if (rval2 == 0 || rval3 != 0)28Β Β Β Β Β break;29Β Β Β }30Β Β }31Β Β if (exiting)32Β Β Β break;33Β }34 }(ΠΠΎΠΌΠ΅ΡΠ° ΡΡΡΠΎΠΊ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΡΠ°Π»Π° ΡΡΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, Π° Π½Π΅ ΡΠ°ΠΉΠ»Π°.) ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ
gawkΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅
inrec()interpret()Π‘ΡΡΠΎΠΊΠΈ 20β30 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, ΡΠΎΡ ΡΠ°Π½ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ , ΡΡΠΎΠ±Ρ ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π½Π°ΠΏΠ΅ΡΠ°ΡΠ°ΡΡ ΠΈΠ· ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Π² ΡΡΡΠΎΠΊΠ΅ 23 ΡΡΠΈΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°ΡΡΡΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅, ΠΎΡΠΈΠ±ΠΎΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ: Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠ²ΠΎΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΈΠΊΠ»Π°. Π‘ΡΡΠΎΠΊΠ° 27 ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΡΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠΎΠ΄ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ, ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠ²ΡΠΈΡΡ Π² Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ» (ΡΡΠ°Π²Π½ΠΈΡΠ΅ ΡΡΡΠΎΠΊΡ 22 ΡΠΎ ΡΡΡΠΎΠΊΠΎΠΉ 16), ΡΠ΅ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠΈΠΊΠ»Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌΡ.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΡ, ΠΌΡ ΠΏΡΠΈΠ·Π½Π°Π΅ΠΌΡΡ, ΡΡΠΎ Π½Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ·ΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄Π΅Π»ΠΊΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΅Π΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΎΠ½Π° ΡΠΎΡΠ½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌΡ ΠΊΠΎΠ΄Ρ; ΠΎΠ½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π»Π°. Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²ΠΎΡ ΡΡΠ° Π²Π΅ΡΡΠΈΡ ΡΠΈΠΊΠ»Π° Π±ΡΠ»Π° Π±Ρ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Ρ:
/* ΠΠΎΠ·ΠΌΠΎΠΆΠ½Π°Ρ Π·Π°ΠΌΠ΅Π½Π° Π΄Π»Ρ ΡΡΡΠΎΠΊ 22 - 29 */do {Β rval2 = rval3 = -1; /* Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ */Β rval2 = interpret(expression_value);Β if (rval2 != 0)Β rval3 = inrec(iop);} while (rval2 != 0 && rval3 == 0);