Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
бАКАЛАВР_РАБОТА.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.13 Mб
Скачать

4.3.2 Грамматика с семантическими правилами

Построение узлов синтаксического дерева реализовано с помощью синтаксически управляемой схемы трансляции (СУТ) с действиями.

Синтаксически управляемая схема трансляции представляет собой контекстно-свободную грамматику с программными фрагментами, внедрёнными в тела продукций. Эти фрагменты называются семантическими действиями и могут находиться в любой позиции в теле продукции.По соглашению действия располагаются внутри фигурных скобок.

Ниже приведена грамматика из раздела 4.2 с добавлением семантических действий в виде нетерминалов.

  1. program → declsDefins {make_seq_decl} classicPart {make_seq_cl_p} hybridPart {make_seq_hyb_p, make_program}

    1. declsDefins → declDefins1 declsDefins

    2. declsDefins → ε

    3. выбориз 2.1 или 2.2 (предосмотр 2)

    1. declsDefins1 → MACRO ID{make_id} param = expr ; {make_decl_macro}

    2. declsDefins1→ CONST ID{make_id} = sign ; {make_decl_const}

    3. declsDefins1 → ARRAY ID{make_id} [NUM {make_const_int} ] ; {make_decl_array}

    4. declsDefins1 → COUNT ID{make_id} = [ list_inter {make_list_inter}]; {make_decl_count}

    5. declsDefins1 → ID {make_id} index = sign ; {make_set_global}

  1. list_inter → interval list_inter1

    1. list_inter1 → , interval list_inter1

    2. list_inter1 → ε

  1. interval → NUM {make_const_int} - NUM{make_const_int, make_interval}

    1. param → [ ID {make_id} ]

    2. param → ε

    1. sign → - sign {make_unary_minus}

    2. sign → literal

    1. index → [ expr_i ] {make_access}

    2. index → ε

    1. classicPart → classicPart1 classicPart

    2. classicPart → ε

    3. выбориз 10.1 или 10.2 (предосмотр2)

    1. classicPart1 → equation

    2. classicPart1 → condition

  1. condition → IF ( Bool ) THEN localValues {make_seq_loc_v} ENDIF ; {make_if}

  2. equation → ID {make_id} der {make_der} index = expr ; {make_equation}

  3. localValues → localValue localValues1

    1. localValues1 → localValue localValues1

    2. localValues1 → ε

  1. localValue → ID {make_id} index = expr ; {make_set_local}

    1. der → '

    2. der → ~

  1. Bool → join Bool1

    1. Bool1 → ORjoin {make_or} Bool1

    2. Bool1 → ε

  1. join → equality join1

    1. join1 → AND equality {make_and} join1

    2. join1 → ε

  1. equality → rel equality1

    1. equality1 → EQ rel {make_eq}

    2. equality1 → NE rel {make_ne}

    3. equality1 → ε

  1. rel → expr rel1

    1. rel1 → < expr { make_less }

    2. rel1 → > expr {make_gr}

    3. rel1 → LE expr {make_le}

    4. rel1 → GE expr {make_ge}

    5. rel1 → ε

  1. expr → term expr1

    1. expr1 → - term {make_sub} expr1

    2. expr1 → + term {make_sum} expr1

    3. expr1 → ε

  1. term → unary term1

    1. term1 → / unary {make_div} term1

    2. term1 → * unary {make_mul} term1

    3. term1 → ε

    1. unary → factor

    2. unary → - unary {make_unary_minus}

    3. unary → NOT unary {make_unary_not}

    1. factor → ( Bool )

    2. factor → ID {make_id} spec

    3. factor → REAL {make_const_float}

    4. factor → NUM {make_const_int}

    1. spec → index

    2. spec → ( {make_start_list} list_expr ) {make_list_arg, make_func}

  1. list_expr → expr list_expr1

    1. list_expr1 → , expr list_expr1

    2. list_expr1 → ε

    1. hybridPart → localState hybridPart

    2. hybridPart → ε

  1. localState → ver IS body {make_seq_eq_locval} FROM list_ver {make_list_vers} ; {make_loc_state}

  2. ver → ID {make_id} cond

    1. cond → [ Bool ] {make_ver_cond}

    2. cond → ε {make_ver}

    1. body → body1 body

    2. body → ε

    1. body1 → equation

    2. body1 → localValue

    3. выбориз 40.1 или 40.2 (предосмотр2)

    1. list_ver → ver list_ver1

    2. list_ver → ε

    1. list_ver1 → , ver list_ver1

    2. list_ver1 → ε

    1. literal → NUM {make_const_int}

    2. literal → REAL {make_const_float}

  1. expr_i → term_i expr1_i

    1. expr1_i → + term_i {make_sum} expr1_i

    2. expr1_i → - term_i {make_sub} expr1_i

    3. expr1_i → ε

  1. term_i → unary_i term1_i

    1. term1_i → / unary_i term1_i

    2. term1_i → * unary_1 term1_i

    3. term1_i → ε

    1. unary_i → factor_i

    2. unary_i → - unary_i {make_unary_minus}

    1. factor_i → ( expr_i)

    2. factor_i → ID {make_id}

    3. factor_i → NUM {make_const_int}

