нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.
плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.
если есть готовые, то скиньте линки или сам исходник.
если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.
спасибо.
> нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.
>
> плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.
>
> если есть готовые, то скиньте линки или сам исходник.
> если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.
Воспользуйся
boost::spirit. Его основное достоинство в том, что он позволяет описывать парсеры на C++ в EBNF синтаксисе.
Посмотри на
пример калькулятора на boost::spirit.
--
Maxim YegorushkinPosted via RSDN NNTP Server 1.9 gamma
Здравствуйте, Аноним, Вы писали:
А>нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.
А>плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.
А>если есть готовые, то скиньте линки или сам исходник.
А>если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.
Ссылку на один из готовых парсеров я давал
здесьАвтор: SchweinDeBurg
Дата: 22.07.04
.
Здравствуйте, <Аноним>, Вы писали:
А>нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.
А>плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.
А>если есть готовые, то скиньте линки или сам исходник.
А>если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.
А>спасибо.
В гугле поищите LEX и YACC
... << RSDN@Home 1.1.4 @@subversion >>
Здравствуйте, MaximE, Вы писали:
>> нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.
>>
>> плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.
>>
>> если есть готовые, то скиньте линки или сам исходник.
>> если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.
ME>Воспользуйся boost::spirit. Его основное достоинство в том, что он позволяет описывать парсеры на C++ в EBNF синтаксисе.
ME>Посмотри на пример калькулятора на boost::spirit.
ME>--
ME>Maxim Yegorushkin
Согласен с Максимом, но одно маленькое уточнение. Почему то мне кажется, судя по заданному вопросу, что у задающего обязательно возникнет вопрос о том, что такое <ENNF> ::= <Расширенная Форма Бэкуса-Наура>. Здесь на родном, пускай и кратко, но смысл передает
<b>Заметки о рекурсии — 3. Косвенная рекурсия</b>.
Alexmoon wrote:
[]
В качестве рабочего примера могу привести код парсера ip адреса на spirit. Сначала попытался написать разбор вручную, но понял что это не так просто, что я просто не могу потратить столько времени на разработку и тестирование такой ерунды и переписал на boost::spirit.
////////////////////////////////////////////////////////////////////////////////////////////////
// ip_parser.cpp
#include <iostream>
#include <iterator>
#include <string>
#include "boost/spirit/core.hpp"
////////////////////////////////////////////////////////////////////////////////////////////////
namespace { namespace aux {
using namespace boost::spirit;
template<class OnAddrT, class OnPortT>
struct ip_grammar : public grammar<ip_grammar<OnAddrT, OnPortT> >
{
ip_grammar(OnAddrT const& on_addr, OnPortT const& on_port)
: on_addr_(on_addr), on_port_(on_port)
{}
OnAddrT on_addr_;
OnPortT on_port_;
template <typename ScannerT>
struct definition
{
rule<ScannerT> r, ip, port, digits3;
definition(ip_grammar const& self)
{
r = ip[self.on_addr_] >> !(':' >> port[self.on_port_]);
ip = (digits3 >> '.' >> digits3 >> '.' >> digits3 >> '.' >> digits3);
port = uint_parser<unsigned, 10, 1, 5>();
digits3 = uint_parser<unsigned, 10, 1, 3>();
}
rule<ScannerT> const& start() const { return r; }
};
};
}} // namespace { namespace aux {
////////////////////////////////////////////////////////////////////////////////////////////////
template<class IteratorT, class OnAddrT, class OnPortT>
inline bool parse_ip(IteratorT f, IteratorT l, OnAddrT on_addr, OnPortT on_port)
{
aux::ip_grammar<OnAddrT, OnPortT> g(on_addr, on_port);
return parse(f, l, g).full;
}
////////////////////////////////////////////////////////////////////////////////////////////////
struct print_addr
{
template<class IteratorT>
void operator()(IteratorT f, IteratorT l) const
{
std::cout << "addr: ";
copy(f, l, std::ostream_iterator<typename std::iterator_traits<IteratorT>::value_type>(std::cout));
std::cout << '\n';
}
};
struct print_port
{
template<class IteratorT>
void operator()(IteratorT f, IteratorT l) const
{
std::cout << "port: ";
copy(f, l, std::ostream_iterator<typename std::iterator_traits<IteratorT>::value_type>(std::cout));
std::cout << '\n';
}
};
char const* strings[] = {
"192.168.22.1:21"
, "1.1.1.1"
, "192.168.22:21"
, "1924.168.22.1:21"
, "192.168.22.1:2122222"
};
int main()
{
for(size_t n(0); n < sizeof(strings) / sizeof(*strings); ++n)
{
std::string str(strings[n]);
std::cout << "parsing " << str << '\n';
std::cout << std::boolalpha << parse_ip(str.begin(), str.end(), print_addr(), print_port()) << '\n';
std::cout << '\n';
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
--
Maxim YegorushkinPosted via RSDN NNTP Server 1.9 gamma