SlideShare une entreprise Scribd logo
1  sur  56
Télécharger pour lire hors ligne
@dbolkensteyn @_godin_#parsing
The Art of Parsing
Evgeny Mandrikov @_godin_
Dinesh Bolkensteyn @dbolkensteyn
http://sonarsource.com
@dbolkensteyn @_godin_#parsing 2/56
The Art of Parsing
// TODO: don't forget to add huge disclaimer that all opinions hereinbelow
are our own and not our employer (they wish they had them)
Evgeny Mandrikov
@_godin_
Dinesh Bolkensteyn
@dbolkensteyn
@dbolkensteyn @_godin_#parsing 3/56
I want to create a parser
«Done»!
Use Yacc, JavaCC,
ANTLR, SSLR, …
or hand-written ?
@dbolkensteyn @_godin_#parsing 4/56
What is the plan?
Why
• javac and GCC are hand-written
• do we use parser-generators ?
Together we will implement parser for
• arithmetic expressions
• common constructions from Java
• C++ ;)
@dbolkensteyn @_godin_#parsing 5/56
Java formal grammar
JLS8
JLS7
@dbolkensteyn @_godin_#parsing 6/56
Answer is
42
@dbolkensteyn @_godin_#parsing 7/56
Pill of theory
NUM ➙ 42
Nonterminal
Productions
Terminals
(tokens)
@dbolkensteyn @_godin_#parsing 8/56
Grammar for numbers
NUM ➙ NUM DIGIT
| DIGIT
DIGIT ➙ 0|1|2|3|4|5|6|7|8|9
4, 8, 15, 16, 23, 42,…
Alternatives
@dbolkensteyn @_godin_#parsing 9/56
Arithmetic expressions
4 – 3 – 2 = ?
@dbolkensteyn @_godin_#parsing 10/56
expr ➙ expr – expr
| NUM
Arithmetic expressions
4 – 3 – 2 = ?
@dbolkensteyn @_godin_#parsing 11/56
Arithmetic expressions
expr
4 3
2
expr
expr ➙ expr – expr
| NUM
(4 – 3)– 2 =-1
@dbolkensteyn @_godin_#parsing 12/56
Arithmetic expressions
4
3 2
expr
expr
expr ➙ expr – expr
| NUM
(4 – 3)– 2 =-1
4 –(3 – 2)= 3
expr
4 3
2
expr
@dbolkensteyn @_godin_#parsing 13/56
Arithmetic expressions
expr ➙ NUM – expr
| NUM
expr ➙ expr – expr
| NUM
(4 – 3)– 2 =-1
4 –(3 – 2)= 3
expr
4 3
2
expr 4
3 2
expr
expr
@dbolkensteyn @_godin_#parsing 14/56
Arithmetic expressions
expr ➙ NUM – expr
| NUM
expr ➙ expr – expr
| NUM
expr ➙ expr – NUM
| NUM
(4 – 3)– 2 =-1
4 –(3 – 2)= 3
4
3 2
expr
expr
expr
4 3
2
expr
@dbolkensteyn @_godin_#parsing 15/56
Show me the code
int expr() {
int res = expr();
if (token == '–')
return res – num();
return num();
}
int expr() {
int res = expr();
if (token == '–')
return res – num();
return num();
}
expr ➙ expr – NUM
| NUM
@dbolkensteyn @_godin_#parsing 16/56
Show me the code right code
??
int expr() {
int res = expr();
if (token == '–')
return res – num();
return num();
}
int expr() {
int res = expr();
if (token == '–')
return res – num();
return num();
}
expr ➙ expr – NUM
| NUM
@dbolkensteyn @_godin_#parsing 17/56
Show me the code right code
int expr() {
int res = expr();
if (token == '–')
return res – num();
return num();
}
int expr() {
int res = expr();
if (token == '–')
return res – num();
return num();
}
expr ➙ expr – NUM
| NUM
int expr() {
int res = num();
while (token == '–')
res = res – num();
return res;
}
int expr() {
int res = num();
while (token == '–')
res = res – num();
return res;
}
@dbolkensteyn @_godin_#parsing 18/56
Arithmetic expressions
4 – 3 * 2 = ?
@dbolkensteyn @_godin_#parsing 19/56
Arithmetic expressions
4 – 3 * 2 = -2
expr ➙ expr – NUM
| expr * NUM
| NUM
@dbolkensteyn @_godin_#parsing 20/56
Arithmetic expressions
4 –(3 * 2)= -2
(4 – 3)* 2 = 2
expr ➙ expr – NUM
| expr * NUM
| NUM
@dbolkensteyn @_godin_#parsing 21/56
Arithmetic expressions
subs ➙ subs – mult
| mult
mult ➙ mult * NUM
| NUM
4 –(3 * 2)= -2
@dbolkensteyn @_godin_#parsing 22/56
Show me the code
int subs() {
res = mult() ;
while (token == '–')
res = res – mult();
return res;
}
int mult() {
int res = num();
while (token == '*')
res = res * num();
return res;
}
int subs() {
res = mult() ;
while (token == '–')
res = res – mult();
return res;
}
int mult() {
int res = num();
while (token == '*')
res = res * num();
return res;
}
subs ➙ subs – mult
| mult
mult ➙ mult * NUM
| NUM
@dbolkensteyn @_godin_#parsing 23/56
LL(1)
●
back to 1969
●
one token lookahead
●
no left-recursion
@dbolkensteyn @_godin_#parsing 24/56
What is the plan?
✔ arithmetic expressions
✔ LL(1)
• a few common constructions from Java
• C++ ;)
@dbolkensteyn @_godin_#parsing 25/56
The real deal
expr-stmt ➙ expr ; obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 26/56
The real deal
expr-stmt ➙ expr ;
expr ➙ field-access
| method-call
| assignment
obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 27/56
The real deal
expr-stmt ➙ expr ;
expr ➙ field-access
| method-call
| assignment
field-access ➙ qualified-id
qualified-id ➙ qualified-id . id
| id
obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 28/56
The real deal
expr-stmt ➙ expr ;
expr ➙ field-access
| method-call
| assignment
field-access ➙ qualified-id
qualified-id ➙ qualified-id . id
| id
method-call ➙ qualified-id ()
obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 29/56
The real deal
expr-stmt ➙ expr ;
expr ➙ field-access
| method-call
| assignment
field-access ➙ qualified-id
qualified-id ➙ qualified-id . id
| id
method-call ➙ qualified-id ()
assignment ➙ qualified-id = expr
obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 30/56
int qualified_id() { /* easy */ }
int field_access() { /* easy */ }
int method_call() { /* easy */ }
int assignment() { /* easy */ }
int expr() {
// ???
}
int qualified_id() { /* easy */ }
int field_access() { /* easy */ }
int method_call() { /* easy */ }
int assignment() { /* easy */ }
int expr() {
// ???
}
Show me the code
expr-stmt ➙ expr ;
expr ➙ field-access
| method-call
| assignment
field-access ➙ qualified-id
qualified-id ➙ qualified-id . id
| id
method-call ➙ qualified-id ()
assignment ➙ qualified-id = expr
obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 31/56
int expr() {
String id = qualified_id();
if (token == '(')
return method_call();
else if (token == '=')
return assignment();
else
return field_access();
}
int expr() {
String id = qualified_id();
if (token == '(')
return method_call();
else if (token == '=')
return assignment();
else
return field_access();
}
The LL(1) way
expr ➙ field-access
| method-call
| assignment
obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 32/56
Reality
http://hg.openjdk.java.net/jdk8/jdk8/langtools/.../JavacParser.java
@dbolkensteyn @_godin_#parsing 33/56
The better way
expr ➙ field-access
| method-call
| assignment
int expr() {
try { return field_access(); }
catch (RE e1) {
try { return method_call(); }
catch (RE e2) {
return assignment();
}
}
}
int expr() {
try { return field_access(); }
catch (RE e1) {
try { return method_call(); }
catch (RE e2) {
return assignment();
}
}
}
obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 34/56
int expr() {
try { return method_call() ; }
catch (RE e1) {
try { return assignment(); }
catch (RE e2) {
return field_access();
}
}
}
int expr() {
try { return method_call() ; }
catch (RE e1) {
try { return assignment(); }
catch (RE e2) {
return field_access();
}
}
}
Show me the code right code
expr ➙ method-call
/ assignment
/ field-access
obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 35/56
Parsing Expression Grammars
●
2002
●
ordered choice «/»
●
backtracking
●
no left-recursion
@dbolkensteyn @_godin_#parsing 36/56
enum Nonterminals { EXPR, METHOD_CALL, … }
void grammar() {
rule(EXPR).is(
firstOf(
METHOD_CALL,
ASSIGNMENT,
FIELD_ACCESS));
}
enum Nonterminals { EXPR, METHOD_CALL, … }
void grammar() {
rule(EXPR).is(
firstOf(
METHOD_CALL,
ASSIGNMENT,
FIELD_ACCESS));
}
DSL for PEG
expr ➙ method-call
/ assignment
/ field-access
obj.method();
a = obj.field;
obj.method();
a = obj.field;
@dbolkensteyn @_godin_#parsing 37/56
What is the plan?
✔ arithmetic expressions
✔ LL(1)
✔ common constructions from Java
✔ PEG
• C++ ;)
@YourTwitterHandle#DVXFR14{session hashtag} @dbolkensteyn @_godin_#parsing
Tea
Break
@dbolkensteyn @_godin_#parsing 39/56
if (false)
if (true) System.out.println("foo");
else System.out.println("bar");
if (false)
if (true) System.out.println("foo");
else System.out.println("bar");
Quiz
@dbolkensteyn @_godin_#parsing 40/56
if (false)
if (true) System.out.println("foo");
else System.out.println("bar");
if (false)
if (true) System.out.println("foo");
else System.out.println("bar");
«Dangling else»
if-stmt ➙ IF (cond) stmt ELSE stmt
/ IF (cond) stmt
@dbolkensteyn @_godin_#parsing 41/56
Java is awesome
(A)*B(A)*B
@dbolkensteyn @_godin_#parsing 42/56
C++ all the pains of the world
int *B;
typedef int A;
(A)*B; // cast to type 'A' ('int' alias)
// of dereference of expression 'B'
int A, B;
(A)*B; // multiplication of 'A' and 'B'
// with redundant parenthesis around 'A'
int *B;
typedef int A;
(A)*B; // cast to type 'A' ('int' alias)
// of dereference of expression 'B'
int A, B;
(A)*B; // multiplication of 'A' and 'B'
// with redundant parenthesis around 'A'
Java is good, because it
was influenced by bad experience of C++ (A)*B(A)*B
@dbolkensteyn @_godin_#parsing 43/56
rule(MUL_EXPR).is(
UNARY_EXPR, zeroOrMore('*', UNARY_EXPR));
rule(UNARY_EXPR).is(
firstOf(
sequence('(', TYPE_ID, ')', UNARY_EXPR),
PRIMARY,
sequence('*', UNARY_EXPR)));
rule(PRIMARY).is(
firstOf(
sequence('(', EXPR, ')'),
ID));
rule(MUL_EXPR).is(
UNARY_EXPR, zeroOrMore('*', UNARY_EXPR));
rule(UNARY_EXPR).is(
firstOf(
sequence('(', TYPE_ID, ')', UNARY_EXPR),
PRIMARY,
sequence('*', UNARY_EXPR)));
rule(PRIMARY).is(
firstOf(
sequence('(', EXPR, ')'),
ID));
Hit the wall !
(A)*B(A)*B
@dbolkensteyn @_godin_#parsing 44/56
rule(MUL_EXPR).is(
UNARY_EXPR, zeroOrMore('*', UNARY_EXPR));
rule(UNARY_EXPR).is(
firstOf(
sequence('(', TYPE_ID, ')', UNARY_EXPR),
PRIMARY,
sequence('*', UNARY_EXPR)));
rule(PRIMARY).is(
firstOf(
sequence('(', EXPR, ')'),
ID));
rule(MUL_EXPR).is(
UNARY_EXPR, zeroOrMore('*', UNARY_EXPR));
rule(UNARY_EXPR).is(
firstOf(
sequence('(', TYPE_ID, ')', UNARY_EXPR),
PRIMARY,
sequence('*', UNARY_EXPR)));
rule(PRIMARY).is(
firstOf(
sequence('(', EXPR, ')'),
ID));
Hit the wall !
(A)*B(A)*B
@dbolkensteyn @_godin_#parsing 45/56
Dream
mul-expr ➙ mul-expr * unary-expr
| unary-expr
unary-expr ➙ ( type-id ) unary-expr
  | * unary-expr
