Разработка словесного описания лексики, синтаксиса и семантики языка, предназначенного для программирования потоковых вычислений, страница 6


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;

}

7. Поиск в таблицах идентификаторов / констант и пополнение таблиц.

7.1. Описание алгоритма.

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

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>&nbsp;Текст слова&nbsp;</td><td align=center>&nbsp;Номер слова в группе&nbsp;</td></tr>

<%Enumeration keys; Object key;%>

<%for (keys=Htid.keys(); keys.hasMoreElements();)