Главная страница
Навигация по странице:

  • Задача грамматического разбора. Метод нисходящего разбора

  • Курсовая Лексический анализатор. Краткий курс лекций. Курс лекций по спецкурсу Методы трансляции


    Скачать 0.64 Mb.
    НазваниеКурс лекций по спецкурсу Методы трансляции
    АнкорКурсовая Лексический анализатор
    Дата29.12.2019
    Размер0.64 Mb.
    Формат файлаdoc
    Имя файлаКраткий курс лекций.doc
    ТипКурс лекций
    #102547
    страница4 из 19
    1   2   3   4   5   6   7   8   9   ...   19
    Регулярные грамматики, диаграммы состояний


    Регулярные грамматики содержат правила вида U → t или U → Qt, где U, Q принадлежат VN – множеству нетерминальных символов, t принадлежит VT – множеству терминалов или t = λ – пустой цепочке.

    Пример регулярной грамматики:

    Z → P | F

    P → Pц | F. Грамматика описывает числовые

    F → Fц | Xц константы вида

    X → + | - | λ [+|-]целое[.[целое]]

    здесь ц – терминальный символ «цифра».

    В данном примере правила

    X → + | - | λ

    относятся к виду U → t,

    правила

    Z → P | F

    P → Pц | F.

    F → Fц | Xц

    к виду U → Qt.

    По регулярной грамматике может быть построена диаграмма состояний. Это ориентированный граф, в котором каждый нетерминал грамматики представлен узлом, или состоянием; кроме того добавляется узел для начального состояния – S. Каждому правилу Q → t сопоставляется дуга из S в Q, помеченная t. Каждому правилу Q → Rt сопоставляется дуга из R в Q, помеченная t. Диаграмма состояний для приведенного выше примера:



    При наличии в грамматике правила вида Q → R (Q → λ) в диаграмме состояний присутствует ветвь, помеченная λ. Такую диаграмму нужно преобразовать по правилам:

    1) если Q – заключительное состояние, то R также объявляется заключительным состоянием;

    2) исключается дуга, помеченная λ, и в добавление к каждой дуге, помеченной t и ведущей из Q к некоторому состоянию P, добавляется дуга из R к P, также помеченная t.



    Результат преобразования диаграммы состояний для грамматики числовых констант:



    По диаграмме состояний может быть выполнен грамматический разбор предложения, в ходе которого проверяется его соответствие правилам грамматики. Грамматический разбор некоторой строки X начинается с состояния S. Для очередного символа строки отыскивается дуга, помеченная этим символом, и выполняется переход в следующее состояние. При отсутствии дуги, X не является правильным предложением языка. По концу строки текущее состояние должно быть заключительным.

    Примеры грамматического разбора:

    Состояние

    Строка

    Состояние

    Строка

    Состояние

    Строка

    S

    -23.7

    S

    23..7

    S

    +

    X

    23.7

    F

    3..7

    X

    λ

    F

    3.7

    F

    ..7

    не заклю-




    F

    .7

    P

    .7

    чительное




    P

    7

    нет дуги




    состояние




    P

    λ

    - ошибка




    - ошибка




    В ходе реализации алгоритма грамматического разбора диаграмма представляется в виде матрицы состояний. Элемент матрицы:

    a[i][j]=k – номер состояния, в которое осуществляется переход из состояния i по терминалу j;

    a[i][j]=0, если дуги из состояния i по терминалу j нет.





    +

    -

    ц

    .

    S

    2

    2

    3

    0

    X

    0

    0

    3

    0

    F

    0

    0

    3

    4

    P

    0

    0

    4

    0
    Матрица переходов из состояния в состояние для грамматики, заданной в примере. Нумерация состояний: S – 1, X – 2, F – 3, P – 4. Нумерация терминалов: ‘+’ – 1, ‘-’ – 2, ‘ц’ – 3, ‘.’ – 4.

    Алгоритм разбора предложений в регулярных грамматиках:

    1. i = 1 – номер начального состояния;

    2. t = очередной_символ_предложения. Если предложение закончилось, то переход к пункту 5;

    3. j = номер_столбца_матрицы_A, соответствующего символу t. Если t не принадлежит VT, то фиксируется ошибка;

    4. i = a[i][j] – номер очередного состояния. Если i=0, то фиксируется ошибка. Иначе переход к пункту 2;

    5. если i не соответствует заключительному состоянию, то фиксируется ошибка. Иначе, конец разбора, предложение корректно.

    Одновременно с грамматическим разбором предложений может быть выполнен перевод содержащихся в них лексических единиц во внутримашинное представление. С этой целью должен быть разработан набор подпрограмм, вызываемых после распознавания очередного символа предложения.

    Номера вызываемых подпрограмм задаются матрицей B:





    +

    -

    ц

    .

    S

    0

    1

    2

    0

    X

    0

    0

    2

    0

    F

    0

    0

    2

    0

    P

    0

    0

    3

    0
    Элемент матрицы b[i][j] определяет номер подпрограммы, которую нужно вызвать в состоянии i при распознавании очередного терминала j.

    Вызов выполняется перед изменением состояния в п.4 алгоритма грамматического разбора.


    1. Задача грамматического разбора. Метод нисходящего разбора


    По завершению лексического анализа выполняется синтаксический и семантический анализ входной программы, переведенной во внутреннее представление. В некоторых трансляторах этот этап может быть отменен (трансляция завершена) при обнаружении уже в ходе лексического анализа очень серьезных ошибок в программе.

    Основной задачей блока синтаксического анализа в трансляторе является грамматический разбор исходной программы. Задача грамматического разбора заключается в том, чтобы для предложения построить дерево вывода, в вершине которого находится начальный символ грамматики, а в основании – терминальные символы входного предложения.

    Цель нисходящего грамматического разбора – найти вывод Za1...aN, где Z – начальный символ грамматики, а1...aN – входная строка. Алгоритм разбора:

    1) начальный символ грамматики заменяется по какому-либо правилу: Z→U1...UN;

    2) в дальнейшем, если U1 – терминал, то он сравнивается с первым символом входной строки и при совпадении исключается из входной строки и из строки элементов разложения Z. Если U1 – нетерминал, то он заменяется по какому-либо правилу, и процесс повторяется.

    Пример грамматики для выражений, составленных из идентификаторов (ид – терминальный символ) и знаков +, *:

    S → T | T+S

    T → ид | ид*T

    Разбор предложения a+b*c представлен ниже:

    a+b*c S S → T+S ║ Указаны остатки входной строки

    a+b*c T+S T → ид ║ и строки разложения начального

    a+b*c ид+S ║ символа грамматики - S, а также

    +b*c +S ║ правила, применяемые для разло-

    b*c S S → T ║ жения левого нетерминального

    b*c T T → ид*T ║ символа. На последнем шаге оба

    b*c ид*T ║ остатка пусты, что соответ-

    *c *T ║ ствует правильному разбору.

    c T T → ид ║

    c ид ║

    λ λ ║

    Так как разложение нетерминалов грамматики обычно может быть выполнено по нескольким правилам, необходимо осуществить полный перебор вариантов разложения:

    a+b*c S

    a+b*c T <──────────┴───────────> T+S

    a+b*c ид <───┴───> ид*T ид+S <────┴────> ид*T+S

    +b*c λ *T +S *T+S

    b*c ошибка ошибка S ошибка

    b*c T <──────────────────┴───> T+S

    b*c ид <───┴───> ид*T ид+S <────┴────> ид*T+S

    *c λ *T +S *T+S

    c ошибка ┌─────── T ошибка ┌──────── T+S

    c ид <───┴─────────> ид*T ид+S <────┴────> ид*T+S

    λ λ *T +S *T+S

    └───────┴──── правильный разбор
    Сократить перебор вариантов можно путем преобразования грамматики таким образом, чтобы правые части правил подстановки начинались с различных символов. Для этого правила вида

    X ap|aq (a – символ, p и q – строки)

    заменяются на правила

    X aY, Y p|q.

    S → TP Преобразованная таким способом

    P → λ | +S грамматика для выражений из

    T → идR идентификаторов и знаков +, *.

    R → λ | *T

    Нисходящий разбор предложения a+b*c для преобразованной грамматики:

    a+b*c S ║ b*c S ║ c TP

    a+b*c TP ║ b*c TP ║ c идRP

    a+b*c идRP ║ b*c идRP ║ λ RP

    +b*c RP ║ *c RP ║ λ P<─┴─>*TP

    +b*c P<─┴─>*TP ║ *c P<─┴─────>*TP ║ λ λ<─┴─>+S ошибка

    +b*c λ<─┴─>+S ошибка ║ *c λ<─┴──>+S ║ │ │ ошибка

    b*c ошибка S ║ c ошибка ошибка TP ║ └──┴─ прав. Разбор

    1. 1   2   3   4   5   6   7   8   9   ...   19


    написать администратору сайта