| primary
primary ➙ ( expr )
| id
(A)*B(A)*B
@dbolkensteyn @_godin_#parsing 46/56
Generalized parsers
●
Earley (1968)
●
slow
●
GLR (1984)
●
complex
@dbolkensteyn @_godin_#parsing 47/56
Chicken and egg problem
(A)*B
unary-expr mul-expr
(A) (A)*B
B*...
(A)*B(A)*B
mul-expr ➙ mul-expr * unary-expr
| unary-expr
unary-expr ➙ ( type-id ) unary-expr
  | * unary-expr
| primary
primary ➙ ( expr )
| id
@dbolkensteyn @_godin_#parsing 48/56
Back to the future «dangling else» 
if (…)
if (…) then-stmt
else else-stmt
if (…)
if (…) then-stmt
else else-stmt
outer-if
inner-if inner-if
then-stmt else-stmt
inner-if · else-stmt
@dbolkensteyn @_godin_#parsing 49/56
GLL : How does it work ?
mul-expr ➙ mul-expr * unary-expr
| unary-expr
@dbolkensteyn @_godin_#parsing 50/56
Generalized LL
●
2010
●
no grammar left behind
(left-recursive, ambiguous)
●
simpler than GLR
●
syntactic ambiguities
@YourTwitterHandle#DVXFR14{session hashtag} @dbolkensteyn @_godin_#parsing
Sum
m
ary
@dbolkensteyn @_godin_#parsing 52/56
Summary
LL(1)
• trivial
• major grammar changes
• only good for arithmetic expressions
• on steroids as in JavaCC usable for
real languages
@dbolkensteyn @_godin_#parsing 53/56
Summary
PEG
• trivial
• fewer grammar changes
• no ambiguities
• usable for real languages
• nice tools such as SSLR
• dead-end for C/C++
@dbolkensteyn @_godin_#parsing 54/56
Summary
GLL
• any grammar
• relatively simple
• ambiguities
• reasonable performances
• the only clean choice for C/C++
• only «academic» tools for now... ;)
@dbolkensteyn @_godin_#parsing 55/56
Summary
Hand-written
●
based on LL(1)
●
precise error-reporting
and recovery
●
best performances
●
maintainance hell
@YourTwitterHandle#DVXFR14{session hashtag} @dbolkensteyn @_godin_#parsing
Q
&
A

