Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 68

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° hoc3 размСщаСтся Π½Π΅ Π² ΠΎΠ΄Π½ΠΎΠΌ, Π° Π² пяти Ρ„Π°ΠΉΠ»Π°Ρ…, makefile становится Π±ΠΎΠ»Π΅Π΅ слоТным:

$ cat makefile

YFLAGS = -d # force creation of y.tab.h

OBJS = hoc.o init.o math.o symbol.o # abbreviation


hoc3: $(OBJS)

      cc $(OBJS) -lm -o hoc3


hoc.o: hoc.h


init.o symbol.o: hoc.h y.tab.h


pr:

       @pr hoc.y hoc.h init.c math.c symbol.c makefile


clean:

       rm -f $(OBJS) y.tab.[ch]

$

Π‘Ρ‚Ρ€ΠΎΠΊΠ° YFLAGS = -d добавляСт Ρ„Π»Π°Π³ -d Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку запуска yacc, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡƒΡŽ make. Π­Ρ‚ΠΎΡ‚ Ρ„Π»Π°Π³ прСдписываСт yacc ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» y.tab.h, содСрТащий ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ #define. Π‘Ρ‚Ρ€ΠΎΠΊΠ° OBJS = ... Π²Π²ΠΎΠ΄ΠΈΡ‚ сокращСниС для записи конструкции, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ нСсколько Ρ€Π°Π·. Бинтаксис здСсь Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, скобки ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹. Π€Π»Π°Π³ -lm ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ матСматичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ libm.a.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° hoc3 образуСтся ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² .ΠΎ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ зависят ΠΎΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ² .h. "Зная" эти зависимости, make ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, какая трСбуСтся пСрСтрансляция Π² случаС измСнСния любого ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ дСйствия make, Π½Π΅ запуская процСсс, Ρ‚ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ввСсти ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

$ make -n

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ², с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π»Π°Π³Π° -t (touch ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ) Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠ°ΠΊ Π±Ρ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, Π½Π΅ производя пСрСтрансляции.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²Π²Π΅Π»ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ мноТСство зависимостСй ΠΌΠ΅ΠΆΠ΄Ρƒ исходными Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, Π½ΠΎ ΠΈ нСсколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, сконцСнтрировав ΠΈΡ… Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° make выполняСт ΠΏΠ΅Ρ€Π²ΠΎΠ΅ дСйствиС, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² Ρ„Π°ΠΉΠ»Π΅ makefile. Однако Ссли Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ мСстС окаТСтся элСмСнт, ΠΏΠΎΠΌΠ΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ зависимости, Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ symbol.o ΠΈΠ»ΠΈ pr, Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ½. БчитаСтся, Ρ‡Ρ‚ΠΎ Π² случаС "пустой" зависимости элСмСнт всСгда бСрСтся Π½Π΅ ΠΈΠ· послСднСй вСрсии, поэтому ΠΏΡ€ΠΈ запросС ΠΎΠ½ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ. Π˜Ρ‚Π°ΠΊ,

$ make pr | lpr

ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ распСчатку зависимостСй Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€Π΅. (ПоявлСниС символа @ Π² "@pr" подавляСт эхо выполняСмой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ make.) Команда ΠΆΠ΅

make clean

удаляСт Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ yacc, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ .o.

Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ пустых зависимостСй Π² Ρ„Π°ΠΉΠ»Π΅ makefile часто оказываСтся Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΊΠ°ΠΊ срСдство для ΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€Π°Ρ†ΠΈΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ всСх связанных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. ΠžΠ±Π»Π°ΡΡ‚ΡŒ примСнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ make Π½Π΅ ограничиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΎΠ½Π° позволяСт ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ зависимости.