Втаблице 4.3расшифрованкаждыйизнетерминалов,представляющихсемантическоедействие.

Таблица 4.3 – Семантические действия языка LISMA+

Нетерминал (Семантический маркер)

Описание семантического действия

make_program

Создание узла программы - Program

make_decl_const

Создание узла декларации константы - DeclConst

make_decl_array

Создание узла декларации массива - DeclArray

make_decl_count

Создание узла декларации счётчика - DeclCount

make_decl_macro

Создание узла декларации макроса - DeclMacro

make_seq_cl_p

Создание узла спискаузлов операторов Seq из “классической части” программы

make_seq_hyb_p

Создание узла списка узлов операторов Seq из “гибридной части” программы

make_seq_decl

Создание узла списка узлов операторов Seq из “части объявлений” программы

make_seq_loc_v

Создание узла Seq– списка узлов операторов задания ЛНУ в условном операторе

make_seq_eq_locval

Создание узла Seq– списка узлов операторов задания ЛНУ и уравнений

make_set_global

СозданиеузлазаданияГНУSetGloabalилиSetGlobalIndex

make_equation

Создание узла уравненияEquationилиEquationIndex

make_set_local

Создание узла задания ЛНУSetLocalилиSetLocalIndex

make_if

Создание узла условного оператораIf

make_loc_state

Создание узла локального состоянияLocalState

make_list_inter

Создание узла ListExpr- списка интервалов счётчика

make_list_arg

Создание узла ListExpr- списка аргументов функции

make_list_vers

Создание узла ListExpr- списка условно-адресных пар

make_interval

Создание узла интервала изменения счётчикаInterval

make_access

Создание узла операции индексацииAccess

make_func

Создание узла операции вызова функцииFunc

make_unary_minus

Создание узла операции унарный минусUnaryMinus

make_unary_not

Создание узла операции логическое отрицаниеUnaryNot

make_const_int

Создание узла целочисленной константыConstantInt

make_const_float

Создание узла вещественной константыConstantFloat

make_id

Создание узла идентификатора Id

make_or

Создание узла операции логического “или”Or

make_and

Создание узла операции логического “и”And

make_eq

Создание узла операции “==” Eq

make_ne

Созданиеузлаоперации“!=” Ne

make_less

Созданиеузлаоперации“<” Less

make_gr

Созданиеузлаоперации“>” Gr

make_le

Созданиеузлаоперации“<=” Le

make_ge

Созданиеузлаоперации“>=” Ge

make_sub

СозданиеузлаоперациивычитанияMinusExp

make_sum

Созданиеузлаоперации суммированияPlusExp

make_div

Созданиеузлаоперации деленияDivExp

make_mul

Созданиеузлаоперации умноженияMulExp

make_ver

Созданиеузлаусловно-адресной парыVer