// dc.h: ΠΎΠ±ΡΠΈΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ°
enum token_value (* NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' *);
extern int no_of_errors; extern double error(char* s); extern token_value get_token(); extern token_value curr_tok; extern double number_value; extern char name_string[256];
extern double expr(); extern double term(); extern double prim();
struct name (* char* string; name* next; double value; *);
extern name* look(char* p, int ins = 0); inline name* insert(char* s) (* return look(s,1); *)
ΠΡΠ»ΠΈ ΠΎΠΏΡΡΡΠΈΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠΎΠ΄, ΡΠΎ lex.c Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
// lex.c: Π²Π²ΠΎΠ΄ ΠΈ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· #include Β«dc.hΒ»
#include Β«ctype.hΒ»
token_value curr_tok; double number_value; char name_string[256];
token_value get_token() (* /* ... */ *)
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΎΠ±ΡΠ΅ΡΠ°, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, Π±ΡΠ΄Π΅Ρ Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π² ΡΠ°ΠΉΠ», Π³Π΄Π΅ ΠΎΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΠΈΠΈ lex.c ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ:
extern token_value get_token(); // ... token_value get_token() (* /* ... */ *)
ΠΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠΎ, ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ Π»ΡΠ±ΡΡ Π½ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ Π² ΡΠΈΠΏΠ°Ρ , ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π΄Π»Ρ ΠΈΠΌΠ΅Π½ΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π±Ρ get_token() Π±ΡΠ»Π° ΠΎΠΏΠΈΡΠ°Π½Π° ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ token_value, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ int, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ lex.c Π½Π΅ ΠΏΡΠΎΡΠ»Π° Π±Ρ ΠΈΠ·Π·Π° ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π΅ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΡ ΡΠΈΠΏΠΎΠ².
Π€Π°ΠΉΠ» syn.c Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
// syn.c: ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅
#include Β«dc.hΒ»
double prim() (* /* ... */ *) double term() (* /* ... */ *) double expr() (* /* ... */ *)
Π€Π°ΠΉΠ» table.c Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
// table.c: ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠΌΠ΅Π½ ΠΈ ΠΏΡΠΎΡΠΌΠΎΡΡ
#include Β«dc.hΒ»
extern char* strcmp(const char*, const char*); extern char* strcpy(char*, const char*); extern int strlen(const char*);
const TBLSZ = 23; name* table[TBLSZ];
name* look(char* p; int ins) (* /* ... */ *)
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ table.c ΡΠ°ΠΌ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΎΡΡΠΈ ΡΡΠΈΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΉ Π½Π΅Ρ. ΠΠΎΡΡΠΈ Π²ΡΠ΅Π³Π΄Π° Π»ΡΡΡΠ΅ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π·Π°Π³ΠΎΠ»Π²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», ΡΠ΅ΠΌ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΠΈΠΌΡ Π² .c ΡΠ°ΠΉΠ»Π΅ ΠΊΠ°ΠΊ extern. ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ Β«ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎΒ», Π½ΠΎ ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅ ΠΎΠΊΠ·ΡΠ²Π°Π΅Ρ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎΠ³ΠΎ Π²Π»ΠΈΡΠ½ΠΈΡ Π½Π° Π²ΡΠ΅ΠΌΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΠΈΠΈ, ΠΈ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΡΠΎΠ³ΠΎ, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΠΊΠ°ΠΊ strlen() Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² main() (Π½ΠΈΠΆΠ΅). ΠΡΠΎ Π»ΠΈΡΠ½ΠΈΠ΅ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΡ ΠΈ Π²ΠΎΠΌΠΎΠΆΠ½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎΡΡΠ΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ ΡΡΠΈΡ Π΄Π²ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π»Π΅, ΡΡΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ, Π±ΡΠ΄Ρ Π²ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ extern ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π² dc.h, ΠΊΠ°ΠΊ ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π»ΠΎΡΡ ΡΠ΄Π΅Π»Π°ΡΡ. ΠΡΠ° Β«Π½Π΅ΡΠ΅ΠΆΠ½ΠΎΡΡΡΒ» ΡΠΎΡ ΡΠ°Π½Π΅Π½Π° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΡΠΈΠΏΠΈΡΠ½ΠΎ Π΄Π»Ρ C ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΎΡΠ΅Π½Ρ ΡΠΎΠ±Π»Π°Π·Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°, ΠΈ ΡΠ°ΡΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ, ΡΠ΅ΠΌ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ, ΠΊ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ΄Π½ΠΎ ΠΎΠ±Π½Π°ΡΠΆΠΈΡΡ, ΠΈ ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌ, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΡΠΆΠ΅Π»ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΠ°Ρ ΠΏΡΠ΅Π΄ΡΡΠ΅Π΄ΠΈΠ»ΠΈ!
Π main.c, Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
// main.c: ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ, Π³Π»Π°Π²Π½ΡΠΉ ΡΠΈΠΊΠ» ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ
#include Β«dc.hΒ»
int no_of_errors;
double error(char* s) (* /* ... */ *)
extern int strlen(const char*);
main(int argc, char* argv[]) (* /* ... */ *)
ΠΠ°ΠΆΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΠ°Π·ΠΌΠ΅Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΡΠ°Π½Π²ΠΈΡΡΡ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎΠΉ ΠΏΠΎΠΌΠ΅Ρ ΠΎΠΉ. ΠΠ°Π±ΠΎΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΠ·ΡΠΊΠ° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΠΎΠ±ΡΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΡ ΡΠΈΠΏΠΎΠ² (ΡΠΌ. ΠΠ»Π°Π²Ρ 5-8). Π ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ Π½Π΅ ΠΏΡΠΈΠ½ΡΡΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΡΡ ΡΡΡΠΎΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π² Π½Π°ΡΠ°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΎΠ±ΡΡΠ½ΠΎ Β«Π·Π°ΠΌΠΎΡΠΎΠΆΠ΅Π½ΠΎΒ» ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΠΎΡΠ΅Π½Ρ Π½Π΅ΡΠ°ΡΡΠΎ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠ»Π΅Π·Π½ΡΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°ΡΡΠ°Π²ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ΠΌ ΡΡΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°Π»ΠΎΠ². ΠΠΎ ΡΡΡΠΈ, ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠ·ΡΠΊ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΎ ΡΠ²ΠΎΠΈΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ. ΠΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΡΠ°Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° Ρ Π·Π°ΡΡΠ°Π²ΠΊΠΎΠΉ Π½Π΅ ΠΏΡΠΈΠ½ΡΡΠΎ.
4.3.2 ΠΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ
Π‘ΡΠΈΠ»Ρ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΎΠ΄Π½ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΠ³ΠΎΠ΄Π΅Π½ Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅Π²Π΅Π»ΠΈΠΊΠ° ΠΈ Π΅Π΅ ΡΠ°ΡΡΠΈ Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ. ΠΠΎΡΡΠΎΠΌΡ ΡΠΎ, ΡΡΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», Π½Π΅ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ. ΠΠΎΠΌΠΎΡΡ ΠΌΠΎΠ³ΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. ΠΡΡΠ³ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± β ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠΌΠ΅Π»Π° ΡΠ²ΠΎΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ ΡΡΠΎΠΉ ΡΠ°ΡΡΡΡ ΡΡΠ΅Π΄ΡΡΠ²Π°. Π’ΠΎΠ³Π΄Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ .c ΡΠ°ΠΉΠ» ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ .h ΡΠ°ΠΉΠ», ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ .c ΡΠ°ΠΉΠ» Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΠ²Π΅Π½Π½ΡΠΉ (ΡΠΏΠ΅ΡΠΈΡΠΈΡΠΈΡΡΡΡΠΈΠΉ ΡΠΎ, ΡΡΠΎ Π² Π½Π΅ΠΌ Π·Π°Π΄Π°Π΅ΡΡΡ) .h ΡΠ°ΠΉΠ» ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ .h ΡΠ°ΠΉΠ»Ρ (ΡΠΏΠ΅ΡΠΈΡΠΈΡΠΈΡΡΡΡΠΈΠ΅ ΡΠΎ, ΡΡΠΎ Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ).
Π Π°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ°, ΠΌΡ Π·Π°ΠΌΠ΅ΡΠ°Π΅ΠΌ, ΡΡΠΎ error() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΡΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π° ΡΠ°ΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Β«stream.hΒ». ΠΡΠΎ ΠΎΠ±ΡΡΠ½Π°Ρ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ error() ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ ΠΎΡ main():
// error.h: ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ
extern int no_errors;
extern double error(char* s);
// error.c
#include Β«stream.hΒ» #include Β«error.hΒ»
int no_of_errors;
double error(char* s) (* /* ... */ *)
ΠΡΠΈ ΡΠ°ΠΊΠΎΠΌ ΡΡΠΈΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² .h ΡΠ°ΠΉΠ» ΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΠΉ Ρ Π½ΠΈΠΌ .c ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΌΠ΄ΡΠ»Ρ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ .h ΡΠ°ΠΉΠ» Π·Π°Π΄Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π° .c ΡΠ°ΠΉΠ» Π·Π°Π΄Π°Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. Π’Π°Π±Π»ΠΈΡΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ° Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ²Π½ΡΠΌ:
// table.h: ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠΌΠ΅Π½
struct name (* char* string; name* next; double value; *);
extern name* look(char* p, int ins = 0); inline name* insert(char* s) (* return look(s,1); *)
// table.c: ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠΌΠ΅Π½
#include Β«error.hΒ» #include Β«string.hΒ» #include Β«table.hΒ»
const TBLSZ = 23; name* table[TBLSZ];
name* look(char* p; int ins) (* /* ... */ *)
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΈΠ· Β«string.hΒ». ΠΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ°Π΅Ρ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ.
// lex.h: ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΈ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°
enum token_value (* NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' *);
extern token_value curr_tok; extern double number_value; extern char name_string[256];
extern token_value get_token();
ΠΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±Π΅ΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½. ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ Π² Π½Π°Π΄Π»Π΅ΠΆΠ°ΡΠ΅ΠΌ ΡΠΈΠΏΠ΅ Π»Π΅ΠΊΡΠ΅ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ΅Π±Ρ Π² Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄Π°Π²Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ get_token() ΡΠ°ΠΊΡΡΠ΅ΡΠΊΠΈΠ΅ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π±ΡΡΠ΅ΡΡ number_value ΠΈ name_string.
// lex.c: ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π° ΠΈ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°
#include Β«stream.hΒ» #include Β«ctype.hΒ» #include Β«error.hΒ» #include Β«lex.hΒ»
token_value curr_tok; double number_value; char name_string[256];
token_value get_token() (* /* ... */ *)
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΠΏΡΠΎΠ·ΡΡΠ΅Π½: // syn.c: ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ
extern double expr(); extern double term();
extern double prim();
// syn.c: ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π΄Π»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ // Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ
#include Β«error.hΒ» #include Β«lex.hΒ» #include Β«syn.hΒ»
double prim() (* /* ... */ *) double term() (* /* ... */ *) double expr() (* /* ... */ *)
ΠΠ»Π°Π²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠ°ΠΊ Π²ΡΠ΅Π³Π΄Π°, ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½Π°:
// main.c: Π³Π»Π°Π²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
#include Β«stream.hΒ» #include Β«error.hΒ» #include Β«lex.hΒ» #include Β«syn.hΒ» #include Β«table.hΒ» #include Β«string.hΒ»
main(int argc, char* argv[]) (* /* ... */ *)
Π‘ΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ°ΠΊΡΠΎΡΠΎΠ². ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΡΡΠΈΡ ΡΠ°ΠΊΡΠΎΡΠΎΠ² ΡΠΈΠ»ΡΠ½Π΅Π΅ ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ Π²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΌΠΈ ΡΠ°Π»Π°ΠΌΠΈ, Π½Π΅ΠΆΠ΅Π»ΠΈ Ρ Π‘++. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π² Π²Π°ΡΠ΅ΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅ Π½Π΅Ρ ΡΡΠ΅Π΄ΡΡΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²ΠΈΠ΄Π΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° ΡΠ°ΠΉΠ»ΠΎΠ² ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡΠΈΠ²Π»ΠΊΠ°ΡΠ΅Π»ΡΠ½ΡΠΌ. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΠΎΡΠΊΡΡΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΡΠ΅Π½ΠΈΠ΅ 10 ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΠΎ 50 ΡΡΡΠΎΠΊ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΡΠ΅Π±ΡΠ΅Ρ Π·Π°ΠΌΠ΅ΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠ΅ΠΌ ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π² 500 ΡΡΡΠΎΠΊ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π²Π°ΠΆΠ΄Ρ ΠΏΠΎΠ΄ΡΠΌΠ°ΡΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΡΡΠΈΠ»Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ Π·Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². Π‘Π»ΠΎΠ²ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΡ: Π½Π°Π±ΠΎΡ ΠΈΠ· Π΄Π΅ΡΡΡΠΈ Π·Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΠ»ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΎΠ±ΡΡΠ½ΠΎ Π»Π΅Π³ΡΠ΅ ΠΏΠΎΠ΄Π΄Π°ΡΡΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ°Π·Π±ΠΈΠ»ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π² Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π½Π° Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎ ΡΠ°ΠΌΠ΅ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ (ΠΏΠΎΠΌΠ΅ΡΠ°Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π² ΡΠ²ΠΎΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» ΠΈ Ρ.Π΄.), Ρ Π²Π°Ρ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡΡΡ Π½ΡΠ°Π·Π±Π΅ΡΠΈΡ Π° ΠΈΠ· ΡΠΎΡΠ΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ².