Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
Новосибирский государственный технический университет
Кафедра ВТ
Лабораторная работа №3
по дисциплине «Системное программное обеспечение»
«Лексика языков программирования. Расширение функциональности лексического акцептора»
Вариант: 1121414
Группа: АМ-709
Студент:
Максименко Д.С.
Преподаватель:
Малявко А.А.
Новосибирск, 2010
Цели работы: изучение способов расширения лексических акцепторов до функциональности лексических анализаторов, структуры информационных таблиц трансляторов, методов организации поиска в таблицах и пополнения таблиц, алгоритмов преобразования цепочек символов (слов) в их внутренние эквиваленты – лексемы.
Для правильной работы лексического анализатора понадобилось добавить свой класс, реализующий таблицу идентификаторов, констант и ключевых слов. Каждая запись в таблице – это текст слова, тип (целое, дробное и т.д.) и список атрибутов.
class IndTable
{
class LexemRecord
{
String text_of_word;
int type;
Vector attributes;
public LexemRecord(String text_of_word, int type, Vector attributes)
{
this.text_of_word = text_of_word;
this.type = type;
this.attributes = attributes;
}
}
Vector table;
public IndTable()
{
table = new Vector();
}
int Search(String word)
{
LexemRecord record;
for (int i = 0; i < table.size(); i++)
{
record = (LexemRecord)table.get(i);
if (record.text_of_word.compareTo(word) == 0)
return i;
}
return -1;
}
boolean Add(String word, int id)
{
if (word.compareTo("chara") == 0 || word.compareTo("charac") == 0 || word.compareTo("charact") == 0 || word.compareTo("characte") == 0 || word.compareTo("character") == 0)
word = "char";
if (Search(word) != -1)
return false;
if (id == 2)
try
{
float f = Float.parseFloat(word);
if (f - (int)f != 0)
id = 3;
}
catch(NumberFormatException ex)
{
return false;
}
table.add(new LexemRecord(word, id, null));
return true;
}
void Show()
{
String content = "";
for (Object lr : table)
{
content += ((LexemRecord)lr).text_of_word + "(" + ((LexemRecord)lr).type + ") ";
}
ti.put(0, content);
}
}
Также, в действиях для некоторых групп слов нужно добавить вызов функции добавления в таблицу. Например, для идентификаторов она выглядит следующим образом: indt.Add(Lexem.textOfWord.toString(), 1);
Добавление автоматически вызывает поиск, по итогам которого решается нужно ли добавлять
Проверка работоспособности лексического анализатора производится в, написанной на создаваемом языке, программе:
class User0
{
long t1;
User0()
{
t1 = 9000|
}
void Change()
{
t1 = 8000|
}
}
int IntReturn(long l1)
{
char c1 = 'x'|
chara c2 = '\t'|
?Комментарий
charac c3 = '\1'|
@ Это
?слож?ный?
комментарий
?@
charact c4 = '4'|
characte c5 = c2|
character c6 = '\hF3'|
bool b1 = 0b|
l1 = l1 - 200|
return 10|
}
void main()
{
long l1 = 10000|
int i9 = IntReturn(l1)|
int tu8 = i9 * i9|
i9 = i9 ^ 2|
real real6 = 1.44 / 0.6|
if (i9 == tu8 @||@ && real6 > 3)
i9 = real6 % 10|
else
tu8 = i9 + 100|
cycle(bool bool8 = 1b; bool8 != 0b || i9 >= 10; i9 = i9 - 11)
{
if (i9 <= 25) bool8 = !bool8|
}
User0 us0 = new User()|
us0.Change()|
select (us0.t1)
case(8000)
bool8 = 1b|
endcase|
case(9000)
bool8 = 0b|
endcase|
end|
delete us0|
}
Правильность заполнения таблиц можно посмотреть в конце таблицы трассировки (рис. 1)
Рис 1. Содержимое таблицы.
В скобках указывается тип записанного слова.
0 – ключевое слово
1 – идентификатор
2 – целое
3 – дробное
4 – символьная константа
В этой лабораторной работе пришлось пользоваться не только языком РВ, но и разбираться с Java, чтобы написать свой класс для правильной работы лексического анализатора. Наконец-то понадобилась часть «Данные лексического анализатора». Также была написана простенькая программа на создаваемом языке, для проверки правильности работы анализатора.
Построение графовой или табличной формы никак не влияет на то, что описывается в «Данные лексического анализатора».
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.