Изучение способов расширения лексических акцепторов до функциональности лексических анализаторов, структуры информационных таблиц трансляторов, методов организации поиска в таблицах и пополнения таблиц

Страницы работы

Содержание работы

Министерство образования и науки Российской Федерации

Федеральное агентство по образованию

Государственное образовательное учреждение

высшего профессионального образования

Новосибирский государственный технический университет

Кафедра ВТ

NSTU1

Лабораторная работа №3

по дисциплине «Системное программное обеспечение»

«Лексика языков программирования. Расширение функциональности лексического акцептора»

Вариант: 1121414

Группа:  АМ-709

Студент:

Максименко Д.С.

Преподаватель:

Малявко А.А.

Новосибирск, 2010


1. Цели работы.

Цели работы: изучение способов расширения лексических акцепторов до функциональности лексических анализаторов, структуры информационных таблиц трансляторов, методов организации поиска в таблицах и пополнения таблиц, алгоритмов преобразования цепочек символов (слов) в их внутренние эквиваленты – лексемы.

2. Ход работы.

Для правильной работы лексического анализатора понадобилось добавить свой класс, реализующий таблицу идентификаторов, констант и ключевых слов. Каждая запись в таблице – это текст слова, тип (целое, дробное и т.д.) и список атрибутов.

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 – символьная константа

3. Выводы.

В этой лабораторной работе пришлось пользоваться не только языком РВ, но и разбираться с Java, чтобы написать свой класс для правильной работы лексического анализатора. Наконец-то понадобилась часть «Данные лексического анализатора». Также была написана простенькая программа на создаваемом языке, для проверки правильности работы анализатора.

Построение графовой или табличной формы никак не влияет на то, что описывается в «Данные лексического анализатора».

Похожие материалы

Информация о работе