1 / 41

Трансляция арифметических выражений

Трансляция арифметических выражений. Тройка E C = E L  E R , где E C – результат, E L , E R – левый и правый операнды,  – операция. Пример : d = a + b * c должна быть построена последовательность троек: T 1 = b * c , d = a + T 1. Метод Рутисхаузера.

Download Presentation

Трансляция арифметических выражений

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Трансляция арифметических выражений Тройка EC= ELER, где EC– результат, EL, ER– левый и правый операнды, – операция. Пример: d= a+b*c должна быть построена последовательность троек: T1 = b*c, d = a+T1

  2. Метод Рутисхаузера 0. Записать в полной скобочной форме: d = a+b*c d= a+(b*c) 1. Сопоставить индексы: N[0]:=0 J:=1 Цикл-покаS[J]’_’ ЕслиS[J] = (или S[J] = <операнд> то N[J]:=N[J-1] +1 иначе N[J]:=N[J-1] -1 Все-если J:=J+1 Все-цикл N[J]:=0 2. Определить max индексаk(k-1)kи построить тройку. 3. Удалить обработанные символы из выражения, результату сопоставить индекс N=k-1

  3. Пример использования метода Рутисхаузера Пример. (((a+b)*c)+d)/k a) S: ( ( ( a + b ) * c ) + d ) / k N: 0 1 2 3 4 3 4 3 2 3 21 2 1 0 1 0 b) S: ( ( T1 * c ) + d ) / k N: 0 1 2 3 2 3 21 2 1 0 1 0 c) S: ( T2 + d ) / k N: 0 1 21 2 1 0 1 0 d) S: T3 / k N: 0 1 0 1 0 => T1 = a+b => T2 = T1*c => T3 = T2+d => T4 = T3/k

  4. Классификация компилирующих программ Транслятор – программа, которая переводит програм-му, написанную на одном языке, в эквивалентную ей программу, написанную на другом языке. Компилятор – транслятор с языка высокого уровня на машинный язык или язык ассемблера. Ассемблер – транслятор с языка Ассемблера на ма-шинный язык. Интерпретатор – программа, которая принимает ис-ходную программу и выполняет ее, не создавая про-граммы на другом языке. Макрогенератор (для компиляторов – препроцессор) – программа, которая обрабатывает исходную про-грамму, как текст, и выполняет в нем замены ука-занных символов на подстроки. Макрогенератор обрабатывает программу до трансляции.

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

  6. Структура процесса компиляции Лексический анализ Синтаксический анализ Семантический анализ Распределение памяти Генерация и оптимизация объектного кода

  7. Лексический анализ Лексемы Терминальные слова Базовые понятия Пример.if Sum>5 then pr:= true;

  8. Синтаксический анализ Таблица токенов Логическое выражение Условный оператор Оператор

  9. Формальный язык Алфавит – непустое конечное множество символов, используе-мых для записи предложений языка. Пример: A = {0,1,2,3,4,5,6,7,8,9,+,-} Строка – любая последовательность символов алфавита, распо-ложенных один за другим. A* - множество строк, включая пустую, составленных из А. A+ - множество строк за исключением пустой, составленных из А. A* = A+ e Формальным языком L в алфавите A называют произвольное подмножество множества A*. Язык можно задать перечислением и правилами продукции.

  10. Формальная грамматика G = (VT, VN, P, S), где VT – алфавит языка или множество терминальных (незаменяемых) символов; VN – множество нетерминальных (заменяемых) симво-лов – вспомогательный алфавит, символы которого обозначают допустимые понятия языка, VTVN =; V = VTVN – словарь грамматики; P– множество порождающих правил – каждое правило состоит из пары строк (α, β), где α V+ – левая часть правила, β V* – правая часть правила: α  β, где строка α должна содержать хотя бы один нетерми-нал; SVN – начальный символ – аксиома грамматики.

  11. Грамматика записи десятичных чисел G0 VT = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, +, -}; VN = {<целое>, <целое без знака>, <цифра>, <знак>}; P = {<целое>  <знак><целое без знака>, <целое>  <целое без знака>, <целое без знака>  <цифра><целое без знака>, <целое без знака>  <цифра>, <цифра>  0, <цифра>  1, <цифра>  2, <цифра>  3, <цифра>  4, <цифра>  5, <цифра>  6, <цифра>  7, <цифра>  8, <цифра>  9, <знак>  +, <знак>  - }; S = <целое>. Правосторонняя рекурсия

  12. Форма Бэкуса-Наура (БНФ) Условные обозначения: <Имя> – нетерминальный символ – конструкция; Имя – терминальный символ – символ алфавита; ::= –«можно заменить на»; | –«или» Пример: <целое> ::= <знак><целое без знака>|<целое без знака> <целое без знака> ::= <цифра><целое без знака>|<цифра> <цифра > ::= 0|1|2|3|4|5|6|7|8|9 <знак> ::= +| -

  13. Грамматический разбор Вывод представляет собой последовательность подстановок. Пример. Вывод строки «-45»: <целое> 1 1<знак><целое без знака> 2 2 <знак><цифра><целое без знака>3 3 <знак><цифра><цифра> 4 4 - <цифра><цифра> 5 5 - 4<цифра> 6 6- 45 целое знак цбз Грамматический разбор - цифра цбз 4 цифра Восходящий разбор Нисходящий разбор 5

  14. Левосторонний восходящий грамматический разбор Пример. Разобрать строку «-45» Правила грамматики: <целое> ::= <знак><целое без знака>|<целое без знака>, <целое без знака> ::= <целое без знака><цифра>|<цифра>, <цифра > ::= 0|1|2|3|4|5|6|7|8|9, <знак> ::= +| - . Последовательность получения сентенциальных форм данным методом: <знак> 45 <знак> <цифра>5 <знак> <цбз>5 <целое> 5 <знак><целое> 5 <знак> <цбз><цифра> <целое> <цифра> <знак> <целое> <цифра> <знак> <цбз> <целое> Тупик! Тупик! Тупик! Тупик!

  15. Левосторонний нисходящий грамматический разбор Пример. Разобрать строку «-45» Правила грамматики: а) <целое> ::= <знак><целое без знака>|<целое без знака> б) <целое без знака> ::= <цифра><целое без знака>|<цифра>, в) <цифра > ::= 0|1|2|3|4|5|6|7|8|9, г) <знак> ::= +| - .

  16. Левосторонний нисходящий грамматический разбор Да Да Нет Нет Да

  17. Классификация грамматик Хомского Тип 0–грамматики фразовой структуры или грамматики «без ограничений»: α  β, где α V+, β V*– в таких грамматиках допустимо наличие любых правил вывода, что свойственно грамматикам естественных языков; Тип 1 – контекстно-зависимые (неукорачивающие) грамматики: α β, где α V+, β V*, | α |  | β | – в этих грамматиках для правил вида α Xβ  α xβ возможность подстановки строки х вместо символа Xопределяется присутствием подстрок α и β, т. е. контекста, что также свойственно грамматикам естественных языков; Тип 2 – контекстно-свободные грамматики: A β, где AVN, βV* – поскольку в левой части правила стоит нетерминал, подстановки не зависят от контекста; Тип 3 – регулярная грамматика: Aα, A αB,гдеA,ВVN, α VT;

  18. Конечный автомат M = (Q, , δ, q0, F), где Q – конечное множество состояний;  – конечное множество входных символов; δ(qi,сk) – функция переходов (qi – текущее состояние, сk– очередной символ); q0 – начальное состояние; F = {qj} – подмножество допускающих состояний. Пример. Автомат «Чет-нечет»: Q = {Чет, Нечет};  = {0, 1}; δ(Чет, 0) = Чет, δ(Нечет, 0) = Нечет, δ(Чет, 1) = Нечет, δ(Нечет, 1) = Чет; q0 = Чет; F = {Чет} Таблица переходов Синтаксическая диаграмма Граф переходов 0 1 Чет Нечет 1 1 0 0 0 1

  19. Реализация конечного автомата Ind := 1 q := q0 Цикл-пока q  «Ошибка» и q «Конец» q = Table [q, S[Ind]] Ind := Ind +1 Все-цикл Если q = «Конец» то «Строка принята» иначе «Строка отвергнута» Все-если

  20. Лексические анализаторы Пример. Распознаватель целых чисел. A0: Инициализация: Целое := 0; Знак_числа := «+». А1: Знак_числа := Знак А2: Целое := Целое*10 + Цифра А3: Если Знак_числа = «-» то Целое := -Целое Все-если

  21. Распознаватель целых чисел Д1: «Строка не является десятичным числом»; Д2: «Два знака рядом»; Д3: «В строке отсутствуют цифры», Д4: «В строке встречаются недопустимые символы» Ind := 1 q := 1 ВыполнитьА0 Цикл-пока q «Е» и q«К» Если S[Ind] = «+» илиS[Ind] = «-», то j := 1 иначе Если S[Ind]  «0»иS[Ind]  «9», то j := 2, иначеj := 3 Все-если Все-если ВыполнитьAi := Table [q, j]. A() q := Table [q, j] Ind := Ind +1 Все-цикл Если q = «К» то ВыполнитьА3 Вывести «Это число» иначе Вывести сообщение Di Все-если

  22. Синтаксические анализаторы Пример. Синтаксический анализатор списка описания целых скаляров, массивов и функций, например: int xaf, y22[5], zrr[2][4], re[N], fun(), *g; int V,V[N],V[N][N],V[N],V(),*V Обозначения: V – идентификатор; N – целочисленная константа; служебные символы: «[ ] ( ) , ; *». VN * ( ) [ ] , ; Другие 1 3 E 2 EEEEEEE 2 3 EEEEEEEEE 3 EEE 4 E 6 E 1 К E 4 EEEE 5 EEEEE 5 EEEEEEE 1 К E 6 E 7 EEEEEEEE 7 EEEEEE 8 EEE 8 EEEEE 6 E 1 К E

  23. Алгоритм распознавателя Ind := 1 q := 1 Цикл-пока q «Е» и q«К» q := Table [q, Pos(S[Ind], «VN*()[];»)] Ind := Ind +1 Все-цикл Если q = «К» то ВыполнитьА3 Вывести сообщение «Это число» иначе Вывести сообщение Дi Все-если

  24. Автомат с магазинной памятью PM= (Q, , Г, , q0, z0, F), где Q– конечное множество состояний автомата;  – конечный входной алфавит; Г – конечное множество магазинных символов;  (q, ck, zj) – функция переходов; q0Q – начальное состояние автомата; z0 Г – символ, находящийся в магазине в начальный момент, F Q – множество заключительных (допускающих) состояний. Пример. Синтаксический анализатор выражений.  = {<Ид>, +, –, *, /, (, ), ◄, ►}.

  25. Синтаксические диаграммы выражения A * (B + C) + (D + F) / (A + B) - C * D

  26. Объединенная синтаксическая диаграмма

  27. Таблица переходов автомата

  28. Алгоритм распознавателя q:=1 Ind := 1 Mag := Цикл-пока q «E» и q «К» q := Table [q, String[Ind]].q Еслиq =  тоMagTable [q, String[Ind]].S q := X иначе Если q =  то Magq иначеInd := Ind +1 Все-если Все-если Если q = «К» то «Строка принята» иначе «Строка отвергнута» Все-если

  29. LL(k)-грамматики Пример. Дана грамматика записи выражений: 1) <Строка> ::= <Выр>◄ 2) <Выр> ::= <Терм> <Слож> 3) <Слож> ::= e | + <Терм> <Слож> | - <Терм><Слож> 4) <Терм> ::= <Множ><Умн> 5) <Умн> ::= e | *<Множ><Умн> | / <Множ><Умн> 6) <Множ> ::= <Ид> | (<Выр>)

  30. Метод рекурсивного спуска Пример. Выражение

  31. Алгоритм распознавателя Функция Выражение:Boolean: R:=Терм() Цикл-пока R=true и (NextSymbol =’+’ или NextSymbol =’-’) R:=Терм() Все-цикл Выражение:= R Все Функция Терм:Boolean: Множ() Цикл-пока R=true и (NextSymbol =’*’ или NextSymbol =’/’) R:=Множ() Все-цикл Терм:= R Все

  32. Алгоритм распознавателя (2) ФункцияМнож:Boolean: Если NextSymbol =’(’ то R:=Выражение() Если NextSymbol  ‘)’ то Ошибка Все-если иначе R:= Ид() Все-если Все Основная программа: R:=Выражение() Если NextSymbol  ‘◄’ то Ошибка () Все-если Конец

  33. LR(k)-грамматики Если два символа α, β V расположены рядом в сентенциальной форме, то между ними возможны следующие отношения, названные отношениями предшествования: • α принадлежит основе, а β – нет, т. е. α – конец основы: α > β; • β принадлежит основе, а α – нет, т. е. β – начало основы: α < β ; • α и β принадлежит одной основе, т. е. α = β; • α и β не могут находиться рядом в сентенциальной форме (ошибка). Пример. Грамматика арифметических выражений (с левосторонней рекурсией): <Выражение> ::= <Терм>|<Выражение>+<Терм>|<Выражение>- <Терм> <Терм> ::= <Множитель> | <Терм>* <Множитель> | <Терм> / <Множитель> <Множитель> ::= (<Выражение>) | <Идентификатор>

  34. Построение таблицы предшествования < - начало основы; > - конец основы; = - одна основа; ? - ошибка ►A+ ► A* ►(A ► A) ►A◄ +A+ +A* +(A +A) +A◄ *A+ *A* *(A *A ) *A◄ (A+ (A* ((A (A) (A◄ A)+ A)* A)( A)) A)◄

  35. Пример разбора выражения ►d+c*(a+b) ◄

  36. Польская запись Польская запись представляет собой последовательность команд двух типов: КI,где I – идентификатор операнда – выбрать число по имени I и заслать его в стек операндов; K, где  – операция – выбрать два верхних числа из стека операндов, произвести над ними операцию  и занести результат в стек операндов. Пример: A+B*C  KAKBKCK*K+

  37. Алгоритм Бауэра-Замельзона Построение польской записи : а) если символ – операнд, то вырабатывается команда КI, б) если символ – операция, то выполняются действия согласно таблице: Операции: I – заслать  в стек операций и читать следующий символ; II – генерировать K, заслать  в стек операций и читать следующий символ; III – удалить верхний символ из стека операций и читать следующий символ; IV – генерировать K и повторить с тем же входным символом.  

  38. Пример. Построить тройки для выражения (a+b*c)/d. Построение польской записи: Ka Kb Kc K*K+Kd K/ или abc*+d/

  39. Пример (2) Выполнение операций:

  40. Распределение памяти • статическое; • автоматическое; • управляемое; • базированное.

  41. Генерация и оптимизация кодов Пример «заготовки»: Mov AX, <Op1> Add AX, <Op2> MovAX, <Result> Машинно-независимаяоптимизация включает: а) исключение повторных вычислений одних и тех же операндов; б) выполнение операций над константами во время трансляции; в) вынесение из циклов вычисления величин, не зависящих от параметров циклов; г) упрощение сложных логических выражений и т. п. Машинно-зависимаяоптимизация включает: а) исключение лишних передач управления типа «память-регистр»; б) выбор более эффективных команд т. п.

More Related