Metaparse tutorial - The world's leading software · PDF fileThese slides Lab environment ......

150
Metaparse tutorial

Transcript of Metaparse tutorial - The world's leading software · PDF fileThese slides Lab environment ......

Page 1: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Metaparse tutorial

Page 2: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Agenda

DSL embedding in C++: current practice Boost.Xpressive introduction Template metaprogramming introduction Embedding regular expressions

Page 3: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Lab

Detailed tutorial These slides Lab environment Solutions

https://github.com/sabel83/metaparse_tutorial

Page 4: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Mpllibs

Template Metaprogramming libraries http://abel.web.elte.hu/mpllibs

Metaparse Metamonad Safe Printf Xlxpressive

Page 5: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Mpllibs

Ábel Sinkovics Endre Sajó Zoltán Porkoláb István Siroki

Page 6: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Processing DSLs

"a.*a"

developer

Page 7: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Processing DSLs

"a.*a"int main(){ string s; cin << s; sregex r = sregex::compile("a.*a"); smatch w; regex_search(s, w, r); // ...}

main.cpp

developer

Page 8: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Processing DSLs

"a.*a"

"a.*a"

executable

Compilation

int main(){ string s; cin << s; sregex r = sregex::compile("a.*a"); smatch w; regex_search(s, w, r); // ...}

main.cpp

developer

Page 9: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Execution

Processing DSLs

"a.*a"

"a.*a"

"a.*a"

executable

Compilation

int main(){ string s; cin << s; sregex r = sregex::compile("a.*a"); smatch w; regex_search(s, w, r); // ...}

main.cpp

developer

Page 10: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Execution

Processing DSLs

Matchingcode

"a.*a"

"a.*a"

"a.*a"

executable

Compilation

int main(){ string s; cin << s; sregex r = sregex::compile("a.*a"); smatch w; regex_search(s, w, r); // ...}

main.cpp

developer

Page 11: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Execution

Processing DSLs

Matchingcode

"a.*a"

matching...

"a.*a"

"a.*a"

executable

Compilation

int main(){ string s; cin << s; sregex r = sregex::compile("a.*a"); smatch w; regex_search(s, w, r); // ...}

main.cpp

developer

Page 12: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

developer

Processing DSLs

int main(){ string s; cin << s; sregex r =as_xpr('a') >> *_ >> 'a'; smatch w; regex_search(s, w, r); // ...}

main.cpp"a.*a"

Page 13: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

developer

Processing DSLs

Matchingcode

executable

Compilation

int main(){ string s; cin << s; sregex r =as_xpr('a') >> *_ >> 'a'; smatch w; regex_search(s, w, r); // ...}

main.cpp"a.*a"

Page 14: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

developer

Execution

Processing DSLs

Matchingcode

executable

Compilation

int main(){ string s; cin << s; sregex r =as_xpr('a') >> *_ >> 'a'; smatch w; regex_search(s, w, r); // ...}

main.cpp

matching...

"a.*a"

Page 15: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

developer

Execution

Processing DSLs

Matchingcode

executable

Compilation

int main(){ string s; cin << s; sregex r =as_xpr('a') >> *_ >> 'a'; smatch w; regex_search(s, w, r); // ...}

main.cpp

matching...

"a.*a"

Page 16: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Execution

Processing DSLs

matching...

developer

"a.*a"

executable

Compilation

int main(){ string s; cin << s; sregex r = MPLLIBS_REGEX("a.*a"); smatch w; regex_search(s, w, r); // ...}

main.cpp

Matchingcode

Page 17: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Execution

Processing DSLs

matching...

developer

"a.*a"

executable

Compilation

int main(){ string s; cin << s; sregex r = MPLLIBS_REGEX("a.*a"); smatch w; regex_search(s, w, r); // ...}

main.cpp

Matchingcode

Templatemetaprogram

Page 18: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Lab 0

Set up your working environment

git clone https://github.com/sabel83/metaparse_tutorialcd metaparse_tutorial/labmake

Page 19: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Boost.Xpressive

Include the headers

Create a matching object

Do some matching

#include <boost/xpressive/xpressive.hpp>

smatch what;regex_match("abbbbbbbc", what, re);

sregex re = sregex::compile("ab*c");

Page 20: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Lab 1

Try Xpressive yourself Create a number of regular expressions using

Xpressive

"" "a" "abc" "b*" "ab*" "b*c" "ab*c" "a.*c" "a1*c" "(abc)*"

Page 21: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

More Boost.Xpressive

sregex re = sregex::compile("*")

Page 22: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

More Boost.Xpressive

sregex re = sregex::compile("*")

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::xpressive::regex_error>' what(): quantifier not expected

Page 23: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Boost.Xpressive

Dynamic regex

sregex re = sregex::compile("ab*c");

Page 24: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Boost.Xpressive

Dynamic regex

Static regex

sregex re = sregex::compile("ab*c");

sregex re =

Page 25: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Boost.Xpressive

Dynamic regex

Static regex

sregex re = sregex::compile("ab*c");

sregex re = as_xpr('a')

Page 26: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Boost.Xpressive

Dynamic regex

Static regex

sregex re = sregex::compile("ab*c");

sregex re = as_xpr('a') as_xpr('b')

Page 27: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Boost.Xpressive

Dynamic regex

Static regex

sregex re = sregex::compile("ab*c");

sregex re = as_xpr('a') as_xpr('b') as_xpr('c');

Page 28: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Boost.Xpressive

Dynamic regex

Static regex

sregex re = sregex::compile("ab*c");

sregex re = as_xpr('a') *as_xpr('b') as_xpr('c');

Page 29: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Boost.Xpressive

Dynamic regex

Static regex

sregex re = sregex::compile("ab*c");

sregex re = as_xpr('a') >> *as_xpr('b') >> as_xpr('c');

Page 30: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Lab 2

Create the same regular expressions using static regexes of Xpressive

"" "a" "abc" "b*" "ab*" "b*c" "ab*c" "a.*c" "a1*c" "(abc)*"

Page 31: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Safe static regexes

sregex re = as_xpr('a') >> *as_xpr('b') >> as_xpr('c');

sregex re = REGEX("ab*c");

Page 32: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Safe static regexes

sregex re = as_xpr('a') >> *as_xpr('b') >> as_xpr('c');

sregex re = REGEX("ab*c");

Magic happenshere

Page 33: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Safe static regexes

sregex re = as_xpr('a') >> *as_xpr('b') >> as_xpr('c');

sregex re = REGEX("ab*c");

Template metaprogram

Page 34: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

type

Safe static regexes

sregex re = as_xpr('a') >> *as_xpr('b') >> as_xpr('c');

sregex re = REGEX("ab*c");

Template metaprogram

Page 35: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Safe static regexes

sregex re = as_xpr('a') >> *as_xpr('b') >> as_xpr('c');

sregex re = REGEX("ab*c");

Template metaprogram

struct build_my_regex { static sregex run() { return /* … */; }};

Page 36: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Safe static regexes

sregex re = build_my_regex::run();

sregex re = REGEX("ab*c");

Template metaprogram

struct build_my_regex { static sregex run() { return as_xpr('a') >> *as_xpr('b') >> as_xpr('c'); }};

Page 37: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

struct r_a {

};

r_a a

Page 38: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

struct r_a {

static /* ... */ run() {

}};

r_a a

Page 39: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

struct r_a {

static /* ... */ run() { return as_xpr('a'); }};

r_a a

Page 40: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

struct r_a {

static decltype(as_xpr('a')) run() { return as_xpr('a'); }};

r_a a

Page 41: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

struct r_a {

static decltype(as_xpr('a')) run() { return as_xpr('a'); }};

r_a a

#define RUN(...) \ static decltype((__VA_ARGS__)) run() { \ return (__VA_ARGS__); \ }

Page 42: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

struct r_a {

RUN(as_xpr('a' ))

};

r_a a

#define RUN(...) \ static decltype((__VA_ARGS__)) run() { \ return (__VA_ARGS__); \ }

Page 43: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

struct r_a { typedef r_a type;

RUN(as_xpr('a' ))

};

r_a a

#define RUN(...) \ static decltype((__VA_ARGS__)) run() { \ return (__VA_ARGS__); \ }

Page 44: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <char C>struct r_char { typedef r_char type;

RUN(as_xpr(C ))

};

r_char< 'a' >a

#define RUN(...) \ static decltype((__VA_ARGS__)) run() { \ return (__VA_ARGS__); \ }

Page 45: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::value ))

};

r_char<mpl::char_<'a'>>a

#define RUN(...) \ static decltype((__VA_ARGS__)) run() { \ return (__VA_ARGS__); \ }

Page 46: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

r_char<mpl::char_<'a'>>a

#define RUN(...) \ static decltype((__VA_ARGS__)) run() { \ return (__VA_ARGS__); \ }

Page 47: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

r_char<mpl::char_<'a'>>a

ab

Page 48: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

template <class A, class B>struct r_concat { typedef r_concat type;

};

r_char<mpl::char_<'a'>>a

ab

Page 49: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

template <class A, class B>struct r_concat { typedef r_concat type;

};

r_char<mpl::char_<'a'>>

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>

a

ab

Page 50: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

template <class A, class B>struct r_concat { typedef r_concat type; RUN( )};

r_char<mpl::char_<'a'>>

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>

a

ab

Page 51: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

template <class A, class B>struct r_concat { typedef r_concat type; RUN(A::run() )};

r_char<mpl::char_<'a'>>

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>

a

ab

Page 52: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

template <class A, class B>struct r_concat { typedef r_concat type; RUN(A::run() B::run() )};

r_char<mpl::char_<'a'>>

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>

a

ab

Page 53: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

template <class A, class B>struct r_concat { typedef r_concat type; RUN(A::run() >> B::run() )};

r_char<mpl::char_<'a'>>

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>

a

ab

Page 54: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

template <class A, class B>struct r_concat { typedef r_concat type; RUN(A::type::run() >> B::type::run())};

r_char<mpl::char_<'a'>>

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>

a

ab

Page 55: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

template <class A, class B>struct r_concat { typedef r_concat type; RUN(A::type::run() >> B::type::run())};

r_char<mpl::char_<'a'>>

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>

abc

a

ab

Page 56: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

template <class C>struct r_char { typedef r_char type;

RUN(as_xpr(C::type::value))

};

template <class A, class B>struct r_concat { typedef r_concat type; RUN(A::type::run() >> B::type::run())};

r_char<mpl::char_<'a'>>

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>

r_concat< r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>> >, r_char<mpl::char_<'c'>>>abc

a

ab

Page 57: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>ab

r_concat::run()

Page 58: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>ab

r_concat::run()

A::type::run() B::type::run()

regex A regex B

Page 59: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>ab

r_concat::run() regex A regex B

regex AB

operator>>()

Page 60: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>ab

r_concat::run() regex A regex B

regex AB

operator>>()

Page 61: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>ab

r_concat::run() regex A regex B

regex AB

r_concat::run()

Page 62: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>ab

r_concat::run() regex A regex B

regex AB

deep_copy()

regex ABregex A regex B

Page 63: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>ab

r_concat::run()

regex ABregex A regex B

Page 64: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>ab

r_concat::run()

regex ABregex A regex B

template <class A, class B>struct r_concat { typedef r_concat type; RUN( A::type::run() >> B::type::run() )};

Page 65: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_my_regex

r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>>>ab

r_concat::run()

regex ABregex A regex B

template <class A, class B>struct r_concat { typedef r_concat type; RUN(deep_copy(A::type::run() >> B::type::run()))};

Page 66: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Lab 3

Implement the types representing regular expressions

r_empty: empty regular expression r_dot: the . regular expression r_star: the * regular expression r_concat: the concatenation of two regular

expressions r_char: match one specific character

Page 67: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

Argument list

Name

Body

Page 68: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

Argument list

Name

Body

template <class T>struct add_const{ typedef const T type;};

Page 69: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

Argument list

Name

Body

template <class T>struct add_const{ typedef const T type;};

Page 70: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

Argument list

Name

Body

template <class T>struct add_const{ typedef const T type;};

add_const<int>::type

Page 71: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

Argument list

Body

template <class T>struct add_const{ typedef const T type;};

add_const<int>::type

Name

Page 72: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

template <class T>struct add_const{ typedef const T type;};

template <class T>struct add_volatile{ typedef volatile T type;};

Page 73: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

template <class T>struct add_const{ typedef const T type;};

template <class T>struct add_volatile{ typedef volatile T type;};

template <class T> struct add_cv {

};

Page 74: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

template <class T>struct add_const{ typedef const T type;};

template <class T>struct add_volatile{ typedef volatile T type;};

template <class T> struct add_cv { typedef

typename add_const<T>::type

type; };

Page 75: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

template <class T>struct add_const{ typedef const T type;};

template <class T>struct add_volatile{ typedef volatile T type;};

template <class T> struct add_cv { typedef typename add_volatile< typename add_const<T>::type >::type type; };

Page 76: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

template <class T>struct add_const{ typedef const T type;};

template <class T>struct add_volatile{ typedef volatile T type;};

template <class T> struct add_cv : add_volatile< typename add_const<T>::type > { typedef type; };

Page 77: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

C++ template metafunction

template <class T>struct add_const{ typedef const T type;};

template <class T>struct add_volatile{ typedef volatile T type;};

template <class T> struct add_cv : add_volatile< typename add_const<T>::type > {};

Page 78: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Lab 4

Write a template metafunction called beginning_and_end

It has one argument (which is expected to be a string)

Returns a pair of characters: the first and the last character of the string

Eg. "Hello" → ('h', 'o')

Make use of Boost.MPL boost::mpl::pair boost::mpl::front boost::mpl::back

Page 79: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Higher order functions

template <class T> struct add_const { typedef const T type; };

add_const<int>::type

Page 80: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Higher order functions

template <class T> struct add_const { typedef const T type; };

add_const::add_const<int>::type

struct add_const{

};

Page 81: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Higher order functions

template <class T> struct apply { typedef const T type; };

add_const::apply<int>::type

struct add_const{

};

Page 82: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Template metafunction class

Argument list

Name

Body

template <class T> struct apply { typedef const T type; };

add_const::apply<int>::type

struct add_const{

};

Page 83: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Template metafunction class

Argument list

Body

template <class T> struct apply { typedef const T type; };

add_const::apply<int>::type

struct add_const{

};

Name

Page 84: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Template metafunction class

Argument list

Body

template <class T> struct apply { typedef const T type; };

add_const::apply<int>::type

struct add_const{

typedef add_const type;};

Name

Page 85: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Lab 5

Turn beginning_and_end into a template metafunction class

Page 86: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 87: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 88: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Parsing regular expressions

r_concat< r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>> >, r_char<mpl::char_<'c'>>>

abc regexparser

Page 89: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Parsing regular expressions

r_concat< r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>> >, r_char<mpl::char_<'c'>>>

abc regexparser

*error< invalid_regular_expression>

regexparser

Page 90: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

letter ::= 'a'..'z' | 'A'..'Z'

abc letter

letter

Page 91: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

letter ::= 'a'..'z' | 'A'..'Z'

mpl::char_<'a'>

abc letter

letter

Page 92: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

letter ::= 'a'..'z' | 'A'..'Z'

mpl::char_<'a'>

abc letter bc

letter

Page 93: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

number ::= '0'..'9' letter ::= 'a'..'z' | 'A'..'Z'

mpl::char_<'a'>

abc letter bc

mpl::char_<'1'>

123 23digit

letter digit

Page 94: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

one_of

char_ ::= number | letter number ::= '0'..'9' letter ::= 'a'..'z' | 'A'..'Z'

mpl::char_<'a'>

abc letter bc

mpl::char_<'1'>

123 23digit

one_of<letter, digit>

Page 95: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

one_of

char_ ::= number | letter number ::= '0'..'9' letter ::= 'a'..'z' | 'A'..'Z'

mpl::char_<'a'>

abc letter bc

mpl::char_<'1'>

123 23

r_char< mpl::char_<'a'>>

r_char< mpl::char_<'1'>>

digit

one_of<letter, digit>

Page 96: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

one_of

char_ ::= number | letter number ::= '0'..'9' letter ::= 'a'..'z' | 'A'..'Z'

mpl::char_<'a'>

abc letter bc

mpl::char_<'1'>

123 23

r_char< mpl::char_<'a'>>

r_char< mpl::char_<'1'>>

digit

one_of<letter, digit>

build_char_

struct build_char_ { typedef build_char_ type;

template <class T> struct apply : r_char<T> {};};

Page 97: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

transform

one_of

char_ ::= number | letter number ::= '0'..'9' letter ::= 'a'..'z' | 'A'..'Z'

mpl::char_<'a'>

abc letter bc

mpl::char_<'1'>

123 23

r_char< mpl::char_<'a'>>

r_char< mpl::char_<'1'>>

digit

transform<one_of<letter, digit>, build_char_>

build_char_

Page 98: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

char_

char_ ::= number | letter number ::= '0'..'9' letter ::= 'a'..'z' | 'A'..'Z'

abc

123

typedef transform<one_of<letter, digit>, build_char_> char_;

bc

23

r_char< mpl::char_<'a'>>

r_char< mpl::char_<'1'>>

Page 99: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 100: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 101: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

typedef one_of<any, char_> item;

Page 102: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

unary_item ::= item '*'?

*c lit_c<'*'> c

lit_c<'*'>

mpl::char_<'*'>

Page 103: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

unary_item ::= item '*'?

*c lit_c<'*'> c

bc

lit_c<'*'>

mpl::char_<'*'>

Page 104: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

lit_c<'*'> return_<mpl::char_<'x'>>

mpl::char_<'*'>

Page 105: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

lit_c<'*'> return_<mpl::char_<'x'>>

mpl::char_<'*'>

mpl::char_<'x'>

Page 106: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>

mpl::char_<'*'>

mpl::char_<'x'>

Page 107: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>

b*c

abc

mpl::char_<'*'>

mpl::char_<'x'>

Page 108: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

item one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>

b*c

abc

item

r_char<mpl::char_<'b'>>

r_char<mpl::char_<'a'>>

mpl::char_<'*'>

mpl::char_<'x'>

Page 109: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

mpl::vector< , >

sequence

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

sequence<item, one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>>

b*c

abc

item

mpl::vector< , >r_char<mpl::char_<'b'>>

r_char<mpl::char_<'a'>>

mpl::char_<'*'>

mpl::char_<'x'>

Page 110: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

mpl::vector< , >

sequence

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

sequence<item, one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>>

b*c

abc

item

mpl::vector< , >r_char<mpl::char_<'b'>>

r_char<mpl::char_<'a'>>

mpl::char_<'*'>

mpl::char_<'x'>

r_star<char<mpl::char_<'b'>>>

r_char<mpl::char_<'a'>>

Page 111: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

mpl::vector< , >

sequence

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

sequence<item, one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>>

b*c

abc

item

mpl::vector< , >r_char<mpl::char_<'b'>>

r_char<mpl::char_<'a'>>

mpl::char_<'*'>

mpl::char_<'x'>

r_star<char<mpl::char_<'b'>>>

r_char<mpl::char_<'a'>>

template <class RegExp, char Repeat>struct impl;

Page 112: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

mpl::vector< , >

sequence

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

sequence<item, one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>>

b*c

abc

item

mpl::vector< , >r_char<mpl::char_<'b'>>

r_char<mpl::char_<'a'>>

mpl::char_<'*'>

mpl::char_<'x'>

r_star<char<mpl::char_<'b'>>>

r_char<mpl::char_<'a'>>

template <class RegExp, char Repeat>struct impl;

template <class RegExp>struct impl<RegExp, '*'> : r_star<RegExp> {};

Page 113: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

mpl::vector< , >

sequence

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

sequence<item, one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>>

b*c

abc

item

mpl::vector< , >r_char<mpl::char_<'b'>>

r_char<mpl::char_<'a'>>

mpl::char_<'*'>

mpl::char_<'x'>

r_star<char<mpl::char_<'b'>>>

r_char<mpl::char_<'a'>>

template <class RegExp, char Repeat>struct impl;

template <class RegExp>struct impl<RegExp, '*'> : r_star<RegExp> {};

template <class RegExp>struct impl<RegExp, 'x'> : RegExp {};

Page 114: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

mpl::vector< , >

sequence

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

sequence<item, one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>>

b*c

abc

item

mpl::vector< , >r_char<mpl::char_<'b'>>

r_char<mpl::char_<'a'>>

mpl::char_<'*'>

mpl::char_<'x'>

r_star<char<mpl::char_<'b'>>>

r_char<mpl::char_<'a'>>

template <class RegExp, char Repeat>struct impl;

template <class RegExp>struct impl<RegExp, '*'> : r_star<RegExp> {};

template <class RegExp>struct impl<RegExp, 'x'> : RegExp {};

struct build_unary_item { template <class V> struct apply : impl<front<V>, back<V>::type::value> {};};

Page 115: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

transform

mpl::vector< , >

sequence

one_of

unary_item ::= item '*'?

*c lit_c<'*'> c

bc bc

return_< mpl::char_<'x'>>

transform< sequence<item, one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>>, build_unary_item>

b*c

abc

item

mpl::vector< , >r_char<mpl::char_<'b'>>

r_char<mpl::char_<'a'>>

mpl::char_<'*'>

mpl::char_<'x'>

r_star<char<mpl::char_<'b'>>>

r_char<mpl::char_<'a'>>

Page 116: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

unary_item

unary_item ::= item '*'?

c

bc

typedef transform< sequence<item, one_of<lit_c<'*'>, return_<mpl::char_<'x'>>>>, build_unary_item> unary_item;

b*c

abc

r_star<char<mpl::char_<'b'>>>

r_char<mpl::char_<'a'>>

Page 117: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 118: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

reg_exp ::= unary_item*

abc

Page 119: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

reg_exp ::= unary_item*

r_char<mpl::char_<'a'>>

abc bcunary_item

unary_item

Page 120: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

reg_exp ::= unary_item*

r_char<mpl::char_<'a'>>

abc

r_char<mpl::char_<'b'>>

cunary_itembcunary_item

unary_item

Page 121: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

reg_exp ::= unary_item*

r_char<mpl::char_<'a'>>

abc unary_item

r_char<mpl::char_<'b'>>

r_char<mpl::char_<'c'>>

cunary_itembcunary_item

unary_item

Page 122: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

r_concat< r_concat< r_concat< r_empty, r_char<mpl::char_<'a'>> >, r_char<mpl::char_<'b'>> >, r_char<mpl::char_<'c'>>>

reg_exp ::= unary_item*

r_char<mpl::char_<'a'>>

abc unary_item

r_char<mpl::char_<'b'>>

r_char<mpl::char_<'c'>>

cunary_itembcunary_item

unary_item

Page 123: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

foldl

r_empty

reg_exp ::= unary_item*

abc

foldl<unary_item, r_empty, build_reg_exp>

Page 124: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

foldl

r_empty r_char<mpl::char_<'a'>>

reg_exp ::= unary_item*

r_char<mpl::char_<'a'>>

abc bcunary_item

foldl<unary_item, r_empty, build_reg_exp>

Page 125: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

foldl

r_concat< r_empty, r_char<mpl::char_<'a'>> >

reg_exp ::= unary_item*

abc bcunary_item

foldl<unary_item, r_empty, build_reg_exp>

Page 126: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

foldl

r_concat< r_empty, r_char<mpl::char_<'a'>> > r_char<mpl::char_<'b'>>

reg_exp ::= unary_item*

abc

r_char<mpl::char_<'b'>>

cunary_itembcunary_item

foldl<unary_item, r_empty, build_reg_exp>

Page 127: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

foldl

r_concat< r_concat< r_empty, r_char<mpl::char_<'a'>> >, r_char<mpl::char_<'b'>> >

reg_exp ::= unary_item*

abc cunary_itembcunary_item

foldl<unary_item, r_empty, build_reg_exp>

Page 128: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

foldl

r_concat< r_concat< r_empty, r_char<mpl::char_<'a'>> >, r_char<mpl::char_<'b'>> > r_char<mpl::char_<'c'>>

reg_exp ::= unary_item*

abc unary_item

r_char<mpl::char_<'c'>>

cunary_itembcunary_item

foldl<unary_item, r_empty, build_reg_exp>

Page 129: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

foldl

r_concat< r_concat< r_concat< r_empty, r_char<mpl::char_<'a'>> >, r_char<mpl::char_<'b'>> >, r_char<mpl::char_<'c'>>>

reg_exp ::= unary_item*

abc unary_itemcunary_itembcunary_item

foldl<unary_item, r_empty, build_reg_exp>

Page 130: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

reg_exp

r_concat< r_concat< r_concat< r_empty, r_char<mpl::char_<'a'>> >, r_char<mpl::char_<'b'>> >, r_char<mpl::char_<'c'>>>

reg_exp ::= unary_item*

abc

typedef foldl<unary_item, r_empty, build_reg_exp> reg_exp;

Page 131: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 132: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 133: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 134: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 135: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 136: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

bracket_exp ::= '(' reg_exp ')'

// …

typedef

bracket_exp;

// …

typedef foldl<unary_item, r_empty, build_reg_exp> reg_exp;

Page 137: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

bracket_exp ::= '(' reg_exp ')'

// …

typedef

bracket_exp;

// …

struct reg_exp : foldl<unary_item, r_empty, build_reg_exp> {};

typedef foldl<unary_item, r_empty, build_reg_exp> reg_exp;

Page 138: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

bracket_exp ::= '(' reg_exp ')'

struct reg_exp;

// …

typedef

bracket_exp;

// …

struct reg_exp : foldl<unary_item, r_empty, build_reg_exp> {};

typedef foldl<unary_item, r_empty, build_reg_exp> reg_exp;

Page 139: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

bracket_exp ::= '(' reg_exp ')'

struct reg_exp;

// …

typedef reg_exp bracket_exp;

// …

struct reg_exp : foldl<unary_item, r_empty, build_reg_exp> {};

typedef foldl<unary_item, r_empty, build_reg_exp> reg_exp;

Page 140: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

bracket_exp ::= '(' reg_exp ')'

struct reg_exp;

// …

typedef lit_c<'('> reg_exp lit_c<')'> bracket_exp;

// …

struct reg_exp : foldl<unary_item, r_empty, build_reg_exp> {};

typedef foldl<unary_item, r_empty, build_reg_exp> reg_exp;

Page 141: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

bracket_exp ::= '(' reg_exp ')'

struct reg_exp;

// …

typedef middle_of<lit_c<'('>, reg_exp, lit_c<')'>> bracket_exp;

// …

struct reg_exp : foldl<unary_item, r_empty, build_reg_exp> {};

typedef foldl<unary_item, r_empty, build_reg_exp> reg_exp;

Page 142: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

The grammar

reg_exp ::= unary_item*unary_item ::= item '*'?item ::= any | bracket_exp | char_any ::= '.'bracket_exp ::= '(' reg_exp ')'char_ ::= number | letternumber ::= '0'..'9'letter ::= 'a'..'z' | 'A'..'Z'

We will support letters and numbers (eg. abc123) . * brackets (eg. (abc)*)

Page 143: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Parsing regular expressions

r_concat< r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>> >, r_char<mpl::char_<'c'>>>

abc reg_exp

*error< invalid_regular_expression>

reg_exp

reg_exp

Page 144: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

build_parser

Parsing regular expressions

r_concat< r_concat< r_char<mpl::char_<'a'>>, r_char<mpl::char_<'b'>> >, r_char<mpl::char_<'c'>>>

abc reg_exp

*error< invalid_regular_expression>

reg_exp

typedef build_parser<reg_exp> reg_exp_parser;

Page 145: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Using the parser

sregex re = regex_parser::apply<MPLLIBS_STRING("abc")>::type::run();

Page 146: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Using the parser

sregex re = regex_parser::apply<MPLLIBS_STRING("abc")>::type::run();

#define REGEX(s) \ (regex_parser::apply<MPLLIBS_STRING(s)>::type::run())

Page 147: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Using the parser

sregex re = REGEX("abc");

#define REGEX(s) \ (regex_parser::apply<MPLLIBS_STRING(s)>::type::run())

Page 148: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Lab 6

Build the regular expression parser

Page 149: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Summary

DSL embedding into C++ Early validation and error reporting Efficient implementation Keeping the common syntax

Improving the interface of existing libraries

Page 150: Metaparse tutorial - The world's leading software  · PDF fileThese slides Lab environment ... //github.com/sabel83/metaparse_tutorial ... Dynamic regex Static regex

Q & A

Mpllibs.Metaparse

http://abel.web.elte.hu/mpllibs

https://github.com/sabel83/metaparse_tutorial