PetrKerzum (Yandex) @ CodeCamp2011

887 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
887
On SlideShare
0
From Embeds
0
Number of Embeds
27
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

PetrKerzum (Yandex) @ CodeCamp2011

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

×