Contenu connexe

Tendances

What We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit TestingWhat We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit TestingKevlin Henney
 
Compiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersCompiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersEelco Visser
 
Programming with GUTs
Programming with GUTsProgramming with GUTs
Programming with GUTsKevlin Henney
 
SWP - A Generic Language Parser
SWP - A Generic Language ParserSWP - A Generic Language Parser
SWP - A Generic Language Parserkamaelian
 
Achieving Parsing Sanity In Erlang
Achieving Parsing Sanity In ErlangAchieving Parsing Sanity In Erlang
Achieving Parsing Sanity In ErlangSean Cribbs
 
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingCompiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingEelco Visser
 
Compiler Construction | Lecture 2 | Declarative Syntax Definition
Compiler Construction | Lecture 2 | Declarative Syntax DefinitionCompiler Construction | Lecture 2 | Declarative Syntax Definition
Compiler Construction | Lecture 2 | Declarative Syntax DefinitionEelco Visser
 
Python quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung FuPython quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung Fuclimatewarrior
 
Zend Certification Preparation Tutorial
Zend Certification Preparation TutorialZend Certification Preparation Tutorial
Zend Certification Preparation TutorialLorna Mitchell
 
Elixir formatter Internals
Elixir formatter InternalsElixir formatter Internals
Elixir formatter InternalsPedro Medeiros
 
