Slide 1

Slide 1 text

Свой протокол и кросс- платформенные парсеры за 30 минут Когда JSON уже не подходит Виктор Грищенко Синьор помидор realm.io

Slide 2

Slide 2 text

Мно-го-плат-фор-мен-ность!!! http://seriot.ch/parsing_json.php

Slide 3

Slide 3 text

Формальные языки С++ HTML CSS

Slide 4

Slide 4 text

Парcеры <(\w+)\s*(\w+=“[^”]*”)>

Slide 5

Slide 5 text

Байтики message Person { required string user_name = 1; optional int64 favourite_number = 2; repeated string interests = 3; }

Slide 6

Slide 6 text

Грамматики const INVENTORY_JSON = new Grammar({ FLOAT: /\d{1,16}(\.\d{1,15})?/, INT: /\d{1,16}/, STRING: /"(\\.|[^"])*"/, IDKV: '"\\"id\\"" :STRING', NAMEKV: '"\\"name\\"" :STRING', QUANTKV:'"\\"quantity\\"" :INT', PRICEKV:'"\\"price\\"" :FLOAT', ENTRY: '{ IDKV ,NAMEKV? ,QUANTKV? ,PRICEKV? }', LIST: '[ ENTRY ,ENTRY* ]' }); {"id":"A345", "name":"teddy bear", "price": 5.45} ,ENTRY*

Slide 7

Slide 7 text

https://www.google.ru/search?q=regex+site:xkcd.com https://alf.nu/RegexGolf

Slide 8

Slide 8 text

Регулярки /^\s*\[\s*(\{\s*(?:(?:"id"\s*)\:\s*(?:"(?:\\.|[^"])*")) \s*(?:\,\s*(?:(?:"name"\s*)\:\s*(?:"(?:\\.|[^"])*")))? \s*(?:\,\s*(?:(?:"quantity"\s*)\:\s*(?:\d+)))?\s*(?:\, \s*(?:(?:"price"\s*)\:\s*(?:\d+(?:\.\d{1,15})?)))? \s*\}\s*)((?:\,\s*\{\s*(?:(?:"id"\s*)\:\s*(?:"(?:\\.| [^"])*"))\s*(?:\,\s*(?:(?:"name"\s*)\:\s*(?:"(?:\\.| [^"])*")))?\s*(?:\,\s*(?:(?:"quantity"\s*)\:\s*(?: \d+)))?\s*(?:\,\s*(?:(?:"price"\s*)\:\s*(?:\d+(?:\. \d{1,15})?)))?\s*\}\s*)*)\s*\]\s*$/m

Slide 9

Slide 9 text

Бенчи size: 200000 entries length: 10200000chars JSON.parse 189ms Grammar.is 95ms Grammar.split 122ms

Slide 10

Slide 10 text

Недопротобуф #1MOC-Agritzko1.lww@1MOC02-Agritzko1:name=“teddy bear” # 1MOC - Agritzko1 . lww @ 1MOC02 - Agritzko1 : name = “teddy bear”

Slide 11

Slide 11 text

Immutable AST

Slide 12

Slide 12 text

@gritzko Виктор Грищенко Синьор помидор realm.io Чо? victor.grishchenko github.com/gritzko/ regular-grammar [email protected]