PetrKerzum (Yandex) @ CodeCamp2011

  • 666 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
666
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
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