kursovik / прогам реализация
.docxпеременную $ai[$Tab_Lexems[$Number_Lexem]->Value -> $Ai];
номеру текущей лексемы присвоить значение $Ai [$Ai->$Number_Lexem] */
$Ai=$Tab_Lexems[$Number_Lexem]->Value;
$Number_Lexem=$Ai;
}
else
{
/* Конструкция <оператор>. */
/* Отсутствует : в операторе SWITH.*/
$Code_Error=43;
return 0;
}
ProcedureZ();
}
}
elseif ($Tab_Lexems[$Number_Lexem]->Code==_DEFAUT_)
{
/* функция y4: чтение следующей лексемы ($Number_Lexem++) */
$Number_Lexem++;
/* функция у25: снять вершину стека $StekDefaultValue в переменную $ai
[$StekDefaultValue->$Ai]; сравнить $Ai с 1:
$Ai==1 – движение по TRUE, иначе по FALSE*/
if (!Stek_Integer(1, $StekDefaultValue, $TopDefaultValue, $Ai))
{
/* Нехватка элементов в стеке $StekDefaultValue */
$Code_Error=42;
return 0;
}
/* Ветка TRUE */
if ($Ai)
{
if ($Tab_Lexems[$Number_Lexem]->Code==_COLON_)
{
/* функция y4: чтение следующей лексемы ($Number_Lexem++) */
$Number_Lexem++;
}
else
{
/* Конструкция <оператор>. */
/* Отсутствует : в операторе SWITH.*/
$Code_Error=43;
return 0;
}
ProcedureL();
/* Проверка на ошибки, появившиеся в процессе */
/* обработки конструкции <последовательность операторов> */
if ($Code_Error!=-1)
return 0;
}
/* Ветка FALSE */
else
{
if ($Tab_Lexems[$Number_Lexem]->Code==_COLON_)
{
/*функция у24: снять значение текущей лексемы в переменную
$Ai[$Tab_Lexems[$Number_Lexem]->Value -> $Ai];
номеру текущей лексемы присвоить значение $Ai [$Ai->$Number_Lexem]*/
$Ai=$Tab_Lexems[$Number_Lexem]->Value;
$Number_Lexem=$Ai;
}
else
{
/* Конструкция <оператор>. */
/* Отсутствует : в операторе SWITH.*/
$Code_Error=43;
return 0;
}
}
}
else
{
if (!Stek_Integer(1, $StekDefaultValue, $TopDefaultValue, $Ai))
{
/* Нехватка элементов в стеке $StekDefaultValue */
$Code_Error=42;
return 0;
}
}
} /*End ProcedureZ*/
/*************************************************************************/
/* Процедура ProcedureL - обработка конструкции */
/* <последовательность операторов>::=<оператор> | */
/* <оператор>;<последовательность операторов> */
/*************************************************************************/
function ProcedureL()
{
global $Code_Error;
global $Tab_Lexems;
global $Number_Lexem;
while (TRUE):
/* Обработка конструкции <оператор> */
ProcedureS();
/* Проверка на ошибки, появившиеся в процессе */
/* обработки конструкции <оператор> */
if ($Code_Error!=-1)
return 0;
/* Проверка символа ";" */
if ($Tab_Lexems[$Number_Lexem]->Code!=_SEMICOLON_)
return 0;
/* функция y4: чтение следующей лексемы ($Number_Lexem++) */
$Number_Lexem++;
endwhile;
return 0;
} /* End ProcedureL */
/* Начало Синтаксического анализа совмещённого с интерпретацией */
/* функция y0: инициализация стеков и переменных */
/* Инициализация переменных */
global $Tab_Lexems;
global $Number_Lexem;
global $Code_Error;
global $ArrIdent;
global $TopIdent;
global $TopRel;
global $TopRes;
global $StekRes;
global $TopSum;
global $StekSum;
global $StekMul;
global $StekRel;
global $StekIdent;
global $Ai;
global $Bi;
$Ai=0;
$Bi=0;
global $StekCaseValue;
global $StekDefaultValue;
global $StekForExit;
global $StekPostDec;
global $StekPostDecCount;
global $TopPostDec;
global $TopPostDecCount;
global $TopCaseValue;
global $TopDefaultValue;
global $TopForExit;
/* Инициализация стеков */
Stek_Integer(0, $ArrIdent, $TopRes, $Ai);
Stek_Integer(0, $StekRes, $TopRes, $Ai);
Stek_Integer(0, $StekIdent, $TopIdent, $Ai);
Stek_Integer(0, $StekMul, $TopMul, $Ai);
Stek_Integer(0, $StekSum, $TopSum, $Ai);
Stek_Integer(0, $StekRel, $TopRel, $Ai);
Stek_Integer(0, $StekCaseValue, $TopCaseValue, $Ai);
Stek_Integer(0, $StekDefaultValue, $TopDefaultValue, $Ai);
Stek_Integer(0, $StekForExit, $TopForExit, $Ai);
Stek_Integer(0, $StekPostDec, $TopPostDec, $Ai);
Stek_Integer(0, $StekPostDecCount, $TopPostDecCount, $Ai);
/* Начало просмотра массива лексем */
$Number_Lexem=1;
if ($Tab_Lexems[$Number_Lexem]->Code!=_BEGIN_)
{
/* Конструкция <программа>. Нет BEGIN. */
$Code_Error=12;
return 0;
}
/* функция y4: чтение следующей лексемы ($Number_Lexem++) */
$Number_Lexem++;
/* Обработка конструкции <последовательность операторов> */
ProcedureL();
/* Проверка на ошибки, появившиеся в процессе */
/* обработки конструкции <последовательность операторов> */
if ($Code_Error!=-1)
return 0;
if ($Tab_Lexems[$Number_Lexem]->Code!=_END_)
{
/* Конструкция <программа>. Нет END. */
$Code_Error=13;
return 0;
}
/* y20: нормальное завершение работы синтаксического анализатора */
global $ct_buf;
echo('<br><hr><br><font color="blue">НОРМАЛЬНОЕ ЗАВЕРШЕНИЕ РАБОТЫ ИНТЕРПРЕТАТОРА</font><br><br><form action="INTERFACE.php" method="POST">
<input type="submit" value=" ОК " >
<input name="source" type="hidden" value="'.$ct_buf.'">
</form>');
}
?>
Примеры:
Правильные:
1. BEGIN
x:=0;
FOR n:=0 TO 100 STEP 10
z:=READ;
x:=x+z;
ENDFOR;
OUTPUT(x)
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 20, 1 12, 0 24, 0 19, 2 16, 0 20, 1
10 25,25 20, 2 26, 0 20, 3 19, 3 16, 0 9, 0 12, 0 19, 1 16, 0
20 19, 1 14, 0 19, 3 12, 0 27,11 12, 0 8, 0 18, 0 19, 1 18, 0
30 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 x
2 n
3 z
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
1 0
2 100
3 10
2. BEGIN
x:=2;
y:=READ;
IF y<x THEN
x:=x/y;
ELSE
x:=y/x;
x++;
OUTPUT(x)
ENDIF
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 20, 1 12, 0 19, 2 16, 0 9, 0 12, 0
10 7, 0 19, 2 13, 3 19, 1 10,22 19, 1 16, 0 19, 1 15, 1 19, 2
20 12, 0 3,36 19, 1 16, 0 19, 2 15, 1 19, 1 12, 0 19, 1 33, 0
30 12, 0 8, 0 18, 0 19, 1 18, 0 6, 0 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 x
2 y
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
1 2
3. BEGIN
z:=READ;
IF z=0 THEN
z:=z+1;
ELSE
z:=z+5;
ENDIF;
IF z>5 THEN
OUTPUT(1)
ELSE
OUTPUT(0)
ENDIF;
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 9, 0 12, 0 7, 0 19, 1 13, 0 20, 1
10 10,18 19, 1 16, 0 19, 1 14, 0 20, 2 12, 0 3,25 19, 1 16, 0
20 19, 1 14, 0 20, 3 12, 0 6, 0 12, 0 7, 0 19, 1 13, 2 20, 3
30 10,36 8, 0 18, 0 20, 2 18, 0 3,41 8, 0 18, 0 20, 1 18, 0
40 6, 0 12, 0 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 z
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
1 0
2 1
3 5
4. BEGIN
x:=0;
n:=5;
SWITH (6){
CASE 7: WHILE x>0 DO
OUTPUT(n)
ENDDO;
DEFAUT: OUTPUT(x++)};
OUTPUT(x)
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 20, 1 12, 0 19, 2 16, 0 20, 2 12, 0
10 21, 0 18, 0 20, 3 18, 0 29,15 22, 0 20, 4 31,29 11, 0 19, 1
20 13, 2 20, 1 2,28 8, 0 18, 0 19, 2 18, 0 5,19 12, 0 23, 0
30 31,36 8, 0 18, 0 19, 1 33, 0 18, 0 30, 0 12, 0 8, 0 18, 0
40 19, 1 18, 0 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 x
2 n
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
1 0
2 5
3 6
4 7
5. BEGIN
x:=0;
n:=5;
WHILE n>0 DO
z:=READ;
x:=x+z;
n:=++n;
ENDDO;
OUTPUT(x)
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 20, 1 12, 0 19, 2 16, 0 20, 2 12, 0
10 11, 0 19, 2 13, 2 20, 1 2,31 19, 3 16, 0 9, 0 12, 0 19, 1
20 16, 0 19, 1 14, 0 19, 3 12, 0 19, 2 16, 0 33, 0 19, 2 12, 0
30 5,11 12, 0 8, 0 18, 0 19, 1 18, 0 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 x
2 n
3 z
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
-
0
-
5
6. BEGIN
x:=0;
n:=5;
WHILE n>0 DO
z:=READ;
x:=x+z;
n++:=n; //n=n+1
ENDDO;
OUTPUT(x)
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 20, 1 12, 0 19, 2 16, 0 20, 2 12, 0
10 11, 0 19, 2 13, 2 20, 1 2,41 19, 3 16, 0 9, 0 12, 0 19, 1
20 16, 0 19, 1 14, 0 19, 3 12, 0 19, 2 15, 0 15, 0 16, 0 19, 2
30 12, 0 18, 0 15, 0 19, 2 13, 0 19, 2 15, 0 20, 3 15, 0 18, 0
40 5,11 12, 0 8, 0 18, 0 19, 1 18, 0 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 x
2 n
3 z
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
1 0
2 5
3 1
7. BEGIN
x:=0;
FOR n=0 TO 100
x:=x+n;
ENDFOR;
OUTPUT(x)
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 20, 1 12, 0 24, 0 19, 2 13, 0 20, 1
10 25,19 20, 2 19, 1 16, 0 19, 1 14, 0 19, 2 12, 0 27,11 12, 0
20 8, 0 18, 0 19, 1 18, 0 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 x
2 n
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
1 0
2 100
8. BEGIN
x:=0;
n:=5;
SWITH (6){
CASE 7: OUTPUT(n)};
OUTPUT(x)
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 20, 1 12, 0 19, 2 16, 0 20, 2 12, 0
10 21, 0 18, 0 20, 3 18, 0 29,15 22, 0 20, 4 31,22 8, 0 18, 0
20 19, 2 18, 0 30, 0 12, 0 8, 0 18, 0 19, 1 18, 0 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 x
2 n
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
1 0
2 5
3 6
4 7
9. BEGIN
x:=0;
n:=5;
SWITH (5){
CASE 7: WHILE x>0 DO
OUTPUT(n)
ENDDO;
DEFAUT: OUTPUT(x)};
OUTPUT(x)
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 20, 1 12, 0 19, 2 16, 0 20, 2 12, 0
10 21, 0 18, 0 20, 2 18, 0 29,15 22, 0 20, 3 31,29 11, 0 19, 1
20 13, 2 20, 1 2,28 8, 0 18, 0 19, 2 18, 0 5,19 12, 0 23, 0
30 31,35 8, 0 18, 0 19, 1 18, 0 30, 0 12, 0 8, 0 18, 0 19, 1
40 18, 0 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 x
2 n
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
1 0
2 5
3 7
10. BEGIN
X:=3;
Y:=4;
X:=X+Y;
OUTPUT(X)
END
Т А Б Л И Ц А Л Е К С Е М
Номер 0 1 2 3 4 5 6 7 8 9
0 1, 0 19, 1 16, 0 20, 1 12, 0 19, 2 16, 0 20, 2 12, 0
10 19, 1 16, 0 19, 1 14, 0 19, 2 12, 0 8, 0 18, 0 19, 1 18, 0
20 4, 0
МАССИВ ИДЕНТИФИКАТОРОВ
Номер ИДЕНТИФИКАТОР
1 X
2 Y
МАССИВ КОНСТАНТ
Номер КОНСТАНТА
1 3
2 4
Неправильные:
1. BEGIN
X:=3
Y:=4;
X:=X+Y;
OUTPUT X
END
2. BEGIN
x:=0;
n:=5;
SWITH (6){
CASE 7: OUTPUT(n)};
OUTPUT(x)
3. BEGIN
k:=READ;
a:=k;
WHILE a<3 DO
a:=a*2;
i:=17;
a:=i*a;
OUTPUT(a)
END
4. BEGIN
x:=0;
n:=5;
SWITH (5){
CASE 7: WHILE x>0 DO
OUTPUT(n)
DEFAUT: OUTPUT(x)};
OUTPUT(x)
END
5. BEGIN
x:=0;
n:=5;
SWITH (5){
CASE : WHILE x>0 DO
OUTPUT(n)
ENDDO;
DEFAUT: OUTPUT(x)};
OUTPUT(x)
END
6. BEGIN
x:=0;
FOR n:=0 -100 STEP 10
z:=READ;
x:=x+z;
ENDFOR;
OUTPUT(x)
END
7.
x:=0;
FOR n:=0 TO 100 STEP 10
z:=READ;
x:=x+z;
ENDFOR;
OUTPUT(x)
8.BEGIN
x:=0;
n:=5;
SWITH (5){
CASE 7: WHILE x>0 DO
OUTPUT(n)
DEFAUT: OUTPUT(x)};
OUTPUT(x)
ENDBEGIN
9. BEGIN
x:=0;
n:=5;
SWITH (5)
CASE 7: WHILE x>0 DO
OUTPUT(n)
DEFAUT: OUTPUT(x)
OUTPUT(x)
END
10. BEGIN
x:=0;
n:=5;
WHILE n>0
z:=READ;
x:=x+z;
n++:=n; //n=n+1
END;
OUTPUT(x)
END