Парсеры это спартаrfc 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008
TRANSCRIPT
![Page 1: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/1.jpg)
Парсеры - это спарта
Алексей Охрименко IPONWEB
![Page 2: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/2.jpg)
![Page 3: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/3.jpg)
Алексей Охрименко
Twitter: @Ai_boy
![Page 4: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/4.jpg)
![Page 5: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/5.jpg)
![Page 6: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/6.jpg)
![Page 7: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/7.jpg)
![Page 8: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/8.jpg)
![Page 9: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/9.jpg)
![Page 10: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/10.jpg)
Lionidus & HIGHLOAD 2015
![Page 11: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/11.jpg)
Тимурinfosystems jet
![Page 12: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/12.jpg)
IPONWEBRTB
![Page 13: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/13.jpg)
![Page 14: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/14.jpg)
Вы готовы?
![Page 15: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/15.jpg)
![Page 16: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/16.jpg)
![Page 17: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/17.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/18.jpg)
http://www.ex-parrot.com/~pdw/Mail-RFC822-
Address.html
![Page 19: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/19.jpg)
![Page 20: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/20.jpg)
(function () {
it("a", function() { console.log(1); });
it("z", function() { console.log(1); });
}());
![Page 21: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/21.jpg)
(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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/22.jpg)
(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 24: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/24.jpg)
EasyHypeAutoNGConvertor
![Page 25: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/25.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/26.jpg)
В основе любой сложной задачи стоит неправильно заданный вопрос.
![Page 27: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/27.jpg)
![Page 28: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/28.jpg)
![Page 29: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/29.jpg)
Что нам нужно?
Парсер
Грамматика
Абстрактная формальная грамматика
Система описания синтаксиса
![Page 30: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/30.jpg)
Парсер
![Page 31: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/31.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/32.jpg)
var ast = string('a');
{ "type": "string", "match": "a", "start_position": 0, "end_position": 1 }
![Page 33: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/33.jpg)
Каррирование
![Page 34: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/34.jpg)
function sum(a, b) { return a + b; }
sum(1,2) // 3
![Page 35: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/35.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/36.jpg)
Рекурсивное Каррирование
![Page 37: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/37.jpg)
function A() { return function () { return B(); } }
function B() { return function () { return A(); } }
A(); // Infinite loop
![Page 38: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/38.jpg)
function rec(callback) { return function() { return callback().apply(this, arguments) } }
![Page 39: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/39.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/40.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/41.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/42.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/43.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/44.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/45.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/46.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/47.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/48.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/49.jpg)
var parser = wrapper([ string('a') ]);
var ast = parser(); // input = 'a'
![Page 50: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/50.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/51.jpg)
Грамматика и Абстрактная Формальная Грамматика
![Page 52: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/52.jpg)
// это методы парсера
function string(parsers) { .. }
function wrapper(parsers) { .. }
// это грамматика
var parser = wrapper([ string('a') ]);
![Page 53: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/53.jpg)
?
![Page 54: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/54.jpg)
PEG (Грамматика Парсерщая Выражения)
![Page 55: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/55.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/56.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/57.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/58.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/59.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/60.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/61.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/62.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/63.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/64.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/65.jpg)
// 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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/66.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/67.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/68.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/69.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/70.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/71.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/72.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/73.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/74.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/75.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/76.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/77.jpg)
{ "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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/78.jpg)
{ "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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/79.jpg)
{ "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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/80.jpg)
{ "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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/81.jpg)
{ "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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/82.jpg)
Система описания синтаксиса
![Page 83: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/83.jpg)
BNF Backus–Naur Form
![Page 84: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/84.jpg)
BNF
![Page 85: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/85.jpg)
BNF -> EBNF, ABNF …
![Page 86: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/86.jpg)
GRAMMAR test
next_seq -> sequenceA+ orderedB+;
sequenceA -> "begin"* [0-9] "end"; orderedB -> "A" / [0-9]+;
![Page 87: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/87.jpg)
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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/88.jpg)
VISITOR
![Page 89: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/89.jpg)
{ "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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/90.jpg)
{ "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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/91.jpg)
{ "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](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/92.jpg)
Парсер PEG грамматики методом рекурсивного спуска, с использованием рекурсивного
каррирования и композиций функций, с EBNF подобной системой описания синтаксиса
https://github.com/aiboy/SPEG
![Page 93: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/93.jpg)
Что дальше?
![Page 94: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/94.jpg)
![Page 95: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/95.jpg)
![Page 96: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/96.jpg)
![Page 97: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/97.jpg)
![Page 98: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/98.jpg)
![Page 99: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/99.jpg)
![Page 100: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/100.jpg)
![Page 101: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/101.jpg)
![Page 102: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/102.jpg)
![Page 103: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/103.jpg)
Роман Дворновavito
CSSO - оптимизируем CSS
![Page 104: Парсеры это спартаRFC 822, 2822, 5322 ( 1982 год ) ( 2001 год ) ( 2008](https://reader030.vdocuments.pub/reader030/viewer/2022011921/60313f9ea7289b14547c4a54/html5/thumbnails/104.jpg)
THE END