ΠΠ»Ρ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΡΡ ΡΠ΅Π»Π΅ΠΉ ΠΏΡΠΈΠ²ΠΎΠΆΡ ΠΏΠΎΠ»Π½ΡΠΉ ΡΠ΅ΠΊΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠΎΠΊΠ°:
{β}
program Branch;
{β}
{ Constant Declarations }
const TAB = ^I;
CR = ^M;
{β}
{ Variable Declarations }
var Look : char; { Lookahead Character }
Lcount: integer; { Label Counter }
{β}
{ Read New Character From Input Stream }
procedure GetChar;
begin
Read(Look);
end;
{β}
{ Report an Error }
procedure Error(s: string);
begin
WriteLn;
WriteLn(^G, 'Error: ', s, '.');
end;
{β}
{ Report Error and Halt }
procedure Abort(s: string);
begin
Error(s);
Halt;
end;
{β}
{ Report What Was Expected }
procedure Expected(s: string);
begin
Abort(s + ' Expected');
end;
{β}
{ Match a Specific Input Character }
procedure Match(x: char);
begin
if Look = x then GetChar
else Expected('''' + x + '''');
end;
{β}
{ Recognize an Alpha Character }
function IsAlpha(c: char): boolean;
begin
IsAlpha := UpCase(c) in ['A'..'Z'];
end;
{β}
{ Recognize a Decimal Digit }
function IsDigit(c: char): boolean;
begin
IsDigit := c in ['0'..'9'];
end;
{β}
{ Recognize an Addop }
function IsAddop(c: char): boolean;
begin
IsAddop := c in ['+', '-'];
end;
{β}
{ Recognize White Space }
function IsWhite(c: char): boolean;
begin
IsWhite := c in [' ', TAB];
end;
{β}
{ Skip Over Leading White Space }
procedure SkipWhite;
begin
while IsWhite(Look) do
GetChar;
end;
{β}
{ Get an Identifier }
function GetName: char;
begin
if not IsAlpha(Look) then Expected('Name');
GetName := UpCase(Look);
GetChar;
end;
{β}
{ Get a Number }
function GetNum: char;
begin
if not IsDigit(Look) then Expected('Integer');
GetNum := Look;
GetChar;
end;
{β}
{ Generate a Unique Label }
function NewLabel: string;
var S: string;
begin
Str(LCount, S);
NewLabel := 'L' + S;
Inc(LCount);
end;
{β}
{ Post a Label To Output }
procedure PostLabel(L: string);
begin
WriteLn(L, ':');
end;
{β}
{ Output a String with Tab }
procedure Emit(s: string);
begin
Write(TAB, s);
end;
{β}
{ Output a String with Tab and CRLF }
procedure EmitLn(s: string);
begin
Emit(s);
WriteLn;
end;
{β}
{ Parse and Translate a Boolean Condition }
procedure Condition;
begin
EmitLn('<condition>');
end;
{β}
{ Parse and Translate a Math Expression }
procedure Expression;
begin
EmitLn('<expr>');
end;
{β}
{ Recognize and Translate an IF Construct }
procedure Block(L: string); Forward;
procedure DoIf(L: string);
var L1, L2: string;
begin
Match('i');
Condition;
L1 := NewLabel;
L2 := L1;
EmitLn('BEQ ' + L1);
Block(L);
if Look = 'l' then begin
Match('l');
L2 := NewLabel;
EmitLn('BRA ' + L2);
PostLabel(L1);
Block(L);
end;
Match('e');
PostLabel(L2);
end;
{β}
{ Parse and Translate a WHILE Statement }
procedure DoWhile;
var L1, L2: string;
begin
Match('w');
L1 := NewLabel;
L2 := NewLabel;
PostLabel(L1);
Condition;
EmitLn('BEQ ' + L2);
Block(L2);
Match('e');
EmitLn('BRA ' + L1);
PostLabel(L2);
end;
{β}
{ Parse and Translate a LOOP Statement }
procedure DoLoop;
var L1, L2: string;
begin
Match('p');
L1 := NewLabel;
L2 := NewLabel;
PostLabel(L1);
Block(L2);
Match('e');
EmitLn('BRA ' + L1);
PostLabel(L2);
end;
{β}
{ Parse and Translate a REPEAT Statement }
procedure DoRepeat;
var L1, L2: string;
begin
Match('r');
L1 := NewLabel;
L2 := NewLabel;
PostLabel(L1);
Block(L2);
Match('u');
Condition;
EmitLn('BEQ ' + L1);
PostLabel(L2);
end;
{β}
{ Parse and Translate a FOR Statement }
procedure DoFor;
var L1, L2: string;
Name: char;
begin
Match('f');
L1 := NewLabel;
L2 := NewLabel;
Name := GetName;
Match('=');
Expression;
EmitLn('SUBQ #1,D0');
EmitLn('LEA ' + Name + '(PC),A0');
EmitLn('MOVE D0,(A0)');
Expression;
EmitLn('MOVE D0,-(SP)');
PostLabel(L1);
EmitLn('LEA ' + Name + '(PC),A0');
EmitLn('MOVE (A0),D0');
EmitLn('ADDQ #1,D0');
EmitLn('MOVE D0,(A0)');
EmitLn('CMP (SP),D0');
EmitLn('BGT ' + L2);
Block(L2);
Match('e');
EmitLn('BRA ' + L1);
PostLabel(L2);
EmitLn('ADDQ #2,SP');
end;
{β}
{ Parse and Translate a DO Statement }
procedure Dodo;
var L1, L2: string;
begin
Match('d');
L1 := NewLabel;
L2 := NewLabel;
Expression;
EmitLn('SUBQ #1,D0');
PostLabel(L1);
EmitLn('MOVE D0,-(SP)');
Block(L2);
EmitLn('MOVE (SP)+,D0');
EmitLn('DBRA D0,' + L1);
EmitLn('SUBQ #2,SP');
PostLabel(L2);
EmitLn('ADDQ #2,SP');
end;
{β}
{ Recognize and Translate a BREAK }
procedure DoBreak(L: string);
begin
Match('b');
EmitLn('BRA ' + L);
end;
{β}
{ Recognize and Translate an Β«OtherΒ» }
procedure Other;
begin
EmitLn(GetName);
end;
{β}
{ Recognize and Translate a Statement Block }
procedure Block(L: string);
begin
while not(Look in ['e', 'l', 'u']) do begin
case Look of
'i': DoIf(L);
'w': DoWhile;
'p': DoLoop;
'r': DoRepeat;
'f': DoFor;
'd': DoDo;
'b': DoBreak(L);
else Other;
end;
end;
end;
{β}
{ Parse and Translate a Program }
procedure DoProgram;
begin
Block('');
if Look <> 'e' then Expected('End');
EmitLn('END')
end;
{β}
{ Initialize }
procedure Init;
begin
LCount := 0;
GetChar;
end;
{β}
{ Main Program }
begin
Init;
DoProgram;
end.
{β}
ΠΡΠ»Π΅Π²Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π ΠΏΡΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΡΡΠΎΠΉ ΡΠ΅ΡΠΈΠΈ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π»Ρ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ ΠΈΡ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΊΠΎΠ΄. ΠΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ Ρ Ρ ΠΎΡΠΎΡΠΈΠΌ, ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ³Π°ΡΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ.
ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ, Π² Π½Π°ΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π» ΠΎΠ΄ΠΈΠ½ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π΅Π»: ΠΌΡ Π½Π΅ ΠΎΠ±ΡΠ°ΡΠ°Π»ΠΈΡΡ ΠΊ Π²ΠΎΠΏΡΠΎΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡ. Π§ΡΠΎΠ±Ρ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΡΡΠΎΡΡ, Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠ» Π²Π°ΠΌ ΡΠΈΠΊΡΠΈΠ²Π½ΡΡ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π°Π½Π°Π»ΠΈΠ·Π° Π‘ondition, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ»ΡΠΆΠΈΠ»Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅Π»Ρ Π½Π°ΡΡΠΎΡΡΠ΅ΠΉ.
ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π΅Π», ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΌΡ Π·Π°ΠΉΠΌΠ΅ΠΌΡΡ Π½Π° ΡΡΠΎΠΌ ΡΡΠΎΠΊΠ΅, Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ±Π΅Π»Π° ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Condition Π΄ΠΎ Π½Π°ΡΡΠΎΡΡΠ΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°/ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ°.
ΠΠ»Π°Π½
ΠΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ ΠΏΠΎΠ΄ΠΎΠΉΡΠΈ ΠΊ ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ, ΡΠ΅ΠΌ ΠΊ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ. Π Π΄ΡΡΠ³ΠΈΡ Π³Π»Π°Π²Π°Ρ ΠΌΡ Π½Π°ΡΠΈΠ½Π°Π»ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Ρ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Pascal, Π²ΡΡΡΡΠ°ΠΈΠ²Π°Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ ΠΎΡ ΡΠ°ΠΌΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠ½ΡΡ Π½Π°ΡΠ°Π» Π΄ΠΎ ΠΈΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΡΠΎΡΠΌ, Π½Π΅ ΡΡΠ°ΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±Π΅Π· ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΎΠ±ΡΡΠ½ΠΎ ΠΊ Π½Π΅ΠΌΡ ΠΎΡΠ½ΠΎΡΡΡΡΡ Π½Π΅ΠΎΠ΄ΠΎΠ±ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ. Π Π°Π½ΡΡΠ΅ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ ΠΈΠ·Π±Π΅Π³Π°ΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π° Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Ρ ΠΎΡΠΎΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ... ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π·Π½Π°ΠΊ "+" Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΡΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π°ΡΡ. Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡΠΌ ΠΈ ΡΠΈΠΊΠ»Π°ΠΌ. ΠΠΎ ΡΠΏΠΎΡΠΎΠ±Ρ, ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΠ·ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΡ, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΡΠ·ΡΠΊΠ° ΠΊ ΡΠ·ΡΠΊΡ. ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠ΅ΠΆΠ΄Π΅, ΡΠ΅ΠΌ ΠΌΡ Π½Π°ΡΠ½Π΅ΠΌ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π»ΡΡΡΠ΅ ΠΌΡ ΡΠΏΠ΅ΡΠ²Π° ΠΏΡΠΈΠΌΠ΅ΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎ ΠΆΠ΅ ΠΌΡ Ρ ΠΎΡΠΈΠΌ. Π ΡΠΏΠΎΡΠΎΠ± ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠ°Π²ΠΈΠ» ΠΠΠ€ (Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ).
ΠΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ°
ΠΠ΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π½Π°Π·Π°Π΄ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΠΠ€ Π΄Π»Ρ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°ΠΏΠΈΡΠ°Π² ΠΈΡ Π²ΡΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅. ΠΡΠΈΡΠ»ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ. ΠΠΎΡ ΠΎΠ½ΠΈ:
<expression> ::= <unary op> <term> [<addop> <term>]*
<term> ::= <factor> [<mulop> factor]*
<factor> ::= <integer> | <variable> | ( <expression> )
(ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΡΡΠΎΠΉ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½Π° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΠ°ΠΊΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ Π΄Π»Ρ Π°Π»Π³Π΅Π±ΡΡ.)
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΏΠΎΠΊΠ° ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎΠ± ΡΡΠΎΠΌ, Ρ Ρ ΠΎΡΠ΅Π» Π±Ρ ΠΏΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΡ. Π‘ΠΏΠΎΡΠΎΠ±, ΠΊΠΎΡΠΎΡΡΠΌ ΠΌΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΡΠ½Π°ΡΠ½ΡΠΉ ΠΌΠΈΠ½ΡΡ, Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΡΠΉ. Π― Π½Π°ΡΠ΅Π», ΡΡΠΎ Π»ΡΡΡΠ΅ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
<expression> ::= <term> [<addop> <term>]*
<term> ::= <signed factor> [<mulop> factor]*
<signed factor> ::= [<addop>] <factor>
<factor> ::= <integer> | <variable> | (<expression>)
ΠΡΠΎ Π²ΠΎΠ·Π»Π°Π³Π°Π΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΈΠ½ΡΡΠ° Π½Π° Factor, ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΎΠ½ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ.
ΠΡΠΎ Π½Π΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡΡΡΡ Π½Π°Π·Π°Π΄ ΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΡΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ, Ρ ΠΎΡΡ Π²Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΠΈΡΠ΅. ΠΠΎ Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ° Ρ Π±ΡΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ.
Π’Π΅ΠΏΠ΅ΡΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π»Ρ Π²Π°Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°ΡΠΎΠΌ ΡΠ·Π½Π°ΡΡ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΡ Π΄Π»Ρ Π±ΡΠ»Π΅Π²ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ. Π’ΠΈΠΏΠΈΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ» ΡΠ°ΠΊΠΎΠΉ:
<b-expression>::= <b-term> [<orop> <b-term>]*
<b-term> ::= <not-factor> [AND <not-factor>]*
<not-factor> ::= [NOT] <b-factor>
<b-factor> ::= <b-literal> | <b-variable> | (<b-expression>)
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π² ΡΡΠΎΠΉ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ AND Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ "*", Π° OR (ΠΈ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅Π΅ OR) β "+". ΠΠΏΠ΅ΡΠ°ΡΠΎΡ NOT Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ ΡΠ½Π°ΡΠ½ΠΎΠΌΡ ΠΌΠΈΠ½ΡΡΡ. ΠΡΠ° ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΡΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ... Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ·ΡΠΊΠΈ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Ada, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π²ΡΠ΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°... Π½ΠΎ ΡΡΠΎ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ NOT ΠΈ ΡΠ½Π°ΡΠ½ΡΠΉ ΠΌΠΈΠ½ΡΡ. Π Π°Π»Π³Π΅Π±ΡΠ΅ ΡΠ½Π°ΡΠ½ΡΠΉ ΠΌΠΈΠ½ΡΡ ΡΡΠΈΡΠ°Π΅ΡΡΡ ΠΈΠ΄ΡΡΠΈΠΌ ΡΠΎ Π²ΡΠ΅ΠΌ ΡΠ΅ΡΠΌΠΎΠΌ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π° Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ΅ΡΠΌΠ΅. ΠΠΎΡΡΠΎΠΌΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π°:
a * -b
ΠΈΠ»ΠΈ Π΅ΡΠ΅ Ρ ΡΠΆΠ΅:
a β -b
Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Ρ. Π Π±ΡΠ»Π΅Π²ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΠ΅ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
a AND NOT b
ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΡΠ½ΡΠΉ ΡΠΌΡΡΠ» ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠΎ.
ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ
ΠΡΠ°ΠΊ, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ ΡΡΠΎ Π²Ρ Π·Π°Ρ ΠΎΡΠΈΡΠ΅ ΠΏΡΠΈΠ½ΡΡΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΡ, ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΏΠΎΠΊΠ°Π·Π°Π» Π·Π΄Π΅ΡΡ, ΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΠΌΠ΅Π΅ΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈ Π΄Π»Ρ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠΈ ΠΈ Π΄Π»Ρ Π±ΡΠ»Π΅Π²ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΠΈΡ . ΠΠΎΡΠ΅ΠΌΡ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ? ΠΡ, ΡΡΠ° ΡΠ΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΈΠ·-Π·Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Β«ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡΒ» (ΡΡΠ»ΠΎΠ²ΠΈΡ), ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ IF. ΠΡΠ΅Π΄ΠΈΠΊΠ°Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΎ Π΅ΡΡΡ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΡΠ΅Π½Π΅Π½ ΠΊΠ°ΠΊ TRUE ΠΈΠ»ΠΈ FALSE. ΠΠ°ΡΠ΅ΠΌ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. Π’ΠΎΠ³Π΄Π° ΡΠΎ, ΡΡΠΎ ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠΈΠΌ Π² ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ΅ Condition, Π±ΡΠ΄Π΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π±ΡΠ»Π΅Π²ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ.
ΠΠΎ ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΊΠΎΠ΅-ΡΡΠΎ Π΅ΡΠ΅. ΠΠ°ΡΡΠΎΡΡΠ΅Π΅ Π±ΡΠ»Π΅Π²ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠΎΠΌ ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅Π³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°... ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:
IF a AND NOT b THEN ....
ΠΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΡΠΎ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ Π±ΡΠ»Π΅Π²Π° Π°Π»Π³Π΅Π±ΡΠ° ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΡΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅: