dehnert
12 years ago
2 changed files with 107 additions and 6 deletions
@ -0,0 +1,96 @@ |
|||||
|
/* |
||||
|
* PrismParser.h |
||||
|
* |
||||
|
* Created on: Jan 3, 2013 |
||||
|
* Author: Christian Dehnert |
||||
|
*/ |
||||
|
|
||||
|
#ifndef PRISMPARSER_H_ |
||||
|
#define PRISMPARSER_H_ |
||||
|
|
||||
|
#include <boost/spirit/include/qi.hpp> |
||||
|
#include <boost/spirit/include/phoenix_core.hpp> |
||||
|
#include <boost/spirit/include/phoenix_operator.hpp> |
||||
|
#include <boost/spirit/include/phoenix_object.hpp> |
||||
|
#include <boost/fusion/include/adapt_struct.hpp> |
||||
|
#include <boost/fusion/include/io.hpp> |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace parser { |
||||
|
class intConstDef { |
||||
|
public: |
||||
|
std::string name; |
||||
|
int value; |
||||
|
|
||||
|
void print() { |
||||
|
std::cout << "(" << name << ", " << value << ")" << std::endl; |
||||
|
} |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
BOOST_FUSION_ADAPT_STRUCT( |
||||
|
storm::parser::intConstDef, |
||||
|
(std::string, name) |
||||
|
(int, value) |
||||
|
) |
||||
|
|
||||
|
namespace storm { |
||||
|
|
||||
|
namespace parser { |
||||
|
|
||||
|
namespace qi = boost::spirit::qi; |
||||
|
namespace ascii = boost::spirit::ascii; |
||||
|
|
||||
|
class PrismParser { |
||||
|
|
||||
|
public: |
||||
|
void test() { |
||||
|
std::string str = "const int ab = 10;"; |
||||
|
std::string::const_iterator iter = str.begin(); |
||||
|
std::string::const_iterator end = str.end(); |
||||
|
prismGrammar<std::string::const_iterator> grammar; |
||||
|
|
||||
|
intConstDef result; |
||||
|
bool r = phrase_parse(iter, end, grammar, ascii::space, result); |
||||
|
|
||||
|
std::cout << r << std::endl; |
||||
|
|
||||
|
if (r && iter == end) { |
||||
|
std::cout << "-------------------------\n"; |
||||
|
std::cout << "Parsing succeeded\n"; |
||||
|
result.print(); |
||||
|
// std::cout << "result = " << result << std::endl; |
||||
|
std::cout << "-------------------------\n"; |
||||
|
} else { |
||||
|
std::string rest(iter, end); |
||||
|
std::cout << "-------------------------\n"; |
||||
|
std::cout << "Parsing failed\n"; |
||||
|
std::cout << "stopped at: " << rest << "\"\n"; |
||||
|
std::cout << "-------------------------\n"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
template<typename Iterator> |
||||
|
struct prismGrammar : qi::grammar<Iterator, intConstDef(), ascii::space_type> { |
||||
|
|
||||
|
prismGrammar() : prismGrammar::base_type(start) { |
||||
|
identifierName %= +(qi::char_); |
||||
|
integerConstantDefinition %= qi::lit("const") >> qi::lit("int") >> identifierName >> "=" >> qi::int_ >> ";"; |
||||
|
|
||||
|
start %= integerConstantDefinition; |
||||
|
} |
||||
|
|
||||
|
qi::rule<Iterator, intConstDef(), ascii::space_type> start; |
||||
|
qi::rule<Iterator, intConstDef(), ascii::space_type> integerConstantDefinition; |
||||
|
qi::rule<Iterator, std::string(), ascii::space_type> identifierName; |
||||
|
|
||||
|
}; |
||||
|
}; |
||||
|
|
||||
|
} // namespace parser |
||||
|
|
||||
|
} // namespace storm |
||||
|
|
||||
|
#endif /* PRISMPARSER_H_ */ |
Write
Preview
Loading…
Cancel
Save
Reference in new issue