Dns server clients (actual program)
Dns server clients (actual program)Dns server clients (actual program)
Dns server clients (actual program)Youssef Dirani
 
C++ L03-Control Structure
C++ L03-Control StructureC++ L03-Control Structure
C++ L03-Control StructureMohammad Shaker
 
Boost.Interfaces
Boost.InterfacesBoost.Interfaces
Boost.Interfacesmelpon
 

Tendances (20)

Functional C++
Functional C++Functional C++
Functional C++
 
What We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit TestingWhat We Talk About When We Talk About Unit Testing
What We Talk About When We Talk About Unit Testing
 
C Tutorials
C TutorialsC Tutorials
C Tutorials
 
Compiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersCompiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | Interpreters
 
Programming with GUTs
Programming with GUTsProgramming with GUTs
Programming with GUTs
 
SWP - A Generic Language Parser
SWP - A Generic Language ParserSWP - A Generic Language Parser
SWP - A Generic Language Parser
 
Achieving Parsing Sanity In Erlang
Achieving Parsing Sanity In ErlangAchieving Parsing Sanity In Erlang
Achieving Parsing Sanity In Erlang
 
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingCompiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
 
Compiler Construction | Lecture 2 | Declarative Syntax Definition
Compiler Construction | Lecture 2 | Declarative Syntax DefinitionCompiler Construction | Lecture 2 | Declarative Syntax Definition
Compiler Construction | Lecture 2 | Declarative Syntax Definition
 
