Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

kursovik / прогам реализация

.docx
Скачиваний:
28
Добавлен:
02.04.2015
Размер:
94.79 Кб
Скачать

переменную $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

МАССИВ КОНСТАНТ

Номер КОНСТАНТА

  1. 0

  2. 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

Соседние файлы в папке kursovik