6. Тестовая программа.
Для демонстрации работы разработанных анализаторов была создана следующая тестовая программа:
Первый блок переменных
{11:vars;
let a1 5;
let b1 (a+10.3)*2;
let c1 b/a;
}
Второй блок переменных
{12:vars;
let a2 34.24;
let b2 a1+a2;
let c2 b2/4;
}
Третий блок переменных
{13:vars;
let x 0;
let y 0;
}
Первый блок вычислений
{21:do;
let x aa1*aa2-4*b1*b2;
? x>0 && b2 != a1 let x x-c1;
or ? x<0 let x x-x2;
or let x x*2;
}
Второй блок вычислений
{22:do;
let y cc1+cc2;
? y>=0 || cc1<(cc2+bb1) let y y+x;
or
{
? y<0 {let y x*2;}
or
{
let x x+a1;
let y x/2;
}
}
}
Первый блок связей
{31:join;
11-^a1 => 21->aa1, 22->a1;
11-^b1 => 21->b1, 22->bb1;
11-^c1 => 21->c1, 22->cc1;
}
Второй блок связей
{32:join;
12-^a2 => 21->aa2;
12-^b2 => 21->b2;
13-^x => 21->x;
13-^y => 22->y;
21-^x => 22->x;
}
Используемые в программе идентификаторы, константы и служебные слова языка сохраняются в соответствующие хеш-таблицы:
final Hashtable Htid = new Hashtable(); //хеш-таблица идентификаторов
final Hashtable Htint = new Hashtable(); //хеш-таблица целочисленных констант
final Hashtable Htfloat = new Hashtable(); //хеш-таблица констант с плавающей точкой
final Hashtable Htwords = new Hashtable(); //хеш-таблица служебных слов языка
Внесение служебных слов в таблицу происходит в процессе восстановления дерева грамматического разбора. Для этого в функцию parse включается следующий программный код:
// занесение предопределенных слов в таблицу предопределённых слов
for(int i=0; i<words.length; i++) Htwords.put(words[i], new Integer(i));
Остальные слова вносятся в таблицы с помощью специальных действий включённых в синтаксис языка. Ниже приведены соответствующие программные коды.
Внесение идентификаторов:
If (Htid.get(Lexem.textOfWord.toString()) == null && Htwords.get(Lexem.textOfWord.toString()) == null) {Lexem.wordIndex = Htid.size(); Htid.put(Lexem.textOfWord.toString(),Lexem);}
Условие Htwords.get(Lexem.textOfWord.toString()) == null необходимо для запрещения внесения служебных слов языка в таблицу идентификаторов (служебные слова по типу совпадают с идентификаторами).
Внесение целочисленных констант:
If (ignore.val() == false && Htint.get(Lexem.textOfWord.toString()) == null) {Lexem.wordIndex = Htint.size(); Htint.put(Lexem.textOfWord.toString(),Lexem);}
Условие ignore.val() == false необходимо для запрещения внесения имён блоков в таблицу целочисленных констант (имена блоков имеют численные значения и совпадают по типу с целочисленными константами).
Внесение констант с плавающей точкой:
If (Htfloat.get(Lexem.textOfWord.toString()) == null) {Lexem.wordIndex = Htfloat.size(); Htfloat.put(Lexem.textOfWord.toString(),Lexem);}
При внесении значений в хеш-таблицы ключом является текст слова, а хранимым значением — номер слова в группе, что в совокупности образует лексему.
Для демонстрации результатов работы лексического анализатора на экран выводится содержимое хеш-таблиц. Ниже приведён программный код, обеспечивающий их вывод:
<p><table border=1 align=center class=dh cellpadding=0 cellspacing=0 style=”border-collapse:collapse”>
<tr class=bh><td colspan=”2” align=”center” style=”background-color:lightgreen”>Таблица идентификаторов</td></tr>
<tr class=bh><td align=center> Текст слова </td><td align=center> Номер слова в группе </td></tr>
<%Enumeration keys; Object key;%>
<%for (keys=Htid.keys(); keys.hasMoreElements();)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.