Функциональное программирование Лекция 11. Содержание Анализ искусственных и естественных языков Метапрограммирование: Quotations 2.

Презентация:



Advertisements
Похожие презентации
1 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ Eval / Apply-интерпретатор Интерпретация, основанная.
Advertisements

1 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Глава 5. Системы исполнения функциональных программ.
1 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Глава 5. Системы исполнения функциональных программ.
1 Кубенский А.А. Функциональное программирование. Глава 4. Основы лямбда-исчисления Рекурсия в лямбда-исчислении fac = λn.(if (= n 0) 1 (* n (fac.
Семантический анализ КC-грамматики, с помощью которых описывают синтаксис языков программирования, не позволяют задавать контекстные условия (КУ), имеющиеся.
Внутреннее представление компилятора Типы представлений и их особенности.
Часть II. Формальное описание языков программирования ( Формальная спецификация формальных языков ) Приложение. Дерево абстрактного синтаксиса языка IMP.
1 Кубенский А.А. Функциональное программирование. Глава 5. Системы исполнения функциональных программ. Глава 5. Системы исполнения функциональных программ.
Сошников Дмитрий Валерьевич к.ф.-м.н., доцент Факультет инноваций и высоких технологий Московский физико-технический институт.
Сошников Дмитрий Валерьевич к.ф.-м.н., доцент Факультет инноваций и высоких технологий Московский физико-технический институт.
Генератор синтаксических анализаторов для решения задач автоматизированного реинжиниринга программ Дипломная работа студента 544 группы Чемоданова Ильи.
Связанные и свободные переменные n λv.B n Переменная v называется связанной всюду в теле B функции λv.B, за исключением подвыражений B, где v переопределяется.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ С РАСШИРЯЕМЫМ СИНТАКСИСОМ П.В. Егоров Екатеринбург, Июнь 2006.
Глава 1. Язык реализации: TSG. Супер- компиляция scp Специализация программ Приложения суперкомпиляции, в том числе Базовые понятия и методы метавычислений.
Сошников Дмитрий Валерьевич к.ф.-м.н., доцент Факультет инноваций и высоких технологий Московский физико-технический институт.
Сошников Дмитрий Валерьевич к.ф.-м.н., доцент Факультет инноваций и высоких технологий Московский физико-технический институт.
Теория компиляторов-1. Л.71 Классическая теория компиляторов Лекция 7.
Генерация кода Преобразование дерева операций в код на языке ассемблера Ассемблер процессоров типа Intel 80x86 Code – функция перевода узла в команды ассемблера.
Часть II. Формальное описание языков программирования ( Формальная спецификация формальных языков ) Приложение. Дерево абстрактного синтаксиса языка IMP.
САОД кафедра ОСУ 1 Основные абстрактные типы данных Схема процесса создания программ для решения прикладных задач ВУ.
Транксрипт:

Функциональное программирование Лекция 11

Содержание Анализ искусственных и естественных языков Метапрограммирование: Quotations 2

3 Анализ искусственных и естественных языков

4 Языки и грамматики Язык – множество слов в алфавите A L A* Может задаваться Перечислением Правилами построение – грамматикой Пример: 1 0

5 Контекстно-свободная грамматика Грамматика, в которой применяемое правило не зависит от контекста т.е. по текущему токену можно однозначно определить применяемое правило

6 Простой функциональный язык (ПФЯ) Применение функций записывается как f.x Для арифметических выражений не делается исключений Не рассматриваем списки, типы данных и т.д. Язык эквивалентен рассмотренным выше абстрактным деревьям выражений letrec fact = fun x -> if if.. < x 1 then 1 else.. * x (. fact (.. - x 1)) in. fact 5

7 Грамматика простого функционального языка (ПФЯ) Expr AppList AppList SimpleExpr | AppList. SimpleExpr SimpleExpr Id | Int | + | - | * | / | | = …. fun id -> Expr ( Expr ) If Expr then Expr else Expr let id = Expr in Expr letrec id = Expr in Expr

8 Общий подход к разбору искусственных языков Текст программы (последовательность символов) Лексический анализ Последовательность токенов (FUN,ID,->,…) Синтаксический анализ Синтаксическое дерево Lam(x,App(…)) Интерпретация Компиляция...

9 Лексический анализ let prog = ReadLines "test.lang" |> Seq.map_concat(fun x -> x.Split([|' '|])) |> Seq.filter(fun s -> s"") |> Seq.to_list;; В общем случае строится на основе конечного автомата Для простого языка мы можем построить последовательность токенов разбиением на слова

10 Синтаксический разбор методом рекурсивного спуска let rec parse x = match x with "letrec"::id::"="::T1 -> let (tr1,rem) = parse T1 in match rem with "in"::T2 -> let (tr2,T3) = parse T2 in (Let(id,tr1,tr2),T3) | _ -> err | "fun"::id::"->"::T -> let (t,r) = parse T in (Lam(id,t),r) | "("::T -> let (t1,r1) = parse T in match r1 with ")"::T1 -> (t1,T1) | _ -> err | " (PFunc("

11 Использование специализированных утилит В комплекте с F# идут классические утилиты для построения компиляторов: fslex – генерация лексического анализатора fsyacc – генерация синтаксического анализатора В обоих случаях по исходным файлам с описанием грамматики строятся программы на F#

12 Лексический анализатор { open System open Pars open Lexing } let digit = ['0'-'9'] let whitespace = [' ' '\t' ] let newline = ('\n' | '\r' '\n') rule token = parse | whitespace { token lexbuf } | newline { token lexbuf } | "let" { LET } | "letrec" { LETREC } | "fun" { FUN } | "in" { IN } | "if" { IF } | "then" { THEN } | "else" { ELSE } | "(" { LPAREN } | ")" { RPAREN } | "+" { PLUS } | "-" { MINUS } | "*" { TIMES } | "/" { DIV } | "=" { EQ } | "->" { ARROW } | "." { DOT } | "" { MORE } | ";" { SEMI } | ['a'-'z']+ { ID(lexeme lexbuf) } | ['-']?digit+ { INT (Int32.Parse(lexeme lexbuf)) } | eof { EOF }

13 Синтаксический анализатор %{ open Ast %} %start start %token ID %token INT %token LET LETREC FUN IN LPAREN RPAREN IF THEN ELSE SEMI EOF PLUS MINUS TIMES DIV EQ ARROW DOT LESS MORE %type start % start: Prog { $1 } Prog: Expr { $1 } SimpleExpr: | ID { Var($1) }| INT { Int($1) } | PLUS { PFunc("+") } | MINUS { PFunc("+") } | TIMES { PFunc("*") }| LESS { PFunc("") }| DIV { PFunc("/") } | FUN ID ARROW Expr { Lam($2,$4) } | LPAREN Expr RPAREN { $2 } | IF Expr THEN Expr ELSE Expr { Cond($2,$4,$6) } | LET ID EQ Expr IN Expr { Let($2,$4,$6) } | LETREC ID EQ Expr IN Expr { LetRec($2,$4,$6) } Expr: AppList { $1 } AppList: | SimpleExpr { $1 } | AppList DOT SimpleExpr { App($1,$3) }

14 Что мы получили? Реализацию простейшего функционального языка программирования! Лексический анализатор Синтаксический анализатор (парсер) Интерпретатор (eval/apply) или реализация с абстрактной SECD-машиной

15 Метапрограммирование: Quotations

16 Метапрограммирование Метапрограммирование – написание компьютерных программ, которые манипулируют другими программами как данными Реализация «надстройки» языка программирования Трансляция фрагмента кода программы в другое представление Генерация и последующее выполнение кода во время выполнения Метапрограммирование в F# Quotations (цитаты) Computational Expressions (монады)

17 Quotations Возможность работать с внутренним представлением фрагментов F#-программы - typed, внутри производится проверка типов - untyped (raw), проверка типов не производится val it : Expr = Call (None, Int32 op_Multiply[Int32,Int32,Int32](Int32, Int32), [Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [Value (1), Value (2)]), Value (3)]) {Type = System.Int32;}

18 Пример: стековый калькулятор Построим преобразователь арифметических выражений в программу простейшей стековой машины type Command = Push of int | Add | Sub | Mult | Div | Print ;; type Prog = Command list;;

19 Работа с Raw Quoations let rec compile l E = match E with Call(_,Op,Args) -> compileop (compilel l Args) Op | Value(x,_) -> Push(int(x.ToString()))::l and compileop l Op = if Op.ToString().IndexOf("Addition")>0 then Add::l else if Op.ToString().IndexOf("Mult")>0 then Mult::l else if Op.ToString().IndexOf("Sub")>0 then Sub::l else if Op.ToString().IndexOf("Div")>0 then Div::l else l and compilel l = function [] -> l | h::t -> compilel (compile l h) t;; Call (None, Int32 op_Multiply[Int32,Int32,Int32](Int32, Int32), [Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [Value (1), Value (2)]), Value (3)]) compile [] val it : Command list = [Mult; Push 3; Add; Push 2; Push 1] compile [] val it : Command list = [Add; Mult; Push 3; Push 2; Push 1]

20 Работа с данными и DLinq Цель: использовать функциональный подход для работы с данными из реляционной БД let q = db.Customers.to_array() |> where (fun c -> c.City = "London) |> select (fun c -> c.ContactName) let q = db.Customers |> where c.City = |> select Работа с данными происходит в памяти Не используются возможности по оптимизации запросов СУБД Использование Query Expression позволяет транслировать такой запрос в SQL и выполнять его на стороне СУБД SELECT ContactName FROM Customers WHERE City = "London"