Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
spirit [2008/04/16 23:19] bwojcies |
spirit [2008/04/17 00:26] (aktualna) bwojcies |
||
|---|---|---|---|
| Linia 1: | Linia 1: | ||
| - | [[http://example.com|Odnośnik zewnętrzny]] | + | |
| ====== Biblioteka Boost Spirit ====== | ====== Biblioteka Boost Spirit ====== | ||
| Bartłomiej Wojcieszek G1SST | Bartłomiej Wojcieszek G1SST | ||
| Linia 6: | Linia 6: | ||
| Parser, zwany także analizatorem składniowym, pozwala na analize danych wejściowych i określenie czy są zgodne z daną gramatyką. Zazwyczaj parsery są wykorzystywane przy przetwarzaniu danych zrozumialych dla czlowieka w dane najbardziej wygodne dla komputera. | Parser, zwany także analizatorem składniowym, pozwala na analize danych wejściowych i określenie czy są zgodne z daną gramatyką. Zazwyczaj parsery są wykorzystywane przy przetwarzaniu danych zrozumialych dla czlowieka w dane najbardziej wygodne dla komputera. | ||
| - | Biblioteka Spirit pozwala tworzyć własne złożone parsery lub wykorzytywać te najprostsze wbudowane w bibliotekę. Szablony wyrażeń zastosowanych w bibliotece pozwalają na zapis w notcacji bardzo podobnej do EBNF (Extended Backus-Normal Form): | + | Biblioteka Spirit pozwala tworzyć własne złożone parsery lub wykorzytywać te najprostsze wbudowane w bibliotekę. Szablony wyrażeń zastosowanych w bibliotece pozwalają na zapis w notacji bardzo podobnej do EBNF (Extended Backus-Normal Form): |
| \\ Gramatyka EBNF: | \\ Gramatyka EBNF: | ||
| <code cpp> | <code cpp> | ||
| Linia 239: | Linia 239: | ||
| ==== Zbierzmy wszystko razem ==== | ==== Zbierzmy wszystko razem ==== | ||
| + | Po tych podstawach, przydałoby się napisać krótki program ilustrujący faktyczne działanie biblioteki Spirit. Podany program zamienia formatowanie w stylu wiki na dokument html. Aby rozpocząc wprowadzanie należy otworzyć klamrę { a po zakończonym wprowadzaniu zamknąć klamrą }. Podobnie jak w wiki nagłówki oznacza się za pomocą symboli "=" linki tak jak w wiki, kod za pomocą tagów <coding> </coding>. Program jest bardzo uproszczony, ale latwo mozna dodac więcej rozpoznawanych przez niego tagów. | ||
| - | Po tych podstawach, przydałoby się napisać krótki program ilustrujący faktyczne działanie biblioteki Spirit. Wykorzytsmy w nim dyrektywy, prymitywy , reguły , operatory oraz akcje semantyczne. | ||
| <code cpp> | <code cpp> | ||
| + | |||
| + | |||
| #include <boost/spirit/core.hpp> | #include <boost/spirit/core.hpp> | ||
| #include <iostream> | #include <iostream> | ||
| Linia 253: | Linia 255: | ||
| //////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////// | ||
| - | // | + | //TUTAJ PODAJEMY AKCJE JAKIE BEDA WYKONYWANE W ZALEZNOSCI OD WEJSCIA |
| - | // Semantic actions | + | |
| - | // | + | |
| //////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////// | ||
| Linia 283: | Linia 283: | ||
| std::string str(first, last); | std::string str(first, last); | ||
| std::cout << "<a href="+str.substr(2,str.find("|",2)-2)+">"+str.substr(str.find("|",2)+1,str.length()-5-(str.substr(2,str.find("|",2)-2)).length())+"</a>" << std::endl; | std::cout << "<a href="+str.substr(2,str.find("|",2)-2)+">"+str.substr(str.find("|",2)+1,str.length()-5-(str.substr(2,str.find("|",2)-2)).length())+"</a>" << std::endl; | ||
| + | } | ||
| + | |||
| + | void code(char const* first,char const* last) | ||
| + | { | ||
| + | |||
| + | std::string str(first, last); | ||
| + | std::cout << "<div style=\"border-width: 1px; border-style: dashed; border-color: blue; \">"+str.substr(6,str.length()-13)+"</div>" << std::endl; | ||
| } | } | ||
| Linia 300: | Linia 307: | ||
| /////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | ||
| - | //GRAMAR | + | //TUTAJ DEFINIUJEMY REGULY PARSOWANIA |
| /////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | ||
| Linia 310: | Linia 317: | ||
| definition(html const& ) | definition(html const& ) | ||
| { | { | ||
| - | header | + | //reguly parsowania i wywolywane przez nie akcje: |
| - | = ch_p('{')[&head]; | + | |
| + | header | ||
| + | = ch_p('{')[&head]; | ||
| tag | tag | ||
| - | = (str_p("====")>>(*(~ch_p('=')))>>str_p("===="))[&h1Action] | + | = (str_p("====")>>(*(~ch_p('=')))>>str_p("===="))[&h1Action] |
| | (str_p("===")>>(*(~ch_p('=')))>>str_p("==="))[&h2Action] | | (str_p("===")>>(*(~ch_p('=')))>>str_p("==="))[&h2Action] | ||
| | (str_p("==")>>(*(~ch_p('=')))>>str_p("=="))[&h3Action] | | (str_p("==")>>(*(~ch_p('=')))>>str_p("=="))[&h3Action] | ||
| | (str_p("=")>>(*(~ch_p('=')))>>str_p("="))[&h4Action] | | (str_p("=")>>(*(~ch_p('=')))>>str_p("="))[&h4Action] | ||
| + | | (str_p("<coding>")>>*(anychar_p-str_p("</coding>"))>>str_p("</coding>"))[&code] | ||
| | (str_p("[[")>>(*((~ch_p(']'))-ch_p('|')))>>ch_p('|')>>(*(~ch_p(']')))>>str_p("]]"))[&href]; | | (str_p("[[")>>(*((~ch_p(']'))-ch_p('|')))>>ch_p('|')>>(*(~ch_p(']')))>>str_p("]]"))[&href]; | ||
| document | document | ||