парсер
От: Аноним  
Дата: 24.09.04 05:41
Оценка:
нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.

плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.

если есть готовые, то скиньте линки или сам исходник.
если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.

спасибо.
Re: парсер
От: Lorenzo_LAMAS  
Дата: 24.09.04 05:56
Оценка:
А>спасибо.

Посмотри главу 6 "Языка программирования С++" Бьярна Страуструпа, там его программа-калькулятор (не помню насчет <, > — но если их и нет, то легко добавить самому)
Of course, the code must be complete enough to compile and link.
Re: парсер
От: Alexander_S_U https://github.com/alexanders-code/cmdxmlinstaller
Дата: 24.09.04 05:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.


А>плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.


А>если есть готовые, то скиньте линки или сам исходник.

А>если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.

Для разбора математич выражений можно исп Метод обратной польской записи (она же обратная польская нотация)

Успехов
https://github.com/alexanders-code/cmdxmlinstaller
Re: парсер
От: MaximE Великобритания  
Дата: 24.09.04 05:59
Оценка: 3 (2)
> нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.
>
> плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.
>
> если есть готовые, то скиньте линки или сам исходник.
> если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.

Воспользуйся boost::spirit. Его основное достоинство в том, что он позволяет описывать парсеры на C++ в EBNF синтаксисе.

Посмотри на пример калькулятора на boost::spirit.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re: парсер
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 24.09.04 06:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.


А>плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.


А>если есть готовые, то скиньте линки или сам исходник.

А>если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.

Ссылку на один из готовых парсеров я давал здесь
Автор: SchweinDeBurg
Дата: 22.07.04
.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re: парсер
От: Dr.Gigabit  
Дата: 25.09.04 09:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.


А>плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.


А>если есть готовые, то скиньте линки или сам исходник.

А>если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.

А>спасибо.


В гугле поищите LEX и YACC
... << RSDN@Home 1.1.4 @@subversion >>
Re[2]: парсер
От: Alexmoon Украина  
Дата: 25.09.04 13:19
Оценка:
Здравствуйте, MaximE, Вы писали:

>> нужен простейший парсер, выполняющий логические операции (<, >, ==, !=, и т.п.) и по возможности решающий математические сложение и вычитание.

>>
>> плюс ко всему этому желательно понимание скобок в строке и выявление очередности выполнения операций.
>>
>> если есть готовые, то скиньте линки или сам исходник.
>> если же готового нет, то подскажите с чего начать написание сего или где об этом можно будет прочесть.

ME>Воспользуйся boost::spirit. Его основное достоинство в том, что он позволяет описывать парсеры на C++ в EBNF синтаксисе.


ME>Посмотри на пример калькулятора на boost::spirit.


ME>--

ME>Maxim Yegorushkin

Согласен с Максимом, но одно маленькое уточнение. Почему то мне кажется, судя по заданному вопросу, что у задающего обязательно возникнет вопрос о том, что такое <ENNF> ::= <Расширенная Форма Бэкуса-Наура>. Здесь на родном, пускай и кратко, но смысл передает <b>Заметки о рекурсии &mdash; 3. Косвенная рекурсия</b>.
Re[3]: парсер
От: MaximE Великобритания  
Дата: 25.09.04 21:14
Оценка:
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 Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.