Автор работы: Пользователь скрыл имя, 28 Июня 2013 в 18:23, курсовая работа
Синтаксический анализ программ на различных языках программирования имеет очень большое значение. Он позволяет избежать множества ошибок в программах. Синтаксический анализ на базе регулярных выражений является наиболее простым на начальных стадиях проверки программы, когда не требуется глубокий разбор всех лексематических и синтаксических средства выбранного языка.
Введение
1.Системы программирования. Классификация и методы
Программирования.
1.1 Основные понятия и определения
1.2 Классификация языков программирования
1.3 Функциональные языки программирования
2. Синтаксический анализ.
2.1 Цель синтаксического анализа
2.2 Нисходящий синтаксический анализ.
2.3 Восходящий синтаксический анализ.
Список используемой литературы
______________________________
Входная строка Стек Продукция Сентенциальная форма SA | RA
______________________________
xxxyy
xxxyy
x
xxxyy
xx
xxxyy
xxx
xxxyy
xxX X -> x
xxXyy
xxxyy
xX X -> xX
xXyy
xxxyy
X X ->
xX
Xyy
xxxyy
Xy
xxxyy
Xyy
xxxyy
XyY Y -> y
XyY
xxxyy
XY Y -> yY
XY
xxxyy
S S ->
XY
S
Таблица. Алгоритм восходящего синтаксического анализа.
Вершина стека расположена
справа, а в последнем столбце
показан применяемый тип
посредством применения продукции.
В начальном состоянии
В приведенной выше таблице явно указывается в какой момент производится одна из операций (SA | RA), однако из этой таблицы однозначным образом не следует критерий выбора той или иной операции. Очевидно, что необходимым условием применения операции свертки является наличие правой части некоторой продукции на вершине стэка. Однако это условие не является достаточным для применения операции свертки.
в стеке появляется элемент x, совпадающий с правой частью
продукции X -> x, однако перехода к операции свертки и соответствующей замены x на X не происходит. Кроме того, вершина стека может содержать например правые части более чем одной продукции и соответственно возникает проблема выбора между разными операциями свертки. Говорят, что имеет место конфликт вида перенос /свертка (shift/reduce conflict), если в оказывается возможным в одно и то же время применение операции переноса и операции
свертки. Если возникает проблема выбора между разными операциями свертки, этот случай определяется как конфликт вида
свертка /свертка (reduce /reduce conflict). Для разрешения этих конфликтов применяются различные стратегии, основывающиеся на использовании информации о предшествующих этапах синтаксического анализа, а также информации, полученной путем предосмотра.
В приведенной выше таблице символом предосмотра, определяющим применение продукции X -> x , является символ y . Для применения продукции Y -> y в качестве символа предосмотра фигурирует символ обозначающий конец строки.
Грамматика, в которой все конфликты при восходящем синтаксическом анализе слева направо могут быть разрешены с использованием фиксированного объема информации, касающейся уже проведенного анализа, и конечного числа символов предосмотра, называется
LR(k) - грамматикой. Здесь буква L означает чтение слева ( Left ) направо, R - правые порождения ( Rightmost ) , k обозначает число символов предосмотра. Соответственно, LR(k) - языком называется
язык, который можно сгенерировать LR(k) - грамматикой.
Одним из способов решения
упомянутых выше конфликтов является
использование таблицы
грамматики со следующими продукциями:
1) E -> E+T , 2) E -> T , 3)T -> T * F ,4)T -> F , 5) F -> ( E ) , 6) F ->x .
В качестве примера синтаксического разбора используем
предложение x+x+x*x . Пример анализа иллюстрируется на приводимой ниже таблице.
______________________________
Входная строка Стек
Продукция Сентенциальная
_____________________________
x+x+x*x
x+x+x*x
x
x+x+x*x F F -> x F+x+x*x RA
x+x+x*x T T -> F T+x+x*x RA
x+x+x*x E E ->T E+x+x*x RA
x+x+x*x
E+
x+x+x*x
E+x
x+x+x*x E+F F- > x E+F+x*x RA
x+x+x*x E+T T-> F E+T+x*x RA
x+x+x*x E E -> E+T E+x*x RA
x+x+x*x
E+
x+x+x*x
E+x
x+x+x*x E+F F- > x E+F*x RA
x+x+x*x E+T T -> F E+T*x RA
x+x+x*x
E+T*
x+x+x*x
E+T*x
x+x+x*x E+T*F F -> x E+T*F RA
x+x+x*x E+T T -> T * F E+T RA
x+x+x*x
E
E -> E+T E
______________________________
_____________________________
E T F + * ( ) x ^
______________________________
1 S2
S5 S8
2
3
S4 S8
4
5
8
9 S10
S5 S8
10
11
12
______________________________
Таблица. Пример заполнения таблицы синтаксического анализа.
В таблице синтаксического
анализа каждому состоянию
1 ) Позиция переноса Sn обеспечивает выполнение операции переноса
и переход в состояние n.
2 ) Позиция свертки Rk обеспечивает выполнение операции свертки,
используя продукцию k.
Пустые позиции таблицы соответствуют синтаксическим ошибкам и для каждой такой позиции можно предусмотреть выдачу своего
индивидуального сообщения об ошибке.
На каждом этапе
синтаксического анализа
Если предположить
отсутствие ошибок, этот элемент
определяет операцию переноса
или свертки. В начале
анализатор находится в состоянии 1 , а входной символ - это первый символ анализируемого предложения.
Пусть позиция таблицы определяет операцию переноса, тогда:
- символ, соответствующий столбцу, в котором находится данная
позиция
таблицы, заносится в стек
- анализатор
переходит в состояние,
переноса, и это состояние заносится в стек состояний;
- если входной символ является терминалом, он принимается,
и входным символом становится следующий терминал
предложения.
Пусть позиция таблицы определяет операцию свертки, тогда:
- из стека символов удаляются m -символов, а из стека состояний
удаляются m состояний, где m - число символов в правой части
продукции, фигурирующей в свертке;
- анализатор
переходит в состояние,
состояний;
- входной символ становится символом в левой части продукции,
определенной в позиции свертки.
На начальном этапе имеем:
входная строка стек состояний стек символов сентенциальная
x+x+x*x
1
Состояние -1, входной символ -x , значение соответствующего элемента таблицы - S12; выполняется переход в состояние 12, в стек состояний заносится 12 , в стек символов заносится x:
входная строка стек состояний стек символов сентенциальная
x+x+x*x 1, 12 x x+x+x*x
Состояние -12, входной символ - +, значение соответствующего элемента таблицы - R6; выполняется свертка согласно продукции 6,
удаляется одно состояние из стека состояний и один символ из стека символов (так как в правой части продукции 6 имеется только один символ); входным символом становится F:
входная строка стек состояний стек символов сентенциальная
x+x+x*x
1
Состояние -1, входной символ - F, значение соответствующего элемента таблицы - S8; выполняется переход в состояние 8, в стек состояний заносится 8, в стек символов заносится F:
входная строка стек состояний стек символов сентенциальная
x+x+x*x
1, 8
Состояние -8, входной символ - +, значение соответствующего элемента таблицы - R4; выполняется свертка согласно продукции 4,
удаляется одно состояние из стека состояний и один символ из стека символов; входным символом становится T:
входная строка стек состояний стек символов сентенциальная
Информация о работе Синтаксический анализ в языках программирования