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

  • IV. Синтаксически управляемый перевод

  • V. ПОЛИЗ, перевод в ПОЛИЗ

  • Учебное пособие для студентов II курса (издание третье, переработанное и дополненное) Москва 2009 удк 519. 682. 1


    Скачать 2.2 Mb.
    НазваниеУчебное пособие для студентов II курса (издание третье, переработанное и дополненное) Москва 2009 удк 519. 682. 1
    Анкорformal.grammars.and.languages.2009.pdf
    Дата18.03.2019
    Размер2.2 Mb.
    Формат файлаpdf
    Имя файлаformal.grammars.and.languages.2009.pdf
    ТипУчебное пособие
    #26014
    страница14 из 15
    1   ...   7   8   9   10   11   12   13   14   15
    if (A

    5) ERROR(
    )


    L

    a

    A

    A

    1

    | b

    B

    B

    1; if (B

    2) ERROR(
    )

    |
    c

    if (B
    
    1) ERROR(
    )

    Какой язык описывает эта грамматика?
    (см. замечание к задаче 4)
    11. Дана грамматика:
    S

    E

    E

    (
    ) | (E {, E}) | A
    A

    a | b
    Вставить в заданную грамматику действия, контролирующие соблюдение следующих усло- вий:

    уровень вложенности скобок не больше четырех;

    на каждом уровне вложенности происходит чередование скобочных и бесскобочных элементов.
    12. Включить в правила вывода действия, проверяющие выполнение следующих кон- текстных условий: a) Пусть в языке L есть переменные и константы целого, вещественного и логического ти- пов, а также есть оператор цикла
    S

    for I

    E step E to E do S
    Включить в это правило вывода действия, проверяющие выполнение следующих ограниче- ний:

    тип I и всех вхождений Е должен быть одинаковым;

    переменная логического типа недопустима в качестве параметра цикла.
    Для каждой используемой процедуры привести ее текст на Си
    
    b)
    Дан фрагмент грамматики
    P

    program D; begin S {; S } end
    D

    ... | label L{,L} |...
    S

    L { , L } : S′ | S′
    S′

    ...| goto L |...
    L

    I где I — идентификатор.
    Вставить в грамматику действия, контролирующие выполнение следующих условий:

    каждая метка, используемая в программе, должна быть описана и только один раз;

    не должно быть одинаковых меток у различных операторов;

    если метка используется в операторе goto, то обязательно должен быть оператор, по- меченный такой меткой.
    Для каждой используемой процедуры привести ее текст на Си
    

    Задачи
    /
    IV. Синтаксически управляемый перевод
    108
    IV. Синтаксически управляемый перевод
    1. Построить грамматику арифметического выражения, использующего операции

    ,

    ,

    ,

    и круглые скобки (приоритет операций стандартный), простые аргументы операций — пере- менные a и b, например: a

    (b

    a)

    b

    a

    b. Предполагая, что анализ грамматики будет про- изводиться РС-методом, вставить в нее действия вида cout << ′
    символ
    ′ по переводу таких выражений в ПОЛИЗ.
    2. Дана грамматика языка L
    1
    , в которую вставлены действия по переводу цепочек языка L
    1
    в цепочки языка L
    2
    . Определить языки L
    1
    и L
    2
    a)
    S

    a

    a

    1; b

    0;

    A

    A

    a

    if ( a ) { cout << ′a′; a

    0; } else a
    
    ;

    A |
    bA

    if ( b ) { cout << ′b′; b

    0; } else b
    
    ;

    | ε b)
    S


    a

    0;

    E


    cout << ′


    ;

    E

    a

    a

    1;

    E

    cout << ′a
    ;

    |
    b

    if (a
    
    0) cout << ′b′;

    E

    cout << ′b
    ;

    | ε
    3. Построить грамматику для языка L
    1
    . Вставить в нее действия по генерации цепочек языка
    L
    2 в процессе анализа методом рекурсивного спуска. Соответствие между цепочками за- дается формальным переводом

    . В качестве действий можно использовать только опера- торы вида cout << ′
    символ
    ′. a)
    L
    1

    { a
    n
    c
    m
    b
    n
    | n

    0, m

    1}, L
    2

    { 0
    i
    1
    k
    | i

    0, k

    i },


    { ( a
    n
    c
    m
    b
    n
    , 0
    n
    1
    n

    m
    ) | n

    0, m

    1 }; b)
    L
    1

    {

    c
    n
    |

    ∈ {a,
    b}
    *
    , n

    1}, L
    2

    { a
    n
    c
    m
    | n

    1, m

    0 },


    { (

    c
    n
    , a
    n
    c
    m
    ) |

    ∈ {a,
    b}
    *
    , n

    1, m
    
    a
    (т.е. m — количество символов а в цепочке

    )
    }; c)
    L
    1

    {a, b}

    , L
    2

    { 1
    i
    0
    j
    | i

    1, j

    0; i

    j },


    { (

    , 1
    n

    m
    0
    n
    ) |

    ∈ {a,b}

    , n
    
    a
    , m
    
    b
    }; d)
    L
    1

    {a,
    b}

    , L
    2

    { 2
    n

    | n

    0,

    ∈ {a,
    b}

    },


    { (

    , 2
    n

    R
    ) |

    ∈ {a,b}

    , n
    
    a
    (здесь

    R
    — реверс цепочки

    )
    }; e)
    L
    1

    {1
    n
    0
    m
    1
    m
    0
    n
    | m,
    n

    0}, L
    2

    {1
    i
    0
    k
    | k

    i

    0},


    { ( 1
    n
    0
    m
    1
    m
    0
    n
    , 1
    m
    0
    n

    m
    ) | m, n
    
    0 }; f
    )
    L
    1

    {

    1

    2


    n

    | n

    1,

    i

    {ab, ba} для 1

    i

    n }, L
    2

    {


    |

    ∈ {a,
    b}

    },


    { (

    1

    2


    n

    ,

    1

    2


    n

    ) | n

    1; для 1

    i

    n

    i

    {ab, ba},

    i

    b, если

    i

    ab,

    i

    a, если

    i

    ba };

    Задачи
    /
    V. ПОЛИЗ, перевод в ПОЛИЗ
    109 4. Построить грамматику для языка L
    1
    . Вставить в нее действия по генерации цепочек языка
    L
    2 в процессе анализа методом рекурсивного спуска. Соответствие между цепочками за- дается формальным переводом

    . В качестве действий можно использовать любые опера- торы. a)
    L
    1

    { 1
    m
    0
    n
    | n, m

    0}, L
    2

    { 1
    k
    | k

    0}

    { 0
    i
    | i

    0}

    {

    },


    { ( 1
    m
    0
    n
    , 1
    m

    n
    ) | m

    n

    0 }

    { ( 1
    m
    0
    n
    , 0
    n

    m
    ) | n

    m

    0 }

    {( 1
    m
    0
    n
    ,

    ) | m

    n}; b)
    L
    1

    {

    i
    | i

    0,

    i

    (i)
    2
    (т.е.

    i
    — это двоичное представление числа i


    без незначащих ведущих нулей)
    },
    L
    2

    {(

    i
    )
    R
    | i

    1,

    i

    (i)
    2
    (

    R
    — обращение цепочки

    )
    },


    { (

    i
    , (

    i

    1
    )
    R
    ) | i

    0,

    i

    (i)
    2
    ,

    i

    1

    (i

    1)
    2
    } ;
    c)
    L
    1

    {


    |


    {a,
    b}

    }, L
    2

    { b
    n


    | n

    0,


    {a,
    b}

    },


    { (


    , b
    n

    R

    ) |

    ∈ {a,
    b}
    *
    , n
    
    a
    ( n — количество символов а в цепочке

    ,

    R
    — реверс цепочки

    )
    }; d)
    L
    1

    {


    |


    {a,
    b}

    }, L
    2

    { a
    i
    b
    k
    | i, k

    0, i

    k

    0 },


    { (


    , a
    [
    n
    /2]
    b
    [
    m
    /2]
    ) |

    ∈ {a,
    b}

    , n
    
    a
    ,
    m
    
    b
    ( здесь [x] — ближайшее к x це- лое, например: [1/2] = 1, [1/3] = 0, [5/3] = 2)
    };
    e)
    L
    1

    {


    |


    {a,
    b}

    }, L
    2

    { a
    i
    b
    k
    | i, k

    0, i

    k

    0 },


    { (


    , a
    [(
    n+
    1)/3]
    b
    [ |
    m-n
    |
    /2]
    ) |

    ∈ {a,
    b}

    , n
    
    a
    ,
    m
    
    b
    };
    f )
    L
    1

    {


    |
    
    {0,1}

    ,


    (i)
    2
    R
    , i

    0
    (т. е.

    — реверс двоичной записи числа i )
    },
    L
    2

    { |
    n
    | n

    0 },


    { (


    , |
    i
    ) |
    
    {0,1}

    ,


    (i)
    2
    R
    , i

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

    ,

    ,

    ,

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

    b


    (a,
    b),
    a

    b

    c


    (a,

    (b,
    c)).
    V. ПОЛИЗ, перевод в ПОЛИЗ
    1. Представить в ПОЛИЗе следующие выражения: а) a

    b

    c b) a

    b

    c/a c) a/(b

    c)

    a d) (a

    b)/(c

    a

    b)

    Задачи
    /
    V. ПОЛИЗ, перевод в ПОЛИЗ
    110 e) a and b or c f ) not a or b and a g) x

    y

    x/y h) (x

    x

    y

    y

    1) and (x

    0)
    2. Для следующих выражений в ПОЛИЗе дать обычную инфиксную запись: а
    ) ab

    c

    b) abc

    / c) ab

    c

    d) ab

    bc

    /a

    e) a not b and not f) abca and or and g
    ) 2x

    2x
    
    3. Используя стек, вычислить следующие выражения в ПОЛИЗе: а)
    x y

    x y /

    при x

    8, y

    2; b)
    a 2

    b / b 4
    
    при a

    4, b

    3; c)
    a b not and a or not при a

    b

    true; d)
    x y

    0

    y 2 x


    and при x

    y

    1.
    4. Перевести в ПОЛИЗ фрагмент программы на Си: a)
    S

    0; i

    1; while
    ( i

    10) { S

    S

    (i

    i); i


    ; } b)
    if ( (x

    1)

    (2

    y) ) x

    y
    ; else y

    (x

    y)

    2; c)
    i

    1; S

    0; while ( i

    10 && S

    40 ) { S

    S

    f(i);


    i; } d)
    if (z

    x

    y

    5) a

    x

    y, z

    (x

    6)/(a

    y); else z

    y
    
    2; e)
    a

    x

    y

    z

    (t

    x) ?

    (a

    b)/(c

    d)

    2 :
    
    x

    5; f)
    S

    x

    y; i

    1; for (j

    0; j

    n; j
    
    ) { S

    S

    i

    j

    S; i

    i

    x; } g)
    i

    1; S

    0; while ( i

    10 && S

    40 ) { S

    S

    f(i);
    
    i; } h)
    if (z

    x

    y

    5) a

    x

    y, z

    (x

    6)/(a

    y); else z

    y
    
    2; i)
    do {x

    y; y

    2

    y;} while (x

    k); j)
    S

    0; for (i

    1; i
    
    k; i

    i

    1) S


    i

    i; k)
    switch (k) {
    case 1: a

    ! a; break;
    case 2: b

    a || ! b;
    case 3: a

    b ;
    }
    Замечание
    ПОЛИЗ управляющих операторов языка Си составляется аналогично ПОЛИЗу операторов М- языка и Паскаля. При переводе в ПОЛИЗ сложных операторов порядок внутренних конструк- ций (операторов и выражений) относительно друг друга сохраняется. Например, в ПОЛИЗе для оператора цикла вида for (expr1; expr2; expr3) {body} ПОЛИЗ expr3 должен предшествовать
    ПОЛИЗу body.
    В языке Си присваивание является операцией, а не оператором, поэтому при интерпретации
    ПОЛИЗа присвоенное значение сохраняется в стеке (как результат операции). Чтобы удалить ненужное значение с вершины стека (такие значения остаются в стеке, например, после испол- нения оператора-выражения), в ПОЛИЗе языка Си используется операция "

    ".

    Задачи
    /
    V. ПОЛИЗ, перевод в ПОЛИЗ
    111
    Чтобы отличить префиксные операции
    
    и
    
    от постфиксных, префиксные обозначают в
    ПОЛИЗе как +# и –#, а постфиксные как

    + и #– соответственно.
    ПОЛИЗ вызова функции представляет собой последовательность ее аргументов в ПОЛИЗе, за которыми следует имя функции. Для функций с переменным числом параметров перед именем функции в ПОЛИЗ вставляется дополнительный аргумент — количество фактических парамет- ров в данном вызове функции. При интерпретации сначала из стека извлекается этот дополни- тельный аргумент, а затем — соответствующее ему число фактических параметров.
    5. По заданному ПОЛИЗу выражения записать его в инфиксной форме (на Си). a) x y z a x 5 y /


    z 6

    8





    ; b)
    x a x z y /


    z 6 a



    
    6. Является ли запись
    ПОЛИЗ
    1 2
    3 4
    5 6
    7 8
    9 10 11 12 13 14 15 16 17
    y
    15
    =
    ;
    x
    x
    a
    b
    c
    2
    /
    1
    +
    *
    -
    *
    a
    18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
    -
    =
    ;
    y
    y
    2
    -
    =
    ;
    y
    10
    <=
    5 !F правильной записью в ПОЛИЗе следующего фрагмента программы на Си (считаем, что эле- менты ПОЛИЗа нумеруются с 1): y

    15;
    1   ...   7   8   9   10   11   12   13   14   15


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