LIMA
Libre Multilingual Analyzer — C++ API
Loading...
Searching...
No Matches
SpiritTokenizerParser.hpp
Go to the documentation of this file.
1// Copyright 2002-2013 CEA LIST
2// SPDX-FileCopyrightText: 2022 CEA LIST <gael.de-chalendar@cea.fr>
3//
4// SPDX-License-Identifier: MIT
5
6#ifndef SPIRITTOKENIZERPARSER_HPP
7#define SPIRITTOKENIZERPARSER_HPP
8
9#include <boost/config/warning_disable.hpp>
10#include <boost/spirit/include/qi.hpp>
11#include <boost/spirit/include/phoenix_core.hpp>
12#include <boost/spirit/include/phoenix_operator.hpp>
13#include <boost/spirit/include/phoenix_object.hpp>
14#include <boost/fusion/include/adapt_struct.hpp>
15#include <boost/fusion/include/io.hpp>
16
17#include <string>
18
19namespace qi = boost::spirit::qi;
20namespace ascii = boost::spirit::ascii;
21
22#define skipper qi::space | ascii::char_('#') >> *(ascii::char_ - qi::eol) >> qi::eol
23typedef BOOST_TYPEOF(skipper) skipper_type_;
24
32
33typedef std::vector<std::string> tokenizer_precondition;
34typedef std::vector<std::string> tokenizer_postcondition;
36{
37 std::vector<tokenizer_precondition> preconditions;
38 std::vector<std::string> event;
39 std::vector<tokenizer_postcondition> postconditions;
41 std::string target;
42 std::vector<std::string> statuses;
43};
44
46{
47 std::string id;
48 std::vector<tokenizer_transition> transitions;
49};
50
51typedef std::vector<tokenizer_state> tokenizer_automaton;
52
55 (std::vector<tokenizer_precondition>, preconditions)
56 (std::vector<std::string>, event)
57 (std::vector<tokenizer_postcondition>, postconditions)
58 (transitions, transition)
59 (std::string, target)
60 (std::vector<std::string>, statuses)
61 )
62
65 (std::string, id)
66 (std::vector<tokenizer_transition>, transitions)
67 )
68
69using ascii::space_type;
70
71template <typename Iterator>
72struct tokenizer : qi::grammar<Iterator, tokenizer_automaton(), skipper_type_>
73{
74 struct transitionsymbol_ : qi::symbols<char, unsigned>
75 {
76 // > is +1 store
77 // / is +1 flush (forget the current token)
78 // = is +1 token
79 // ^ is exit
80
82 {
83 add
84 (">", STORE)
85 ("/", FLUSH)
86 ("=", TOKEN)
87 ("^", EXIT)
88 ;
89 }
90
92
93 tokenizer() : tokenizer::base_type(start)
94 {
95 using qi::alnum;
96 using qi::lexeme;
97 using ascii::char_;
98
99 start %= *state ;
100 state %= '(' >> identifier >> ')' >> '{' >> *transition >> '}';
101 transition %= '-' >> *precondition >> event >> *postcondition >> transitionsymbol >> identifier >> -('(' >> identifier % ',' >> ')');
102 identifier %= lexeme[+(alnum | char_('_'))];
103 precondition %= '[' >> (identifier % '|') >> ']';
104 event %= identifier % '|';
105 postcondition %= identifier % '|';
106 }
107
108 qi::rule<Iterator, tokenizer_automaton(), skipper_type_> start;
109 qi::rule<Iterator, tokenizer_state(), skipper_type_> state;
110 qi::rule<Iterator, tokenizer_transition(), skipper_type_> transition;
111 qi::rule<Iterator, std::string(), skipper_type_> identifier;
112 qi::rule<Iterator, std::vector<std::string>(), skipper_type_> precondition;
113 qi::rule<Iterator, std::vector<std::string>(), skipper_type_> event;
114 qi::rule<Iterator, std::vector<std::string>(), skipper_type_> postcondition;
115};
116
117//]
118
119#endif // SPIRITTOKENIZERPARSER_HPP
BOOST_FUSION_ADAPT_STRUCT(tokenizer_transition,(std::vector< tokenizer_precondition >, preconditions)(std::vector< std::string >, event)(std::vector< tokenizer_postcondition >, postconditions)(transitions, transition)(std::string, target)(std::vector< std::string >, statuses)) BOOST_FUSION_ADAPT_STRUCT(tokenizer_state
typedef BOOST_TYPEOF(skipper) skipper_type_
std::vector< std::string > tokenizer_postcondition
std::vector< std::string > tokenizer_precondition
#define skipper
std::vector< tokenizer_state > tokenizer_automaton
std::vector< tokenizer_transition > transitions
std::vector< tokenizer_postcondition > postconditions
std::vector< tokenizer_precondition > preconditions
std::vector< std::string > event
std::vector< std::string > statuses
qi::rule< Iterator, std::vector< std::string >(), skipper_type_ > postcondition
qi::rule< Iterator, std::vector< std::string >(), skipper_type_ > precondition
tokenizer::transitionsymbol_ transitionsymbol
qi::rule< Iterator, std::vector< std::string >(), skipper_type_ > event
qi::rule< Iterator, tokenizer_transition(), skipper_type_ > transition
qi::rule< Iterator, tokenizer_automaton(), skipper_type_ > start
qi::rule< Iterator, std::string(), skipper_type_ > identifier
qi::rule< Iterator, tokenizer_state(), skipper_type_ > state