Режимы работы интерпретатора языка МИЛАН
Назначение файлов интерпретатора языка МИЛАН
Программная реализация интерпретатора языка МИЛАН
Интерпретатор языка МИЛАН реализован на языке PHP. Назначение файлов программной реализации языка МИЛАН приведено в таблице 7.
Таблица 7
Имя файла | Назначение |
Интерфейс | |
interface.php | Главный файл. С него возможен запуск выполнения программы. Отображает поле для выбора файла, содержащего исходный текст на языке МИЛАН, а также текстовую область, в которую загружается выбранный файл с возможностью редактирования. |
pole.php | Содержит в себе поле выбора файла для загрузки. Отправляет имя файла на обработку в скрипт interface.php |
Интерпретатор | |
milan.php | Содержит в себе функции для обеспечения связи между интерфейсом и интерпретатором. Отвечает за выбор режима работы интерпретатора и восстановление данных потерянных при перезагрузке скрипта. |
interpretator.php | Основной файл интерпретатора, содержащий все функции по трансляции и интерпретации исходного кода языка МИЛАН. |
Рассмотрим особенности программной реализации режимов работы интерпретатора и проверки корректности ввода целого числа.
Описание режимов работы интерпретатора. Текущий режим работы определяется значением скрытого поля «mode», расположенного на клиентской форме. В зависимости от этого присваивается значение переменной $ct_milanMode. Описание режимов работы интерпретатора приведено в таблице 8.
Таблица 8
Режим работы | Описание |
0 | 1) Выполняется только лексический анализатор. 2) В результате работы лексический анализатор на экран пользователя могут выводиться: таблицы лексем, идентификаторов и констант; сообщение о лексической ошибке. 3) Производится сохранение таблиц лексем (в скрытые поля формы «lex_code», «lex_value»), идентификаторов (в скрытое поле «tab_ident») и констант (в скрытое поле «tab_const»). |
1 | 1) Восстанавливаются таблицы лексем, идентификаторов и констант, сохранённые в скрытых полях формы. 2) Выполняется стадия синтаксического анализа, совмещенная с интерпретацией. 3) При выполнении команды «READ» производится генерация html страницы с полем ввода «stdin» и кнопкой отправки запроса. Также на сгенерированной html странице в скрытых полях производится сохранение таблиц (аналогично пункту 3 режима 0. В поле с именем «readbuf», располагается массив данных, полученных с помощью команды «READ», на протяжении всей работы интерпретатора. |
2 | 1) Восстанавливаются таблицы лексем, идентификаторов и констант, сохранённые в скрытых полях формы. 2) Производится загрузка данных, которые были считаны при предыдущих интерпретациях команды «READ». 3) Выполняется стадия синтаксического анализа, совмещенная с интерпретацией. |
Восстановление таблицы лексем, таблицы идентификаторов и таблицы констант необходимо в связи с тем, что переменные, объявленные в php скрипте на стадии лексического анализа, обнуляются при его перезагрузке. Для решения этой проблемы используются встроенные в форму скрытые поля.
Также во всех режимах клиенту отправляется html код, содержащий скрытое поле «source». В нём хранится исходный текст программы на языке МИЛАН, необходимый для передачи его в окно редактирования кода.
Скрипт, обрабатывающий текущий режим работы интерпретатора, расположен в файле milan.php.
Исходный код скрипта на языке PHP:
//Получаем переданный исходный код от пользователя $ct_buf = $_POST["source"]; $ct_pos = 0; $ct_readCount = 0; //Позиция текущего символа $ct_readBUF = Array(); //определение режима работы интерпретатора switch($_POST["mode"]): case '1': //Режим работы 1 - синтаксический анализатор и интерпретация $ct_milanMode = 1; break; case '2': //получим данные из скрытого поля с именем "readbuf" $tmp= $_POST["readbuf"]; if($tmp!='') //если строка не пустая { //разбиваем строку на элементы разделённые символом '%' //и заносим в массив $ct_readBUF = split('%',$tmp); } //добавим новое прочитанное из поля "stdin" число в массив $ct_readBUF[]=$_POST["stdin"]; //Режим работы 2 - синтаксический анализатор и // интерпретация с восстановлением данных, введённых пользователем $ct_milanMode = 2; break; default: //Режим работы 0 – только лексический анализатор $ct_milanMode = 0; endswitch; |
Скрипт проверки корректности ввода целого числа. Данный скрипт расположен в файле interpretator.php и добавляется в html код страницы, при генерации запроса на ввод целого числа от пользователя.
Исходный код на языке javascript:
<script type="text/javascript"> function ScanForInt() { <!--получаем текущее введённое значение из поля ввода с именем "stdin" в переменную "x"--> var x=inputform.stdin.value; <!--цикл для прохода по всей строке "x"--> for(i=0;i<=x.length;i++) { <!--получаем ASCII код i-ого символа--> var s=x.substr(i).charCodeAt(); <!--диапазон кодов (48..57) соответствет в таблице ASCII - целым числам от 0..9--> if(s<48 || s>57) { <!--выдаём сообщение пользователю--> alert("Введите целое число"); return false; <!--выходим из скрипта--> } } return x.length>0; <!--возвращаем TRUE, если длина больше 0, иначе FALSE--> } </script> <form name="inputform" action="milan.php" method="POST"> <!--в поле с именем "stdin" хранится введённое пользователем число--> <input type="text" name="stdin" /> <!--переменная для хранения исходного кода программы MILAN--> <input name="source" type="hidden" value="'.$ct_buf.'"/> <!--поле хранит значения CODE таблицы лексем--> <input name="lex_code" type="hidden" value="'.$ct_TabLEX_Code_str.'"> <!--поле хранит значения VALUE таблицы лексем --> <input name="lex_value" type="hidden" value="'.$ct_TabLEX_Value_str.'"> <!--поле хранит данные таблицы идентификаторов--> <input name="tab_ident" type="hidden" value="' .join('%',$Tab_Identifiers). '"> <!--поле хранит данные таблицы констант--> <input name="tab_const" type="hidden" value="' .join('%',$Tab_Constants). '"> <!--функция join("%",$ct_readBUF) преобразует массив данных в строку разделённую "%" --> <input name="readbuf" type="hidden" value="'. join("%",$ct_readBUF) .'"/> <!--поле хранит текущий режим работы скрипта--> <input name="mode" type="hidden" value="2"> <!--кнопка для отправки данных в скрипт "milan.php", в случае получения значения "TRUE" от функции ScanForInt()--> <input type="button" name="send" value="Отправить" onclick="if(ScanForInt())inputform.submit()"> </form> |