НСсколько Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ lex

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lex ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ лСксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ yacc Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ грамматичСского Ρ€Π°Π·Π±ΠΎΡ€Π°: Π²Ρ‹ создаСтС описаниС лСксичСских ΠΏΡ€Π°Π²ΠΈΠ» вашСго языка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π‘ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ строки, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lex строит ΠΏΠΎ этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ lex ΠΈ yacc Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ описанныС Π²Ρ‹ΡˆΠ΅ лСксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹. ΠœΡ‹ Π½Π΅ собираСмся здСсь Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ lex; наша Ρ†Π΅Π»ΡŒ β€” Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ вас, Π° подробности Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² справочном руководствС ΠΏΠΎ UNIX (Ρ‚ΠΎΠΌ 2B).

Π’Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ lex-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° lex.l, которая замСняСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ²ΡˆΡƒΡŽΡΡ Π΄ΠΎ сих ΠΏΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ yylex:

$ cat lex.l

%{

#include "hoc.h"

#include "y.tab.h"


extern int lineno;

%}

%%

[ \t] { ; } /* skip blanks and tabs */

[0-9]+\.?][0-9]*\.[0-9]+ {

 sscanf(yytext, "%lf", &yylval.val);

 return NUMBER;

}

[a-zA-Z][a-zA-Z0-9]* {

 Symbol *s;

 if ((s=lookup(yytext)) == 0)

  s = install(yytext, UNDEF, 0.0);

 yylval.sym = s;

 return s->type == UNDEF ? VAR : s->type;

}

\n { lineno++; return '\n'; }

/* everything else */

. { return yytext[0]; }

$

КаТдоС "ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ" являСтся рСгулярным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΈ Ρ‚Π΅, Ρ‡Ρ‚ΠΎ использовались Π² egrep ΠΈΠ»ΠΈ awk, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½ΠΈΡ… lex распознаСт ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π² стилС Π‘ΠΈ Ρ‚ΠΈΠΏΠ° \t ΠΈ \n. ДСйствиС Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ ΠΏΠΎ порядку, Π° конструкции с символами * ΠΈ + Π·Π°Π΄Π°ΡŽΡ‚ сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ строку. Если ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ части Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Ρ‚ΠΎ выполняСтся дСйствиС. Бовпавшая с ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ входная строка доступна Π² lex-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ yytext. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² lex, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» makefile: ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° make

$ cat makefile

YFLAGS = -d

OBJS = hoc.o lex.o init.o math.o symbol.o


hoc3: $(OBJS)

      cc $(OBJS) -lm -ll -o hoc3


hoc.o: hoc.h


lex.o init.o symbol.o: hoc.h y.tab.h


...

$

"Π·Π½Π°Π΅Ρ‚", ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° .l настоящий Ρ„Π°ΠΉΠ» .o; всС, Ρ‡Ρ‚ΠΎ трСбуСтся ΠΎΡ‚ нас, Π΄Π°Ρ‚ΡŒ Π΅ΠΉ свСдСния ΠΎ зависимостях. (НуТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ lex -ll ΠΊ списку ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π΅Π΄Π΅Ρ‚ поиск ΠΊΠΎΠΌΠ°Π½Π΄Π° сс, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ, создаваСмый lex, нуТдаСтся Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… функциях.) Π­Ρ„Ρ„Π΅ΠΊΡ‚ получаСтся вСсьма ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡ‹ΠΌ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ автоматичСски:

$ make

yacc -d hoc.y


 conflicts: 1 shift/reduce

сс -с y.tab.c

rm y.tab.c

mv y.tab.o hoc.o

lex lex.l

сс -с lex.yy.c

rm lex.yy.c

mv lex.yy.o lex.o

сс -c init.c

сс -c math.c

сс -c symbol.c

cc hoc.o lex.o init.o math.o symbol.o -lm -ll -o hoc3

$

Если ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» измСнится, достаточно СдинствСнной ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ make для получСния Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ вСрсии:

$ touch lex.l Π‘ΠΌΠ΅Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° lex.l

$ make

lex lex.l

cc -с lex.yy.c

rm lex.yy.c

mv lex.yy.o lex.o

