SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
parboiled2генерируемые макросами генераторы PEG-парсеров
Александр Мыльцев / /github linkedin.com/in/alexandermyltsev
презентация
задача парсинга
вход: строка, поток байт, ...
выход: обладает структурой (да/нет), структура
пример
1+2*3—арифметическоевыражение:даилинет?—да
1+2*3—структура?—Plus(1,Mul(2,3))
регулярные выражения
нельзя: рекурсивные структуры
1. калькулятор
2. json
3. ...
рекурсивный нисходящий парсер:
C/C++
staticintlex_scan_number(lex_t*lex,intc,json_error_t*error)
{
constchar*saved_text;
char*end;
doubledoubleval;
lex->token=TOKEN_INVALID;
if(c=='-')
c=lex_get_save(lex,error);
if(c=='0'){
c=lex_get_save(lex,error);
if(l_isdigit(c)){
lex_unget_unsave(lex,c);
gotoout;
}
}
elseif(l_isdigit(c)){
c=lex_get_save(lex,error);
while(l_isdigit(c))
c=lex_get_save(lex,error);
}
else{
lex_unget_unsave(lex,c);
gotoout;
}
if(c!='.'&&c!='E'&&c!='e'){
json_int_tintval;
lex_unget_unsave(lex,c);
saved_text=strbuffer_value(&lex->saved_text);
https://github.com/akheron/jansson/blob/master/src/load.c
рекурсивный нисходящий парсер:
JavaScript
number=function(){
//Parseanumbervalue.
varnumber,
string='';
if(ch==='-'){
string='-';
next('-');
}
while(ch>='0'&&ch<='9'){
string+=ch;
next();
}
if(ch==='.'){
string+='.';
while(next()&&ch>='0'&&ch<='9'){
string+=ch;
}
}
if(ch==='e'||ch==='E'){
string+=ch;
next();
if(ch==='-'||ch==='+'){
string+=ch;
next();
}
while(ch>='0'&&ch<='9'){
string+=ch;
next();
}
}
number=+string;
https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js
рекурсивный нисходящий парсер
плюсы
1. код на одном языке
2. одна среда разработки
3. высокая производительность
минусы
1. нет предметно-ориентиррованного языка
2. низкоуровневое кодирование
внутренний язык и среда разработки
генерация java-файлов
подключение файлов к проекту
ANTLR3
grammarSimpleCalc;
add:NUMBERPLUSNUMBER;
NUMBER :('0'..'9')+;
PLUS :'+';
javaorg.antlr.ToolSimpleCalc.g
ANTLR3
плюсы
1. предметно-ориентированный язык
2. высокая производительность
минусы
1. новый язык, другая среда
2. генерация и подключение файлов
комбинаторы парсеров
Haskell Parsec
Scala Combinator Parsers
FParsec
комбинаторы парсеров
плюсы
1. программа на исходном языке
2. файлы в исходном проекте
3. исходная среда разработки
4. типизация парсеров
5. близкая к БНФ форма записи
// Expr ::=Term {'+' Term |'-' Term}
defexpr =term~rep("+"~term |"-"~term)
// Term ::= Factor {'*' Factor|'/' Factor}
defterm = factor~rep("*"~factor|"/"~factor)
// Factor ::=Number|'(' Expr ')'
deffactor =number|"("~expr~")"
минусы
1. интерпретатор
2. временные объекты
3. низкая производительность
генератор парсеров
1. на одном языке в одной среде разработки
2. типизированный DSL
3. компиляция, а не интерпритация
parboiled2
PEG — грамматика, разбирающая выражение
типизированный DSL
компиляция правил
rule, ch, str
реализация класса `Parser`
правила грамматики внутри метода rule { }
classSampleParser(valinput:ParserInput)extendsParser{
defAbc=rule{"abc"}
defCh =rule{'7'}
defNum=rule{42}//ошибкакомпиляции
}
a ~ b, a | b
classSampleParser(valinput:ParserInput)extendsParser{
defr1=rule{"a"~"b"}//"ab"
defr2=rule{"a"|"b"}//{"a","b"}
defr3=rule{"a"~("b"|"c")}//{"ab","ac"}
defr4=rule{"ab"|"a"}
}
zeroOrMore, oneOrMore
classSampleParser(valinput:ParserInput)extendsParser{
defr1=rule{zeroOrMore("a")}//{"","a","aa","aaa",...}
defr2=rule{oneOrMore("a")} //{"a","aa","aaa",...}
}
парсер арифметических
выражений
classCalculatorParser(valinput:ParserInput)extendsParser{
defInputLine=rule{Expression~EOI}
//РекурсивныйвызоввParens,поэтомунужентип
defExpression:Rule0=rule{Term~zeroOrMore('+'~Term|'-'~Term)}
defTerm =rule{Factor~zeroOrMore('*'~Factor|'/'~Factor)}
defFactor=rule{Number|Parens}
defParens=rule{'('~Expression~')'}
defNumber=rule{oneOrMore(CharPredicate.Digit)}
}
арифметическое выражение:
да или нет?
valline=readline()
valcalc=newCalculatorParser(line)
calc.InputLine().run()match{
caseSuccess(_)=>"Yes"
caseFailure(_)=>"No"
}
parser actions, value-stack
value-stack — отличие от haskell parsec et al.
classValueStack(initialSize:Int,maxSize:Int)extendsIterable[Any]{
varbuffer=newArray[Any](initialSize)
varsize =0
}
defDigits =rule{oneOrMore("0"|"1"|/*...*/"9")}//oneOrMore("0"-"9")
defFalse =rule{"false"~push(false)}//"false">>>VStk:[false]
defNumberStr=rule{capture(Digits)}//"42">>>VStk:["42"]
defNumber =rule{capture(Digits)~>(_.toInt)}"42">>>//VStk:[42]
defSum =rule{Number~""~Number~>((_:Int)+_)}//"1115">>>VStk:[26]
калькулятор
classCalculatorParser(valinput:ParserInput)extendsParser{
defExpression:Rule1[Int]=rule{
Term~zeroOrMore(
'+'~Term~>((_:Int)+_)
|'-'~Term~>((_:Int)-_))
}
defTerm=rule{
Factor~zeroOrMore(
'*'~Factor~>((_:Int)*_)
|'/'~Factor~>((_:Int)/_))
}
}
`~>` может передавать элемент AST в стек
`~>`-обработчик сам может быть парсером
типизация правил и value-stack
defInputRule:Rule[HNil,String::HNil]=rule{capture("a")}
classRule[-I<:HList,+O<:HList]
I-типзначениясостека
O-типзначениявстек
typeRuleN[L<:HList]=Rule[HNil,L]
typeRule0=RuleN[HNil]
typeRule1[T]=RuleN[T::HNil]
typeRule2[A,B]=RuleN[A::B::HNil]
типизация правил и value-stack
defa: Rule1[String]=rule{capture("a")}
defb: Rule1[String]=rule{capture("7")}
defbi:Rule1[Int] =rule{b~>((_:String).toInt)}
типизация правил и value-stack
defc1:Rule2[String,Int]=rule{a~bi}
defc2:Rule2[Int,Int]=rule{bi~push(42)}
defc3:Rule[Int::HNil,Int::HNil]=rule{capture("7")~>((x:Int,y:String)=>x+y.toInt)}
компиляция
abstractclassParser{
defrule(r:Rule):Rule=macroParser.ruleImpl
}
objectParser{
defruleImpl(ctx:ParserContext)(r:ctx.Expr[Rule]):ctx.Expr[Rule]=
reify{
OpTree(r.tree).render().splice
}
}
компиляция
objectOpTree{
defapply(tree:Tree):OpTree=
r.treematch{//квазицитирования
caseq"$a.this.str($s)"=>LiteralString(s)
caseq"$a.this.ch($ch)"=>LiteralChar(ch)
caseq"$lhs.|($rhs)" =>FirstOf(OpTree(lhs),OpTree(rhs))
caseq"$lhs.~($rhs)" =>Sequence(OpTree(lhs),OpTree(rhs))
}
}
abstractclassOpTree{
defrender():Expr[Rule]
}
caseclassRule(valmatched:Boolean)
LiteralChar
implicitdefch(c:Char):Rule0
rule{ch('a')}
caseq"$a.this.ch($ch)"=>//$a=CalculatorParser,$ch=CharLiteral('a')
caseclassLiteralChar(charTree:Tree)extendsOpTree{
defrender():Expr[Rule]=reify{
valchar=c.Expr[Char](charTree).splice
valp=c.prefix.splice//Currentparser
Rule(p.__nextChar()==char)
}
}
LiteralString
implicitdefstr(c:String):Rule0
rule{str("abc")}
caseq"$a.this.str($s)"=>//$a=CalculatorParser,$s=StringLiteral("abc")
caseclassLiteralString(s:Tree)extendsOpTree{
defrender():Expr[Rule]=c.Expr[Rule](q`
valp=${c.prefix}//Currentparser
varix=0
while(ix<$s.length&&$s.charAt(ix)==p.__nextChar()){
ix+=1
}
Rule(ix==$s.length)
`)
FirstOf: a | b
//caseq"$lhs.|($rhs)"=>
caseclassFirstOf(charTree:Tree)extendsOpTree{
defrender():Expr[Rule]=c.Expr[Rule](q`
valmark=p.__cursor
if(${OpTree(lhs).render()}.matched){
Rule(true)
}else{
p.__cursor=mark
${OpTree(rhs).render()}
}
`)
}
Sequence: a ~ b
//caseq"$lhs.~($rhs)"=>
caseclassFirstOf(charTree:Tree)extendsOpTree{
defrender():Expr[Rule]=c.Expr[Rule](q`
Rule(${OpTree(lhs).render()}.matched&&${OpTree(rhs).render()}.matched)
`)
}
parboiled2.org
oneOrMore
zeroOrMore
~>
...
использование
json-парсер в ~100 быстрее Scala Parsers, в ~10 parboiled1
typesafe, spray.io, spray-json
parboiled2.org
linkedin.com/in/alexandermyltsev
вопросы

Contenu connexe

Tendances

functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'110xffAA
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Alexey Paznikov
 
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Alexey Paznikov
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Yauheni Akhotnikau
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыcorehard_by
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 СтруктурыDEVTYPE
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1igorm9so
 
1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#Olga Maksimenkova
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#Dmitri Soshnikov
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.Dev2Dev
 
Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)Alexandr Konfidentsialno
 
Теории и практики фунционального программирования - GDG D2D
Теории и практики фунционального программирования - GDG D2DТеории и практики фунционального программирования - GDG D2D
Теории и практики фунционального программирования - GDG D2D0xffAA
 
2. Операторы языка C#
2. Операторы языка C#2. Операторы языка C#
2. Операторы языка C#Olga Maksimenkova
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
апкс 2011 04_verilog_продолж
апкс 2011 04_verilog_продолжапкс 2011 04_verilog_продолж
апкс 2011 04_verilog_продолжIrina Hahanova
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 

Tendances (19)

functional patterns - dotnetconf'11
functional patterns - dotnetconf'11functional patterns - dotnetconf'11
functional patterns - dotnetconf'11
 
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
Лекция 6. Параллельная сортировка. Алгоритмы комбинаторного поиска. Параллель...
 
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Конкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнерыКонкурентные ассоциативные контейнеры
Конкурентные ассоциативные контейнеры
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 Структуры
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1
 
паскаль
паскальпаскаль
паскаль
 
1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#1. Типы данных. Операции. Ввод и вывод C#
1. Типы данных. Операции. Ввод и вывод C#
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Теории и практики функционального программирования.
Теории и практики функционального программирования.Теории и практики функционального программирования.
Теории и практики функционального программирования.
 
Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)Программирование на языке C Sharp (СИ решетка)
Программирование на языке C Sharp (СИ решетка)
 
Теории и практики фунционального программирования - GDG D2D
Теории и практики фунционального программирования - GDG D2DТеории и практики фунционального программирования - GDG D2D
Теории и практики фунционального программирования - GDG D2D
 
2. Операторы языка C#
2. Операторы языка C#2. Операторы языка C#
2. Операторы языка C#
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
апкс 2011 04_verilog_продолж
апкс 2011 04_verilog_продолжапкс 2011 04_verilog_продолж
апкс 2011 04_verilog_продолж
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 

En vedette

Webcam y tablas digitales.
Webcam y tablas digitales.Webcam y tablas digitales.
Webcam y tablas digitales.LLuvias_01
 
#Jornal do Sertão Edição 104 Outubro 2014
#Jornal do Sertão Edição 104 Outubro 2014 #Jornal do Sertão Edição 104 Outubro 2014
#Jornal do Sertão Edição 104 Outubro 2014 JORNAL DO SERTÃO Enes
 
Mercredi 30 et jeudi 31 mars 2016 | Gérer un recours produit : conditions de ...
Mercredi 30 et jeudi 31 mars 2016 | Gérer un recours produit : conditions de ...Mercredi 30 et jeudi 31 mars 2016 | Gérer un recours produit : conditions de ...
Mercredi 30 et jeudi 31 mars 2016 | Gérer un recours produit : conditions de ...Market iT
 
Présentation du Revenu de Base Inconditionnel - initiative populaire suisse ...
Présentation du Revenu de Base Inconditionnel - initiative populaire suisse ...Présentation du Revenu de Base Inconditionnel - initiative populaire suisse ...
Présentation du Revenu de Base Inconditionnel - initiative populaire suisse ...Mathieu Despont
 
Wealth Management: Traveling the Social Street to Influence Minds and Investm...
Wealth Management: Traveling the Social Street to Influence Minds and Investm...Wealth Management: Traveling the Social Street to Influence Minds and Investm...
Wealth Management: Traveling the Social Street to Influence Minds and Investm...Cognizant
 
SISTEMA REGIONAL DE ESTADÍSTICAS DE TURISMO. Una aproximación estratégica
SISTEMA REGIONAL DE ESTADÍSTICAS DE TURISMO. Una aproximación estratégicaSISTEMA REGIONAL DE ESTADÍSTICAS DE TURISMO. Una aproximación estratégica
SISTEMA REGIONAL DE ESTADÍSTICAS DE TURISMO. Una aproximación estratégicaInstituto Canario de Estadística (ISTAC)
 
Radio Trailer Production Process
Radio Trailer Production ProcessRadio Trailer Production Process
Radio Trailer Production ProcessDaniel Williams
 
Menea tu chapa v
Menea tu chapa  vMenea tu chapa  v
Menea tu chapa vSamyFaz
 
Causas das doencas de acordo com paracelso
Causas das doencas de acordo com paracelso Causas das doencas de acordo com paracelso
Causas das doencas de acordo com paracelso Fernanda Checchinato
 
Conspiraciones de la internet
Conspiraciones de la internet Conspiraciones de la internet
Conspiraciones de la internet lirek
 
Info. Blogger
Info. BloggerInfo. Blogger
Info. Bloggercarloshbv
 

En vedette (20)

Webcam y tablas digitales.
Webcam y tablas digitales.Webcam y tablas digitales.
Webcam y tablas digitales.
 
#Jornal do Sertão Edição 104 Outubro 2014
#Jornal do Sertão Edição 104 Outubro 2014 #Jornal do Sertão Edição 104 Outubro 2014
#Jornal do Sertão Edição 104 Outubro 2014
 
Mercredi 30 et jeudi 31 mars 2016 | Gérer un recours produit : conditions de ...
Mercredi 30 et jeudi 31 mars 2016 | Gérer un recours produit : conditions de ...Mercredi 30 et jeudi 31 mars 2016 | Gérer un recours produit : conditions de ...
Mercredi 30 et jeudi 31 mars 2016 | Gérer un recours produit : conditions de ...
 
Eva (fotos dap)
Eva (fotos dap)Eva (fotos dap)
Eva (fotos dap)
 
Revista 52
Revista 52Revista 52
Revista 52
 
Romanticismo Seraphine
Romanticismo SeraphineRomanticismo Seraphine
Romanticismo Seraphine
 
Silent Spring Study on Drinking Water
Silent Spring Study on Drinking WaterSilent Spring Study on Drinking Water
Silent Spring Study on Drinking Water
 
Présentation du Revenu de Base Inconditionnel - initiative populaire suisse ...
Présentation du Revenu de Base Inconditionnel - initiative populaire suisse ...Présentation du Revenu de Base Inconditionnel - initiative populaire suisse ...
Présentation du Revenu de Base Inconditionnel - initiative populaire suisse ...
 
Innovación educativa con recursos abiertos. Actividad semana 1
Innovación educativa con recursos abiertos. Actividad semana 1Innovación educativa con recursos abiertos. Actividad semana 1
Innovación educativa con recursos abiertos. Actividad semana 1
 
Wealth Management: Traveling the Social Street to Influence Minds and Investm...
Wealth Management: Traveling the Social Street to Influence Minds and Investm...Wealth Management: Traveling the Social Street to Influence Minds and Investm...
Wealth Management: Traveling the Social Street to Influence Minds and Investm...
 
3rd Semester Mechanical Engineering (June/July-2015) Question Papers
3rd Semester Mechanical Engineering  (June/July-2015) Question Papers3rd Semester Mechanical Engineering  (June/July-2015) Question Papers
3rd Semester Mechanical Engineering (June/July-2015) Question Papers
 
Pissing against the wind
Pissing against the windPissing against the wind
Pissing against the wind
 
SISTEMA REGIONAL DE ESTADÍSTICAS DE TURISMO. Una aproximación estratégica
SISTEMA REGIONAL DE ESTADÍSTICAS DE TURISMO. Una aproximación estratégicaSISTEMA REGIONAL DE ESTADÍSTICAS DE TURISMO. Una aproximación estratégica
SISTEMA REGIONAL DE ESTADÍSTICAS DE TURISMO. Una aproximación estratégica
 
Radio Trailer Production Process
Radio Trailer Production ProcessRadio Trailer Production Process
Radio Trailer Production Process
 
Menea tu chapa v
Menea tu chapa  vMenea tu chapa  v
Menea tu chapa v
 
Catalogo turistico del Sud Est Barese
Catalogo turistico del Sud Est BareseCatalogo turistico del Sud Est Barese
Catalogo turistico del Sud Est Barese
 
Causas das doencas de acordo com paracelso
Causas das doencas de acordo com paracelso Causas das doencas de acordo com paracelso
Causas das doencas de acordo com paracelso
 
Conspiraciones de la internet
Conspiraciones de la internet Conspiraciones de la internet
Conspiraciones de la internet
 
Info. Blogger
Info. BloggerInfo. Blogger
Info. Blogger
 
Miriam makeba
Miriam makebaMiriam makeba
Miriam makeba
 

Similaire à parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+

Введение в синтаксис C++, часть 2
Введение в синтаксис C++, часть 2Введение в синтаксис C++, часть 2
Введение в синтаксис C++, часть 2DEVTYPE
 
Оптимизация в мире 64-битных ошибок
Оптимизация  в мире 64-битных ошибокОптимизация  в мире 64-битных ошибок
Оптимизация в мире 64-битных ошибокTatyanazaxarova
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Алексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
Алексей Чернигин — Магия метапрограммирования на примере Boost.GeometryАлексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
Алексей Чернигин — Магия метапрограммирования на примере Boost.GeometryYandex
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиTatyanazaxarova
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Andrey Karpov
 
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Ontico
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кодаTatyanazaxarova
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаAndrey Karpov
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarova
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутAndrey Karpov
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Yandex
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... кодеTatyanazaxarova
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 

Similaire à parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+ (20)

Введение в синтаксис C++, часть 2
Введение в синтаксис C++, часть 2Введение в синтаксис C++, часть 2
Введение в синтаксис C++, часть 2
 
Оптимизация в мире 64-битных ошибок
Оптимизация  в мире 64-битных ошибокОптимизация  в мире 64-битных ошибок
Оптимизация в мире 64-битных ошибок
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Алексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
Алексей Чернигин — Магия метапрограммирования на примере Boost.GeometryАлексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
Алексей Чернигин — Магия метапрограммирования на примере Boost.Geometry
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
 
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
Чем заняться вечером, если я знаю сколько будет ++i + ++i / Андрей Бородин (Y...
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Статический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минутСтатический анализ: вокруг Java за 60 минут
Статический анализ: вокруг Java за 60 минут
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
По колено в Си++ г... коде
По колено в Си++ г... кодеПо колено в Си++ г... коде
По колено в Си++ г... коде
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 

parboiled2 – A Macro-Based PEG Parser Generator for Scala 2.10.3+