Python quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung FuPython quickstart for programmers: Python Kung Fu
Python quickstart for programmers: Python Kung Fu
 
Zend Certification Preparation Tutorial
Zend Certification Preparation TutorialZend Certification Preparation Tutorial
Zend Certification Preparation Tutorial
 
C++ L04-Array+String
C++ L04-Array+StringC++ L04-Array+String
C++ L04-Array+String
 
Buffer OverFlow
Buffer OverFlowBuffer OverFlow
Buffer OverFlow
 
C++ L05-Functions
C++ L05-FunctionsC++ L05-Functions
C++ L05-Functions
 
C
CC
C
 
Elixir formatter Internals
Elixir formatter InternalsElixir formatter Internals
Elixir formatter Internals
 
Dns server clients (actual program)
Dns server clients (actual program)Dns server clients (actual program)
Dns server clients (actual program)
 
C tutorial
C tutorialC tutorial
C tutorial
 
C++ L03-Control Structure
C++ L03-Control StructureC++ L03-Control Structure
C++ L03-Control Structure
 
Boost.Interfaces
Boost.InterfacesBoost.Interfaces
Boost.Interfaces
 

Similaire à The Art Of Parsing @ Devoxx France 2014

Stupid Awesome Python Tricks
Stupid Awesome Python TricksStupid Awesome Python Tricks
Stupid Awesome Python TricksBryan Helmig
 
What's in Groovy for Functional Programming
What's in Groovy for Functional ProgrammingWhat's in Groovy for Functional Programming
What's in Groovy for Functional ProgrammingNaresha K
 
Ast transformations
Ast transformationsAst transformations
Ast transformationsHamletDRC
 
Round PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing FunctionallyRound PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing FunctionallySean Cribbs
 
Vavr Java User Group Rheinland
Vavr Java User Group RheinlandVavr Java User Group Rheinland
Vavr Java User Group RheinlandDavid Schmitz
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokusHamletDRC
 
Expression trees in C#
Expression trees in C#Expression trees in C#
Expression trees in C#Oleksii Holub
 
Oleksii Holub "Expression trees in C#"
Oleksii Holub "Expression trees in C#" Oleksii Holub "Expression trees in C#"
Oleksii Holub "Expression trees in C#" Fwdays
 
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguajeKotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguajeVíctor Leonel Orozco López
 
Beautiful PHP CLI Scripts
Beautiful PHP CLI ScriptsBeautiful PHP CLI Scripts
Beautiful PHP CLI ScriptsJesse Donat
 
