Парсеры это спартаrfc 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008

105
Парсеры - это спарта Алексей Охрименко IPONWEB

Upload: others

Post on 06-Oct-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Парсеры - это спарта

Алексей Охрименко IPONWEB

Page 2: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 3: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Алексей Охрименко

Twitter: @Ai_boy

Page 4: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 5: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 6: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 7: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 8: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 9: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 10: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Lionidus & HIGHLOAD 2015

Page 11: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Тимурinfosystems jet

Page 12: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

IPONWEBRTB

Page 13: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 14: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Вы готовы?

Page 15: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 16: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 17: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

RFC 822, 2822, 5322

https://tools.ietf.org/html/rfc822 ( 1982 год )

https://tools.ietf.org/html/rfc2822 ( 2001 год )

https://tools.ietf.org/html/rfc5322 ( 2008 год )

Page 18: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

http://www.ex-parrot.com/~pdw/Mail-RFC822-

Address.html

Page 19: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 20: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

(function () {

it("a", function() { console.log(1); });

it("z", function() { console.log(1); });

}());

Page 21: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

(function () {

it("a", function() { console.log(1); });

it("z", function() { console.log(1); });

}());

(function () {

xit("a", function(){}) it("z", function() { console.log(2); });

}());

Page 22: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

(function () {

it("a", function() { console.log(1); });

it("z", function() { console.log(1); });

}());

(function () {

xit("a", function(){}) it("z", function() { console.log(2); });

}());

(function () { xit('a - OVERRITEN', function () { }); it('z - OVERRITEN', function () { console.log(2); }); }());

Page 23: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

https://github.com/rdio/jsfmt

Page 24: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

EasyHypeAutoNGConvertor

Page 25: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Parsing or syntactic analysis is the process of analysing a string of symbols, either in natural

language or in computer languages, conforming to the rules of a formal grammar

Page 26: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

В основе любой сложной задачи стоит неправильно заданный вопрос.

Page 27: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 28: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 29: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Что нам нужно?

Парсер

Грамматика

Абстрактная формальная грамматика

Система описания синтаксиса

Page 30: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Парсер

Page 31: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

var input = 'a'; var position = 0;

function string(rule) { if (input[position] === rule) { return { type: 'string', match: rule, start_position: position, end_position: position + rule.length } } else { return false; } }

Page 32: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

var ast = string('a');

{ "type": "string", "match": "a", "start_position": 0, "end_position": 1 }

Page 33: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Каррирование

Page 34: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function sum(a, b) { return a + b; }

sum(1,2) // 3

Page 35: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function sum(a) { return function(b) { return a + b; } }

sum(1) // function sum(1)(2) // 3

Page 36: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Рекурсивное Каррирование

Page 37: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function A() { return function () { return B(); } }

function B() { return function () { return A(); } }

A(); // Infinite loop

Page 38: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function rec(callback) { return function() { return callback().apply(this, arguments) } }

Page 39: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function A() { return function () { return rec(B); } }

function B() { return function () { return rec(A); } }

A(); // Works!

Page 40: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function string(rule) { return function() { if (input[position] === rule) { return { type: 'string', match: rule, start_position: position, end_position: position += rule.length } } else { return false; } } }

Page 41: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function string(rule) { return function() { if (input[position] === rule) { return { type: 'string', match: rule, start_position: position, end_position: position += rule.length } } else { return false; } } }

Page 42: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function string(rule) { return function() { if (input[position] === rule) { return { type: 'string', match: rule, start_position: position, end_position: position += rule.length } } else { return false; } } }

Page 43: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function string(rule) { return function() { if (input[position] === rule) { return { type: 'string', match: rule, start_position: position, end_position: position += rule.length } } else { return false; } } }

Page 44: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function wrapper(parsers) { return function() { var asts = parsers.map(function(parser) { return parser(); }) if (asts.indexOf(false) < 0) { return { type: 'wrapper', match: null, children: asts } } else { return false; } } }

Page 45: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function wrapper(parsers) { return function() { var asts = parsers.map(function(parser) { return parser(); }); if (asts.indexOf(false) < 0) { return { type: 'wrapper', match: null, children: asts } } else { return false; } } }

Page 46: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function wrapper(parsers) { return function() { var asts = parsers.map(function(parser) { return parser(); }); if (asts.indexOf(false) < 0) { return { type: 'wrapper', match: null, children: asts } } else { return false; } } }

Page 47: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function wrapper(parsers) { return function() { var asts = parsers.map(function(parser) { return parser(); }); if (asts.indexOf(false) < 0) { return { type: 'wrapper', match: null, children: asts } } else { return false; } } }

Page 48: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function wrapper(parsers) { return function() { var asts = parsers.map(function(parser) { return parser(); }); if (asts.indexOf(false) < 0) { return { type: 'wrapper', match: null, children: asts } } else { return false; } } }

Page 49: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

var parser = wrapper([ string('a') ]);

