Your SlideShare is downloading. ×
PetrKerzum (Yandex) @ CodeCamp2011
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

PetrKerzum (Yandex) @ CodeCamp2011

677
views

Published on

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
677
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Конечный автомат – таблица Сигнал А Сигнал Б Сигнал В Состояние 0 (начальное) Выполнить Действие A0 Перейти в состояние 1 Выполнить действие Б0 Оставаться в состоянии 0 Выполнить Действие В0 Перейти в состояние 1 Состояние 1 (конечное) Выполнить действие А1 Оставаться в состоянии 1 Выполнить Действие Б1 Перейти в состояние 0 Выполнить Действие В1 Перейти в состояние 0 Состояния Сигналы
  • 2. Конечный автомат – граф А,В Б Б,В А
  • 3. Конечный автомат – язык А В БА БВ ББА Б....БББВ АААААА ББББАААА БВВБАВВА ... Примеры допустимых последовательностей Б*(В|А)А*((Б|В)Б*(В|А)А*)* Язык ::= ФРАЗА (РАЗДЕЛИТЕЛЬ ФРАЗА)* ФРАЗА = Б*(В|А)А* РАЗДЕЛИТЕЛЬ = Б|В 1 0 1 А,В Б Б,В А
  • 4. Конечный автомат - определение Q — конечное множество состояний автомата; q 0 — начальное состояние автомата F — множество заключительных (или допускающих) состояний Σ — входной алфавит (конечное множество допустимых входных символов), из которого формируются строки, считываемые автоматом; δ — заданное отображение / функция переходов автомата
  • 5. Конечный автомат - множества
      Q = { 0, 1 } q 0 = 0 F = 1 Σ = { А, Б, В } δ = { (0, А) -> 1, (0, Б) -> 0, (0, В) -> 1,
        • (1, A) -> 1, (1, Б) -> 0, (1, В) -> 0 }
    1 0 1 А,В Б Б,В А
  • 6. Конечный автомат – реализация 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();
  • 7. изоморфизм Сигнал А Сигнал Б Сигнал В Состояние 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 А,В Б Б,В А
  • 8. Конечный автомат – названия
    • (Детерминированый) конечный автомат
    • 9. Автомат с конечным числом состояний
    • 10. Машина
    • 11. (Регулярный) язык
    • 12. (Регулярное) выражение
    • FSM – Finite state machine
    • 13. DFA – Deterministic finite automate
    • 14. machine
    • 15. language
    • 16. expression
  • 17. Регулярные выражения
      Движок ДКА DFA (FSM) Deterministic finite automata
    • Ragel
    • 18. GREP
    • 19. Lex
    • 20. AWK
      Движок НКА NFA Non-deterministic finite automate
    • Perl
    • 21. PCRE
    • 22. POSIX
    • 23. Python, PHP, ...
  • 24. Регулярные выражения нерегулярность ([a-zA-Z]+)s+ 1 Классическая задача предпечатной подготовки s/ ([a-zA-Z]+)s+1 / 1 /g perl -pi -e ' s/ ([a-zA-Z]+)s+1 / 1 /g ' book.txt НЕРЕГУЛЯРНОСТЬ !!!
  • 25. Регулярные выражения PERL NFA print "YESn" 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
  • 26. 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 .
  • 27. Ragel – пример fsm := ( 'a' %{ print(“a1”); } 'b' %{ print(“b1”); } 'cX' ) | ( 'a' %{ print(“a2”); } 'b' %{ print(“b2”); } 'cd' );
  • 28. 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; }
  • 29. Ragel – пример # mcedit example.rl # ragel6 example.rl -C -o example.cpp # gcc -o example example.cpp # ./example 'abcd' a1 a2 b1 b2 yes
  • 30. 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#
  • 31. 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
  • 32. Ragel – parse float action dgt { printf(&quot;DGT: %cn&quot;, fc); } action dec { printf(&quot;DEC: .n&quot;); } action exp { printf(&quot;EXP: %cn&quot;, fc); } action exp_sign { printf(&quot;SGN: %cn&quot;, fc); } action number { /*NUMBER*/ } number = ( [0-9]+ $dgt ( '.' @dec [0-9]+ $dgt )? ( [eE] ( [+-] $exp_sign )? [0-9]+ $exp )? ) %number; main := ( number 'n' )*;
  • 33. Ragel – parse float st0: if ( ++p == pe ) goto out0; if ( 48 <= (*p) && (*p) <= 57 ) goto tr0; goto st_err; tr0: { printf(&quot;DGT: %cn&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;
  • 34. Ragel – parse float
  • 35. What kind of task is Ragel good for?
    • Writing robust protocol implementations.
    • 36. Parsing data formats.
    • 37. Lexical analysis of programming languages.
    • 38. Validating user input.
  • 39. Ragel – Features
    • Construct finite state machines using:
      • regular language operators
      • 40. state chart operators
      • 41. a scanner operator
      • 42. some mix of the above
    • Embed actions into machines in arbitrary places.
    • 43. Control non-determinism using guarded operators.
    • 44. Minimize state machines using Hopcroft's algorithm.
    • 45. Visualize output with Graphviz.
    • 46. Use byte, double byte or word-sized alphabets.
    • 47. Generate C, C++, Objective-C, D, Java or Ruby code with no dependencies.
    • 48. Choose from table or control flow driven state machines.
  • 49. Ragel – syntax
    • Naming Ragel Blocks
    • 50. machine fsm_name;
    • 51. Machine definition
    • 52. <name> = <expression>;
    • 53. Machine instantiation
    • 54. <name> := <expression>;
    • 55. Including ragel code
    • 56. include FsmName “inputfile.rl”;
  • 57. Ragel – lexical conventions
    • Comment
    • 58. # comment until eol
    • 59. Literal string / regexp
    • 60. 'string' “string” [symbol_class] /basic_regex/
    • 61. Integer
    • 62. 1 0xFE -2
    • 63. Host language block
    • 64. { actionCodeCpp() }
  • 65. Ragel – basic machines
    • String
    • 66. “ hello” 'hello'
    • 67. 'h' . 'e' . 'l' . 'l' . 'o'
    • 68. 0x68 0x65 0x6c 0x6c 0x6f
  • 69. Ragel – basic machines
    • Or-expression (символьный класс)
    • 70. [hello]
    • 71. 'h' | 'e' | 'l' | 'l' | 'o'
    • 72. 0x68 | 0x65 | 0x6c | 0x6c | 0x6f
  • 73. Ragel – basic machines
    • Basic regex (регулярное выражение)
    • 74. /ab*[c-z].*[123]/
  • 75. Ragel – builtin machines
    • – any – Any character in the alphabet.
    • 76. – ascii – Ascii characters. 0..127
    • 77. – extend – Ascii extended characters. This is the range -128..127 for signed alphabets and the range 0..255 for unsigned alphabets.
    • 78. – alpha – Alphabetic characters. [A-Za-z]
    • 79. – digit – Digits. [0-9]
    • 80. – alnum – Alpha numerics. [0-9A-Za-z]
    • 81. – lower – Lowercase characters. [a-z]
    • 82. – upper – Uppercase characters. [A-Z]
    • – xdigit – Hexadecimal digits. [0-9A-Fa-f]
    • 83. – cntrl – Control characters. 0..31
    • 84. – graph – Graphical characters. [!-~]
    • 85. – print – Printable characters. [ -~]
    • 86. – punct – Punctuation. Graphical characters that are not alphanumerics. [!-/:-@[-‘{-~]
    • 87. – space – Whitespace. [tvfnr ]
    • 88. – zlen – Zero length string. &quot;&quot;
    • 89. – empty – Empty set. Matches nothing. ^any
  • 90. Ragel – operators
  • 91. Ragel – operators
  • 95. Ragel – operators
    • Difference
      • expr - expr
  • 96. Ragel – operators
    • Strong difference
    • 97. expr – expr
    • 98. expr1 – (any* expr2 any*)
  • 99. Ragel – operators
  • 106. Ragel – operators
  • 112. Ragel – actions
    • Action definition
  • 113. Ragel – actions
    • Entering action
    • 114. expr > action
  • 115. Ragel – actions
  • 121. Ragel – actions
  • 122. Ragel – actions
    • To-state actions
    • 123. From-state actions
  • 124. Rage – erros actions
    • Global error actions
    • 125. Local error actions
    Reset p, move pe, modify st
  • 126. Ragel – еще
    • Режим лексера aka scanner
    • 127. Действия
      • fhold fcall fret fgoto fexec fnext fbreak
    • Рекурсивные структуры
    • 128. Alphtype unsigned short / private alphabet
    • 129. Direct fsm spec with -> operator
    • 130. Controlling nondeterminism with $precedence
    • 131. Guarded concatenation
    • 132. Getkey access, host face, streaming
    • 133. Modularization