Implementing pattern-matching in JavaScript (full version)
Implementing pattern-matching in JavaScript (full version)Implementing pattern-matching in JavaScript (full version)
Implementing pattern-matching in JavaScript (full version)François-Guillaume Ribreau
 
Expression trees in c#
Expression trees in c#Expression trees in c#
Expression trees in c#Oleksii Holub
 
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...James Titcumb
 
Compilation of COSMO for GPU using LLVM
Compilation of COSMO for GPU using LLVMCompilation of COSMO for GPU using LLVM
Compilation of COSMO for GPU using LLVMLinaro
 
PHP Static Code Review
PHP Static Code ReviewPHP Static Code Review
PHP Static Code ReviewDamien Seguy
 
Expression trees in c#, Алексей Голубь (Svitla Systems)
Expression trees in c#, Алексей Голубь (Svitla Systems)Expression trees in c#, Алексей Голубь (Svitla Systems)
Expression trees in c#, Алексей Голубь (Svitla Systems)Alina Vilk
 
C# 7.0 Hacks and Features
C# 7.0 Hacks and FeaturesC# 7.0 Hacks and Features
C# 7.0 Hacks and FeaturesAbhishek Sur
 

Similaire à The Art Of Parsing @ Devoxx France 2014 (20)

Stop Monkeys Fall
Stop Monkeys FallStop Monkeys Fall
Stop Monkeys Fall
 
Stupid Awesome Python Tricks
Stupid Awesome Python TricksStupid Awesome Python Tricks
Stupid Awesome Python Tricks
 
What's in Groovy for Functional Programming
What's in Groovy for Functional ProgrammingWhat's in Groovy for Functional Programming
What's in Groovy for Functional Programming
 
Ast transformations
Ast transformationsAst transformations
Ast transformations
 
Round PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing FunctionallyRound PEG, Round Hole - Parsing Functionally
Round PEG, Round Hole - Parsing Functionally
 
Vavr Java User Group Rheinland
Vavr Java User Group RheinlandVavr Java User Group Rheinland
Vavr Java User Group Rheinland
 
AST Transformations at JFokus
AST Transformations at JFokusAST Transformations at JFokus
AST Transformations at JFokus
 
Expression trees in C#
Expression trees in C#Expression trees in C#
Expression trees in C#
 
Oleksii Holub "Expression trees in C#"
Oleksii Holub "Expression trees in C#" Oleksii Holub "Expression trees in C#"
Oleksii Holub "Expression trees in C#"
 
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguajeKotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
 
Beautiful PHP CLI Scripts
Beautiful PHP CLI ScriptsBeautiful PHP CLI Scripts
Beautiful PHP CLI Scripts
 
Implementing pattern-matching in JavaScript (full version)
Implementing pattern-matching in JavaScript (full version)Implementing pattern-matching in JavaScript (full version)
Implementing pattern-matching in JavaScript (full version)
 
Function & Recursion
Function & RecursionFunction & Recursion
Function & Recursion
 
Expression trees in c#
Expression trees in c#Expression trees in c#
Expression trees in c#
 
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
Mirror, mirror on the wall - Building a new PHP reflection library (Nomad PHP...
 
Compilation of COSMO for GPU using LLVM
Compilation of COSMO for GPU using LLVMCompilation of COSMO for GPU using LLVM
Compilation of COSMO for GPU using LLVM
 
PHP Static Code Review
PHP Static Code ReviewPHP Static Code Review
PHP Static Code Review
 
Expression trees in c#, Алексей Голубь (Svitla Systems)
Expression trees in c#, Алексей Голубь (Svitla Systems)Expression trees in c#, Алексей Голубь (Svitla Systems)
Expression trees in c#, Алексей Голубь (Svitla Systems)
 
ES6 is Nigh
ES6 is NighES6 is Nigh
ES6 is Nigh
 
C# 7.0 Hacks and Features
C# 7.0 Hacks and FeaturesC# 7.0 Hacks and Features
C# 7.0 Hacks and Features
 

Dernier

A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 

Dernier (20)

A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 

The Art Of Parsing @ Devoxx France 2014