var ast = parser(); // input = 'a'

Page 50: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

var parser = wrapper([ string('a') ]);

var ast = parser(); // input = ‘a'

{ "type": "wrapper", "match": null, "children": [ { "type": "string", "match": "a", "start_position": 0, "end_position": 1 } ] }

Page 51: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Грамматика и Абстрактная Формальная Грамматика

Page 52: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// это методы парсера

function string(parsers) { .. }

function wrapper(parsers) { .. }

// это грамматика

var parser = wrapper([ string('a') ]);

Page 53: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

?

Page 54: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

PEG (Грамматика Парсерщая Выражения)

Page 55: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

rule_name -> parsing_expression;

Page 56: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

e1 e2 e3

Page 57: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

e1 / e2 /e3

Page 58: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

e*

Page 59: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

e+

Page 60: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

e?

Page 61: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

&e

Page 62: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

!e

Page 63: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

"begin"

Page 64: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

[0-9] [a-z][\w] [\s]

. ( точка - любой символ)

Page 65: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

// Rule // Parsing Expression

// Parsing Expression // Sequence: e1 e2 e3 // Ordered choice: e1 / e2 // Zero-or-more: e* // One-or-more: e+ // Optional: e? // And-predicate: &e // Not-predicate: !e

// Atomic Parsing Expression: // String // RegExp // Rule

rule_name

Page 66: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function string(rule) { return function() { lastExpectations = []; if (input.indexOf(rule, position) === position) { var node = { type: 'string', match: rule, start_position: position, end_position: position + rule.length }; position = node.end_position; return node; } else { lastExpectations = [{ type: 'string', rule: rule, position: position }] return false; } } }

Page 67: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function string(rule) { return function() { lastExpectations = []; if (input.indexOf(rule, position) === position) { var node = { type: 'string', match: rule, start_position: position, end_position: position + rule.length }; position = node.end_position; return node; } else { lastExpectations = [{ type: 'string', rule: rule, position: position }] return false; } } }

Page 68: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function string(rule) { return function() { lastExpectations = []; if (input.indexOf(rule, position) === position) { var node = { type: 'string', match: rule, start_position: position, end_position: position + rule.length }; position = node.end_position; return node; } else { lastExpectations = [{ type: 'string', rule: rule, position: position }] return false; } } }

Page 69: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function string(rule) { return function() { lastExpectations = []; if (input.indexOf(rule, position) === position) { var node = { type: 'string', match: rule, start_position: position, end_position: position + rule.length }; position = node.end_position; return node; } else { lastExpectations = [{ type: 'string', rule: rule, position: position }] return false; } } }

Page 70: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function sequence(parsing_expressions) { return function() { var nodes = []; var start_position = position; for (var i = 0; i < parsing_expressions.length; i++) { var node = parsing_expressions[i](); if (node) { nodes.push(node); } else { return false; } } var match = nodes.reduce(function(r, n){ return r + (n.match || '') }, ''); return { type: 'sequence', match: match, children: nodes, start_position: start_position, end_position: position }; } }

Page 71: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function sequence(parsing_expressions) { return function() { var nodes = []; var start_position = position; for (var i = 0; i < parsing_expressions.length; i++) { var node = parsing_expressions[i](); if (node) { nodes.push(node); } else { return false; } } var match = nodes.reduce(function(r, n){ return r + (n.match || '') }, ''); return { type: 'sequence', match: match, children: nodes, start_position: start_position, end_position: position }; } }

Page 72: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function sequence(parsing_expressions) { return function() { var nodes = []; var start_position = position; for (var i = 0; i < parsing_expressions.length; i++) { var node = parsing_expressions[i](); if (node) { nodes.push(node); } else { return false; } } var match = nodes.reduce(function(r, n){ return r + (n.match || '') }, ''); return { type: 'sequence', match: match, children: nodes, start_position: start_position, end_position: position }; } }

Page 73: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

function sequence(parsing_expressions) { return function() { var nodes = []; var start_position = position; for (var i = 0; i < parsing_expressions.length; i++) { var node = parsing_expressions[i](); if (node) { nodes.push(node); } else { return false; } } var match = nodes.reduce(function(r, n){ return r + (n.match || '') }, ''); return { type: 'sequence', match: match, children: nodes, start_position: start_position, end_position: position }; } }

Page 74: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

rd.setState({ input: 'AB', position: 0 }) // act var parser = rd.ordered_choice([ rd.sequence([ rd.string('A'), rd.string('A') ]), rd.string('B') ]); var ast = parser();

Page 75: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

rd.setState({ input: 'AB', position: 0 }) // act var parser = rd.ordered_choice([ rd.sequence([ rd.string('A'), rd.string('A') ]), rd.string('B') ]); var ast = parser();

Unexpected "B" 1: AB ----^

Page 76: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

rd.setState({ input: 'AА', position: 0 }) // act var parser = rd.ordered_choice([ rd.sequence([ rd.string('A'), rd.string('A') ]), rd.string('B') ]); var ast = parser();