cc hoc.o lex.o init.o math.o symbol.o -ll -lm -o hoc3

$

НСкотороС врСмя ΠΌΡ‹ Π΄Π΅Π±Π°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, слСдуСт Π»ΠΈ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ обсуТдСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ lex отступлСниСм ΠΎΡ‚ нашСй Ρ‚Π΅ΠΌΡ‹ ΠΈ поэтому ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ вопросам ΠΈΠ»ΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π΅ ΠΊΠ°ΠΊ основноС срСдство для лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠΎΠ³Π΄Π° язык становится слишком слоТным. Π£ нас Π±Ρ‹Π»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ "Π·Π°" ΠΈ "ΠΏΡ€ΠΎΡ‚ΠΈΠ²". ЗатруднСния Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с lex (ΠΏΠΎΠΌΠΈΠΌΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ язык) связаны с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ замСдляСтся Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° распознаватСли ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΌΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‡Π΅ΠΌ эквивалСнтныС вСрсии Π½Π° языкС Π‘ΠΈ. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ трудности с ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Π²Π²ΠΎΠ΄Π° Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… особых случаях, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ восстановлСниС послС ошибки, Π° Ρ‚Π°ΠΊΠΆΠ΅ с Π²Π²ΠΎΠ΄ΠΎΠΌ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°. Ни ΠΎΠ΄Π½Π° ΠΈΠ· пСрСчислСнных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ являСтся сущСствСнной для hoc. К соТалСнию, ΠΈΠ·-Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ объСма ΠΊΠ½ΠΈΠ³ΠΈ ΠΌΡ‹ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… лСксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°Ρ… ΠΊ Π‘ΠΈ. Однако созданиС вСрсии с lex Π±ΡƒΠ΄Π΅Ρ‚ для вас Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.9

Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π΄Π²ΡƒΡ… вСрсий hoc3. Подсказка: ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ справочному руководству ΠΏΠΎ size(1).

8.4 Π­Ρ‚Π°ΠΏ 4: компиляция Π½Π° ΠΌΠ°ΡˆΠΈΠ½Ρƒ

ΠœΡ‹ постСпСнно приблиТаСмся ΠΊ созданию hoc5 β€” ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° языка со структурами управлСния. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° hoc4 являСтся ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ Π·Π²Π΅Π½ΠΎΠΌ: ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ hoc3, Π½ΠΎ рСализуСтся Π½Π° Π±Π°Π·Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, ΠΊΠ°ΠΊ hoc5. ΠœΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ написали Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ hoc4 ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π΄Π²Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ возмоТностями, Ρ‡Ρ‚ΠΎ Ρ†Π΅Π½Π½ΠΎ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. По ΠΌΠ΅Ρ€Π΅ Ρ€Π°Π·Π±ΠΎΡ€Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° hoc4 ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄, рассчитанный Π½Π° ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, Π° Π½Π΅ Π²Ρ‹Π΄Π°Π΅Ρ‚ сразу Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠŸΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ†Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΊΠΎΠ΄, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ для вычислСния Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° (Ρ‚.Π΅. ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ "интСрпрСтация").

Под простой машиной здСсь подразумСваСтся стСковая машина: ΠΊΠΎΠ³Π΄Π° появляСтся ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, ΠΎΠ½ заносится Π² стСк, Ρ‚ΠΎΡ‡Π½Π΅Π΅, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, заносящиС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π² стСк). Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ выполняСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка. НапримСр, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ присваивания

x=2*y

ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

constpush Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² стСк: константа β€¦ константа2

2

varpush   Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠΌΠ΅Π½ Π² стСк

y         β€¦ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρƒ

eval      Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ: Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ

mul       ΠŸΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π΄Π²Π° Π²Π΅Ρ€Ρ…Π½ΠΈΡ… элСмСнта; Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ замСняСт ΠΈΡ…

varpush   Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠΌΠ΅Π½ Π² стСк

x         … для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ x

assign    Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