В качестве примера приводится пример разбора задания, описанного в приложении А.
Пример выполнения приведен в приложении А.
Цель создания программы SINAN состоит в том, чтобы научить студента проверять правильность грамматики программы с помощью синтаксических деревьев (деревьев грамматического разбора).
Программа SINAN сама производит разбор программы, строит синтаксическое дерево и проверяет введенные пользователем данные на корректность, сообщая обо всех найденных ошибках и несоответствиях.
Существует два пути анализа: восходящий и нисходящий, данный проект реализован с помощью нисходящего, он называется рекурсивный спуск. В проекте грамматический разбор реализован с помощью правил БНФ грамматики, заданных в таблице переходов.
В таблице переходов с помощью специальных кодов реализованы ссылки, переходы, обозначения терминальных символов, идентификаторов и литералов, см. таблицу 10. Нетерминальные символы представляют собой ссылки на конструкции, терминальные - указатели на код элемента соответствующей таблицы, идентификаторы и литералы представляют собой соответствующие обозначения. Для решения проблемы выбора одного из нескольких вариантов введен элемент ИЛИ, позволяющий реализовать все возможные варианты ветвления. Для реализации стека в каждой строке предусмотрена ячейка возврата, в которой указывается адрес, куда следует перейти после отработки соответствующей конструкции.
На основе данной таблицы производится анализ кодов лексем и создается новая формируемая таблица переходов, по которой в дальнейшем строится синтаксическое дерево.
Таблица переходов полностью основана на БНФ грамматике, показанной на рис. 4. Эта таблица предназначена для реализации синтаксического разбора с помощью метода рекурсивного спуска. С помощью нее можно определить законченность выражений, отследить грамматику учебного языка. Она служит основной базой при написании программы, хотя ее можно использовать и для построения формируемой таблицы переходов вручную.
На основе этой таблицы формируется другая (которую при необходимости легко можно преобразовать в дерево грамматического разбора), конечная таблица представляет собой программу, разобранную по грамматикам (на грамматики), представленную переходами (ссылками) и адресами таблиц и спецификаторов (№-в строк) на хранящиеся в них данные.
Работа с данной таблицей не оптимальна по скорости, т.к. при работе не используется стек, зато данное представление более наглядно.
Таблица 10 - Таблица переходов
1
2
3
4
5
6
7
8
9
<prog>
PROGRAM| 1,4
$1 |@1,4
<prog-name>
~2
VAR| 1,6
$2 | @1,6
<dec-list>
~3
BEGIN
$3
<stmt-list>
~7
END
$4
.
$30
+id
;
$27
<dec>
~4
<dec>|
~4 | @3,1
@3,4
<id-list>
~6
:
$31
<type>
~5
INTEGER| REAL | STRING
$5 | $6 | $7
<+id-list>
, |
$29| @6,1
@6,3
<stmt> |
~8 | @7,1
; |
$27| @7,1
@7,2
<stmt>
<assign>|<for>|<read>|<write>|<for>|<while>|<repeat>| <if>
~9 | ~15 | ~13 | ~14 | ~15 | ~24 | ~25 | ~21
<assign>
:=
$28
<exp>
~10
10
- | + |
$33 | $32 | @10,3
<term>
~11
+ | - |
$32| $33| @10,1
@10,4
11
<factor>
~12
* | DIV | / |
$34| $17 | $37|11,1
11,3
12
+id | ^int | ^real | ^string |@12,4
(
$35| @12,1
)
$36
13
<read>
READ
$19
$35
14
<write>
WRITE
$18
<VALUE>
~18
, | 14,9
$29| @14,9
@14,5
15
<for>
FOR
$8
<index-exp>
~16
DO
$10
<body>
~17
16
TO|DOWNTO
$9 | $20
17
<stmt>| 17,4
~8 | @17,4
$27| @17,1
18
<value>
<id-list>| <text-val>
~6 | ~19
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15