Page 77: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

{ "type": "ordered_choice", "match": "AA", "children": [ { "type": "sequence", "match": "AA", "children": [ { "type": "string", "match": "A", "start_position": 0, "end_position": 1 }, { "type": "string", "match": "A", "start_position": 1, "end_position": 2 } ], "start_position": 0, "end_position": 2 } ], "start_position": 0, "end_position": 2 }

Page 78: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

{ "type": "ordered_choice", "match": "AA", "children": [ { "type": "sequence", "match": "AA", "children": [ { "type": "string", "match": "A", "start_position": 0, "end_position": 1 }, { "type": "string", "match": "A", "start_position": 1, "end_position": 2 } ], "start_position": 0, "end_position": 2 } ], "start_position": 0, "end_position": 2 }

Page 79: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

{ "type": "ordered_choice", "match": "AA", "children": [ { "type": "sequence", "match": "AA", "children": [ { "type": "string", "match": "A", "start_position": 0, "end_position": 1 }, { "type": "string", "match": "A", "start_position": 1, "end_position": 2 } ], "start_position": 0, "end_position": 2 } ], "start_position": 0, "end_position": 2 }

Page 80: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

{ "type": "ordered_choice", "match": "AA", "children": [ { "type": "sequence", "match": "AA", "children": [ { "type": "string", "match": "A", "start_position": 0, "end_position": 1 }, { "type": "string", "match": "A", "start_position": 1, "end_position": 2 } ], "start_position": 0, "end_position": 2 } ], "start_position": 0, "end_position": 2 }

Page 81: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

{ "type": "ordered_choice", "match": "AA", "children": [ { "type": "sequence", "match": "AA", "children": [ { "type": "string", "match": "A", "start_position": 0, "end_position": 1 }, { "type": "string", "match": "A", "start_position": 1, "end_position": 2 } ], "start_position": 0, "end_position": 2 } ], "start_position": 0, "end_position": 2 }

Page 82: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Система описания синтаксиса

Page 83: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

BNF Backus–Naur Form

Page 84: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

BNF

Page 85: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

BNF -> EBNF, ABNF …

Page 86: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

GRAMMAR test

next_seq -> sequenceA+ orderedB+;

sequenceA -> "begin"* [0-9] "end"; orderedB -> "A" / [0-9]+;

Page 87: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

GRAMMAR url

url -> scheme "://" host pathname search hash?; scheme -> "http" "s"?; host -> hostname port?; hostname -> segment ("." segment)*; segment -> [a-z0-9-]+; port -> ":" [0-9]+; pathname -> "/" [^ ?]*; search -> ("?" [^ #]*)?; hash -> "#" [^ ]*;

Page 88: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

VISITOR

Page 89: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

{ "type": "ordered_choice", "match": "AA", "children": [ { "type": "sequence", "match": "AA", "children": [ { "type": "string", "match": "A", "start_position": 0, "end_position": 1 }, { "type": "string", "match": "A", "start_position": 1, "end_position": 2 } ], "start_position": 0, "end_position": 2 } ], "start_position": 0, "end_position": 2 }

[ [ "A", "A" ] ]

Page 90: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

{ "type": "ordered_choice", "match": "AA", "children": [ { "type": "sequence", "match": "AA", "children": [ { "type": "string", "match": "A", "start_position": 0, "end_position": 1 }, { "type": "string", "match": "A", "start_position": 1, "end_position": 2 } ], "start_position": 0, "end_position": 2 } ], "start_position": 0, "end_position": 2 }

var parser = rd.ordered_choice([ rd.sequence([ rd.string('A'), rd.string('A') ]), rd.string('B') ]); var ast = parser();

Page 91: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

{ "type": "ordered_choice", "match": "AA", "children": [ { "type": "sequence", "match": "AA", "children": [ { "type": "string", "match": "A", "start_position": 0, "end_position": 1 }, { "type": "string", "match": "A", "start_position": 1, "end_position": 2 } ], "start_position": 0, "end_position": 2 } ], "start_position": 0, "end_position": 2 }

var parser = rd.ordered_choice([ rd.sequence([ rd.string('A'), rd.string('A') ]), rd.string('B') ]); var ast = parser();

Page 92: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Парсер PEG грамматики методом рекурсивного спуска, с использованием рекурсивного

каррирования и композиций функций, с EBNF подобной системой описания синтаксиса

https://github.com/aiboy/SPEG

Page 93: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Что дальше?

Page 94: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 95: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 96: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 97: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 98: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 99: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 100: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 101: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 102: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008
Page 103: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Роман Дворновavito

CSSO - оптимизируем CSS

Page 104: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

THE END

Page 105: Парсеры это спартаRFC 822, 2822, 5322  ( 1982 год )  ( 2001 год )  ( 2008

Q&A?Алексей

Охрименко

Twitter: @Ai_boy

http://bit.ly/1U1Fpa8