SlideShare una empresa de Scribd logo
1 de 41
Конечный автомат – таблица Сигнал А Сигнал Б Сигнал В Состояние 0 (начальное) Выполнить Действие A0 Перейти в состояние 1 Выполнить действие Б0 Оставаться в состоянии 0 Выполнить Действие В0 Перейти в состояние 1 Состояние 1 (конечное) Выполнить действие А1 Оставаться в состоянии 1 Выполнить Действие Б1 Перейти в состояние 0 Выполнить Действие В1 Перейти в состояние 0 Состояния Сигналы
Конечный автомат – граф А,В Б Б,В А
Конечный автомат – язык А В БА БВ ББА Б....БББВ АААААА ББББАААА БВВБАВВА ... Примеры допустимых последовательностей Б*(В|А)А*((Б|В)Б*(В|А)А*)* Язык ::= ФРАЗА (РАЗДЕЛИТЕЛЬ ФРАЗА)* ФРАЗА =  Б*(В|А)А* РАЗДЕЛИТЕЛЬ =  Б|В 1 0 1 А,В Б Б,В А
Конечный автомат - определение Q  —  конечное  множество состояний автомата; q 0  — начальное состояние автомата  F  — множество заключительных (или допускающих) состояний Σ  — входной алфавит (конечное множество  допустимых входных  символов), из которого формируются  строки, считываемые автоматом; δ  — заданное отображение  / функция переходов автомата
Конечный автомат - множества ,[object Object],1 0 1 А,В Б Б,В А
Конечный автомат – реализация Int state = 0; // q0; while(char c = getkey()) { switch(state) { Case 0: goto st0; Case 1: goto st1; } St0: switch(c) { Case 'А': state = 1; goto end; Case 'Б': goto end; Case 'В': state = 1; goto end; } St1: switch(c) { Case 'А': goto end; Case 'Б': state = 0; goto end; Case 'В': state = 0; goto end; } End: } If (state == 1) exit_ok(); // state in F else exit_fail();
изоморфизм Сигнал А Сигнал Б Сигнал В Состояние 0 (начальное) Выполнить Действие A0 Перейти в состояние 1 Выполнить действие Б0 Оставаться в состоянии 0 Выполнить Действие В0 Перейти в состояние 1 Состояние 1 (конечное) Выполнить действие А1 Оставаться в состоянии 1 Выполнить Действие Б1 Перейти в состояние 0 Выполнить Действие В1 Перейти в состояние 0 Б*(В|А)А*((Б|В)Б*(В|А)А*)* Int state = q0; while(char c = getkey()) { switch(state) { Case 0: goto st0; Case 1: goto st1; } St0: switch(c) { Case 'А': state = 1; goto end; Case 'Б': goto end; Case 'В': state = 1; goto end; } St1: switch(c) { Case 'А': goto end; Case 'Б': state = 0; goto end; Case 'В': state = 0; goto end; } End: } If (state in F) exit_ok(); else exit_fail(); 1 0 1 А,В Б Б,В А
Конечный автомат – названия ,[object Object]
Автомат с конечным числом состояний
Машина
(Регулярный) язык
(Регулярное) выражение ,[object Object]
DFA – Deterministic finite automate
machine
language
expression
Регулярные выражения ,[object Object]
GREP
Lex
AWK ,[object Object]
PCRE
POSIX
Python, PHP, ...
Регулярные выражения нерегулярность ([a-zA-Z]+)+    Классическая задача предпечатной подготовки s/ ([a-zA-Z]+)+ /  /g perl -pi -e ' s/ ([a-zA-Z]+)+ /  /g '  book.txt   НЕРЕГУЛЯРНОСТЬ !!!
Регулярные выражения PERL NFA print "YES" if ( $ARGV[0] =~ /( a (?{ print "a1 "; }) b (?{ print "b1 "; }) cX ) | ( a (?{ print "a2 "; }) b (?{ print "b2 "; }) cd )/x ) # ./prog.pl abcd a1 b1 a2 b2 YES RAGEL DFA # ./prog_rl abcd a1 a2 b1 b2 YES
Ragel http://www.complang.org/ragel/ Adrian D. Thurston "Parsing Computer Languages  with an Automaton Compiled from a Single Regular Expression."   In 11th International Conference on Implementation and Application of Automata  (CIAA 2006), Lecture Notes in Computer Science, volume 4094, pp. 285-286, Taipei, Taiwan,  August 2006.  pdf .
Ragel – пример fsm :=  ( 'a' %{ print(“a1”); }    'b' %{ print(“b1”); }    'cX' ) | ( 'a' %{ print(“a2”); }    'b' %{ print(“b2”); }   'cd' );
Ragel – пример %%{  Machine example; fsm := ('a' %{ print(“a1”); } 'b' %{ print(“b1”); } “cX” ) | ('a' %{ print(“a2”); } 'b' %{ print(“b2”); } “cd” ); write data; }%% Int main(int, char** argv) { const char p = argv[0]; const char pe = p + strlen(p) + 1; int cs; %% write init; %% write exec; If (cs == example_error) return 2; return cs < example_first_final; }
Ragel – пример # mcedit example.rl # ragel6 example.rl -C -o example.cpp # gcc -o example example.cpp # ./example 'abcd' a1 a2 b1 b2 yes
Ragel host language host language: -C  The host language is C, C++,    Obj-C or Obj-C++ (default) -D  The host language is D -J  The host language is Java -R  The host language is Ruby -A  The host language is C#
Ragel – generated code style code style: (C/D/Java/Ruby/C#) -T0  Table driven FSM (default) code style: (C/D/Ruby/C#) -T1  Faster table driven FSM -F0  Flat table driven FSM -F1  Faster flat table-driven FSM code style: (C/D/C#) -G0  Goto-driven FSM -G1  Faster goto-driven FSM code style: (C/D) -G2  Really fast goto-driven FSM -P<N>  N-Way Split really fast goto-driven FSM
Ragel – parse float action dgt  { printf(&quot;DGT: %c&quot;, fc); } action dec  { printf(&quot;DEC: .&quot;); } action exp  { printf(&quot;EXP: %c&quot;, fc); } action exp_sign { printf(&quot;SGN: %c&quot;, fc); } action number  { /*NUMBER*/ } number = ( [0-9]+ $dgt ( '.' @dec [0-9]+ $dgt )? ( [eE] ( [+] $exp_sign )? [0-9]+ $exp )? ) %number; main := ( number '' )*;
Ragel – parse float st0: if ( ++p == pe ) goto out0; if ( 48 <= (*p) && (*p) <= 57 ) goto tr0; goto st_err; tr0: { printf(&quot;DGT: %c&quot;, (*p)); } st1: if ( ++p == pe ) goto out1; switch ( (*p) ) { case 10: goto tr5; case 46: goto tr7; case 69: goto st4; case 101: goto st4; } if ( 48 <= (*p) && (*p) <= 57 ) goto tr0; goto st_err;
Ragel – parse float
What kind of task is Ragel good for? ,[object Object]
Parsing data formats.
Lexical analysis of programming languages.
Validating user input.
Ragel –  Features ,[object Object]
state chart operators
a scanner operator

Más contenido relacionado

La actualidad más candente

использование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачиспользование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачserg007
 
Алгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеАлгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеAndrey Dolinin
 
использование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачиспользование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачserg007
 
использование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачиспользование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачserg007
 
Программирование циклических алгоритмов
Программирование циклических алгоритмовПрограммирование циклических алгоритмов
Программирование циклических алгоритмовAndrey Dolinin
 
использование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачиспользование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачДарья Димитрова
 
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...Ontico
 
введение
введениевведение
введениеAndEdr
 
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...CEE-SEC(R)
 
практика 4
практика 4практика 4
практика 4student_kai
 

La actualidad más candente (16)

использование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачиспользование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задач
 
Алгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеАлгоритмическая конструкция Повторение
Алгоритмическая конструкция Повторение
 
использование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачиспользование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задач
 
fp intro
fp introfp intro
fp intro
 
использование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачиспользование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задач
 
8 3-3
8 3-38 3-3
8 3-3
 
ПРОЦЕДУРЫ
ПРОЦЕДУРЫ ПРОЦЕДУРЫ
ПРОЦЕДУРЫ
 
структура программы
структура программыструктура программы
структура программы
 
Программирование циклических алгоритмов
Программирование циклических алгоритмовПрограммирование циклических алгоритмов
Программирование циклических алгоритмов
 
использование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задачиспользование линейных алгоритмов для решения задач
использование линейных алгоритмов для решения задач
 
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
Как перестать отлаживать асинхронный код и начать жить / Андрей Саломатин (Pr...
 
лр1
лр1лр1
лр1
 
8 3-5
8 3-58 3-5
8 3-5
 
введение
введениевведение
введение
 
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...Автоматизированная разработка генераторов тестовых программ для микропроцессо...
Автоматизированная разработка генераторов тестовых программ для микропроцессо...
 
практика 4
практика 4практика 4
практика 4
 

Similar a PetrKerzum (Yandex) @ CodeCamp2011

DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке Cstudent_kai
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкетаstudent_kai
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовAndrew Shitov
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхDmitry Protopopov
 
лабораторная работа №3
лабораторная работа №3лабораторная работа №3
лабораторная работа №3Zhanna Kazakova
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Mikhail Kurnosov
 
Ввод - вывод алфавитно цифровой информации
Ввод - вывод алфавитно цифровой информацииВвод - вывод алфавитно цифровой информации
Ввод - вывод алфавитно цифровой информацииLungu
 
Ввод - вывод алфавитно цифровой информации
Ввод - вывод алфавитно цифровой информацииВвод - вывод алфавитно цифровой информации
Ввод - вывод алфавитно цифровой информацииLungu
 
Обработка символов в языке C
Обработка символов в языке CОбработка символов в языке C
Обработка символов в языке CAlexey Bovanenko
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CSergey Pronin
 
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JSFestUA
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
вывод алфавитно цифровой информации
вывод алфавитно цифровой информациивывод алфавитно цифровой информации
вывод алфавитно цифровой информацииLungu
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalAndrei Solntsev
 

Similar a PetrKerzum (Yandex) @ CodeCamp2011 (20)

DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
основы программирования на языке C
основы программирования на языке Cосновы программирования на языке C
основы программирования на языке C
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
презентации продолжение банкета
презентации продолжение банкетапрезентации продолжение банкета
презентации продолжение банкета
 
лекция 1
лекция 1лекция 1
лекция 1
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменных
 
лабораторная работа №3
лабораторная работа №3лабораторная работа №3
лабораторная работа №3
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
 
20110227 csseminar alvor_breslav
20110227 csseminar alvor_breslav20110227 csseminar alvor_breslav
20110227 csseminar alvor_breslav
 
Swift School #2
Swift School #2Swift School #2
Swift School #2
 
Ввод - вывод алфавитно цифровой информации
Ввод - вывод алфавитно цифровой информацииВвод - вывод алфавитно цифровой информации
Ввод - вывод алфавитно цифровой информации
 
Ввод - вывод алфавитно цифровой информации
Ввод - вывод алфавитно цифровой информацииВвод - вывод алфавитно цифровой информации
Ввод - вывод алфавитно цифровой информации
 
Java 8 puzzlers
Java 8 puzzlersJava 8 puzzlers
Java 8 puzzlers
 
Обработка символов в языке C
Обработка символов в языке CОбработка символов в языке C
Обработка символов в языке C
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
 
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
вывод алфавитно цифровой информации
вывод алфавитно цифровой информациивывод алфавитно цифровой информации
вывод алфавитно цифровой информации
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - final
 

Más de CodeCamp

VladimirKolesnikov (Microsoft) @ CodeCamp2011
VladimirKolesnikov (Microsoft) @ CodeCamp2011VladimirKolesnikov (Microsoft) @ CodeCamp2011
VladimirKolesnikov (Microsoft) @ CodeCamp2011CodeCamp
 
MichailZavileysky (DataArt) @ CodeCamp2011
MichailZavileysky (DataArt) @ CodeCamp2011MichailZavileysky (DataArt) @ CodeCamp2011
MichailZavileysky (DataArt) @ CodeCamp2011CodeCamp
 
AntonSaburov (Gemini-Systems) @ CodeCamp2011
AntonSaburov (Gemini-Systems) @ CodeCamp2011AntonSaburov (Gemini-Systems) @ CodeCamp2011
AntonSaburov (Gemini-Systems) @ CodeCamp2011CodeCamp
 
MichailTokovinin (Qsoft) @ CodeCamp2011
MichailTokovinin (Qsoft) @ CodeCamp2011MichailTokovinin (Qsoft) @ CodeCamp2011
MichailTokovinin (Qsoft) @ CodeCamp2011CodeCamp
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011CodeCamp
 
KirillLebedev @ CodeCamp2011
KirillLebedev @ CodeCamp2011KirillLebedev @ CodeCamp2011
KirillLebedev @ CodeCamp2011CodeCamp
 
GeorgyShuklin (Selectel) @ CodeCamp2011
GeorgyShuklin (Selectel) @ CodeCamp2011GeorgyShuklin (Selectel) @ CodeCamp2011
GeorgyShuklin (Selectel) @ CodeCamp2011CodeCamp
 
VadimSabashny (Lanit-Tercom) @ CodeCamp2011
VadimSabashny (Lanit-Tercom) @ CodeCamp2011VadimSabashny (Lanit-Tercom) @ CodeCamp2011
VadimSabashny (Lanit-Tercom) @ CodeCamp2011CodeCamp
 
AlexeyScutin (Hivext) @ CodeCamp 2011
AlexeyScutin (Hivext) @ CodeCamp 2011AlexeyScutin (Hivext) @ CodeCamp 2011
AlexeyScutin (Hivext) @ CodeCamp 2011CodeCamp
 

Más de CodeCamp (9)

VladimirKolesnikov (Microsoft) @ CodeCamp2011
VladimirKolesnikov (Microsoft) @ CodeCamp2011VladimirKolesnikov (Microsoft) @ CodeCamp2011
VladimirKolesnikov (Microsoft) @ CodeCamp2011
 
MichailZavileysky (DataArt) @ CodeCamp2011
MichailZavileysky (DataArt) @ CodeCamp2011MichailZavileysky (DataArt) @ CodeCamp2011
MichailZavileysky (DataArt) @ CodeCamp2011
 
AntonSaburov (Gemini-Systems) @ CodeCamp2011
AntonSaburov (Gemini-Systems) @ CodeCamp2011AntonSaburov (Gemini-Systems) @ CodeCamp2011
AntonSaburov (Gemini-Systems) @ CodeCamp2011
 
MichailTokovinin (Qsoft) @ CodeCamp2011
MichailTokovinin (Qsoft) @ CodeCamp2011MichailTokovinin (Qsoft) @ CodeCamp2011
MichailTokovinin (Qsoft) @ CodeCamp2011
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
KirillLebedev @ CodeCamp2011
KirillLebedev @ CodeCamp2011KirillLebedev @ CodeCamp2011
KirillLebedev @ CodeCamp2011
 
GeorgyShuklin (Selectel) @ CodeCamp2011
GeorgyShuklin (Selectel) @ CodeCamp2011GeorgyShuklin (Selectel) @ CodeCamp2011
GeorgyShuklin (Selectel) @ CodeCamp2011
 
VadimSabashny (Lanit-Tercom) @ CodeCamp2011
VadimSabashny (Lanit-Tercom) @ CodeCamp2011VadimSabashny (Lanit-Tercom) @ CodeCamp2011
VadimSabashny (Lanit-Tercom) @ CodeCamp2011
 
AlexeyScutin (Hivext) @ CodeCamp 2011
AlexeyScutin (Hivext) @ CodeCamp 2011AlexeyScutin (Hivext) @ CodeCamp 2011
AlexeyScutin (Hivext) @ CodeCamp 2011
 

PetrKerzum (Yandex) @ CodeCamp2011