Лекции (3) (Презентации лекций (PDF)), страница 2
Описание файла
Файл "Лекции (3)" внутри архива находится в папке "Презентации лекций (PDF)". PDF-файл из архива "Презентации лекций (PDF)", который расположен в категории "". Всё это находится в предмете "практикум (прикладное программное обеспечение и системы программирования)" из 4 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
.S → while < pl0 = prog.get_free (); > E < eqbool ();pl1 = prog.get_free (); prog.blank ();prog.put_lex (Lex (POLIZ_FGO)); >do S < prog.put_lex (Lex (POLIZ_LABEL, pl0);prog.put_lex (Lex (POLIZ_GO));prog.put_lex (Lex (POLIZ_LABEL, prog.get_free()), pl1); >Интерпретатор ПОЛИЗа для М-языкаПольская инверсная запись выбрана в качестве языка внутреннегопредставления программы, в частности, потому, что записанная на немпрограмма может быть легко проинтерпретирована.Идея алгоритма очень проста: просматриваем ПОЛИЗ слева направо; есливстречаем операнд, то записываем его в стек; если встретили знак операции,то извлекаем из стека нужное количество операндов и выполняем операцию,результат (если он есть) заносим в стек.Программа на ПОЛИЗе хранится в виде последовательности лексем вобъекте класса Poliz - prog.Лексемы могут быть следующиe:- лексемы-константы (числа, true, false),- лексемы-метки ПОЛИЗа,- лексемы-операции (включая введенные в ПОЛИЗе) и- лексемы-переменные (их значения - номера строк в таблице TID).class Executer {Lex pc_el;public:void execute (Poliz & prog);};void Executer::execute ( Poliz& prog ) {Stack < int, 100 > args;int i, j, index = 0, size = prog.get_free ( );while ( index < size ) {pc_el = prog [ index ];switch ( pc_el.get_type () ) {case LEX_TRUE: case LEX_FALSE: case LEX_NUM:case POLIZ_ADDRESS: case POLIZ_LABEL:args.push ( pc_el.get_value () );break;case LEX_ID:i = pc_el.get_value ( );if ( TID [ i ].get_assign ( ) ) {args.push ( TID[i].get_value () );break;}elsethrow "POLIZ: indefinite identifier";case LEX_NOT:args.push( !args.pop() );break;case LEX_OR:i = args.pop();args.push ( args.pop() || i );break;case LEX_AND:i = args.pop();args.push ( args.pop() && i );break;case POLIZ_GO:index = args.pop() - 1;break;case POLIZ_FGO:i = args.pop();if ( !args.pop() ) index = i-1;break;case LEX_WRITE:cout << args.pop () << endl;break;case LEX_READ: { int k;i = args.pop ( );if ( TID [ i ].get_type () == LEX_INT ) {cout << "Input int value for";cout << TID[i].get_name () << endl;cin >> k;}else { char j [ 20 ];rep: cout << "Input boolean value;cout << (true or false) for";cout << TID [ i ].get_name ( ) << endl;cin >> j;if (!strcmp (j, "true")) k = 1;elseif (!strcmp (j, "false")) k = 0;else {cout << "Error in input:true/false";cout << endl;goto rep; }}TID [ i ].put_value (k);TID [ i ].put_assign ();break; }case LEX_PLUS:args.push ( args.pop ( ) + args.pop ( ) );break;case LEX_TIMES:args.push ( args.pop ( ) * args.pop ( ) );break;case LEX_MINUS:i = args.pop ( );args.push ( args.pop ( ) - i );break;case LEX_SLASH:i = args.pop ( );if ( ! i ) { args.push(args.pop ( ) / i); break;}else throw "POLIZ:divide by zero";case LEX_EQ:args.push ( args.pop() == args.pop ( ) );break;case LEX_LSS:i = args.pop ( );args.push ( args.pop ( ) < i);break;case LEX_GTR:i = args.pop();args.push ( args.pop() > i ); break;case LEX_LEQ:i = args.pop();args.push ( args.pop() <= i ); break;case LEX_GEQ:i = args.pop();args.push ( args.pop() >= i ); break;case LEX_NEQ:i = args.pop();args.push ( args.pop() != i ); break;case LEX_ASSIGN:i = args.pop();j = args.pop();TID[j].put_value(i);TID[j].put_assign(); break;default: throw "POLIZ: unexpected elem";}//end of switchindex++;}; //end of whilecout << "Finish of executing!!!" << endl;}class Interpretator {Parser pars;Executer E;public:Interpretator (char * program): pars ( program ) { };void interpretation ( );};void Interpretator :: interpretation ( ) {pars.analyze ( );E.execute ( pars.prog );}int main () {try {Interpretator I ("program.txt");I.interpretation ();return 0;}catch (char c) {cout << "unexpected symbol " << c << endl;return 1;}catch (Lex l) {cout << "unexpected lexeme"; cout << l;return 1;}catch (const char * source) {cout << source << endl;return 1;}}.