Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2011, 19:58   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию Boost::Regex, лексический анализатор.

в общем переписываю компилятор для поддержки юникода.
остановился на Boost::Regex.
но не понимаю одно, обьясню на примере
на FLEX было так:
Код:
"using"	{return L_USING;}
"namespace" {return L_NS;}
"class" {return L_CLASS;}
[0-9a-zA-Z\._\[\]]+	{yylval.string=new std::string(yytext); return L_IDENT;}
мне нужно сделать подобное, то есть совпадение входной строки одному из шаблонов, как правильно это реализовать?
перебирать их по очереди чтоли?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.05.2011, 20:11   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Если я правильно понял вопрос, то сделал бы так: отсортировал шаблоны (один раз, когда создавал данные), а потом бинпоиском работал за логарифм. Также можно через хеши за единицу.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 31.05.2011, 20:21   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

сделай ассоциативный массив string => regex
хотя в первых трех никаких регэкспов не надо, достаточно обычного сравнения

вообще, делать парсер на голом C++ и не важно, с регэкспами или без оных, неразумно. (E)BNF рулит, специализированные инструменты (типа Antlr) - тоже
Rififi вне форума Ответить с цитированием
Старый 31.05.2011, 20:38   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Antlr
есть ли в ней поддержка wide строк?(а так же можно ли написать свою процедуру ввода)
Цитата:
отсортировал шаблоны
потеряем приоритеты.
Цитата:
специализированные инструменты
я уже пользовался одним, но опять же, wide строки не поддерживаются, это меня и останавливает.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 31.05.2011 в 20:42.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.05.2011, 20:43   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Цитата:
отсортировал шаблоны
потеряем приоритеты.
Ну так можно несколько экземпляров данных сделать - один с учетом приоритетов, другой для поиска совпадения.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 01.06.2011, 09:58   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
#define C_DEBUG
#include <iostream>
#include <string>
#include <boost\regex.hpp>

int main(int argc,char** argv)
{
	boost::wregex exp(L"\\Ausing\\b");
	boost::wcmatch r;
	std::wstring str=L"using std";
	if(regex_match(str,r,exp))
	{
		std::wstring t;
		t.assign(r[1].first,r[1].second);
		std::wcout<<t<<std::endl;
	}
	return 0;
}
попытался применить, boost::regex
в общем выходит куча ошибок в шаблонах:
приведу пару из них:
Цитата:
phCompiler.cpp: In function 'int main(int, char**)':
phCompiler.cpp:11:26: error: invalid initialization of reference of type 'boost::match_results<__gnu_cxx::__ normal_iterator<const wchar_t*, std::basic_string<wchar_t> >, std::allocator<boost::sub_match<con st wchar_t*> > >&' from expression of type 'boost::wcmatch'
E:\Program Files\Boost-1.41.0\include\boost-1_41/boost/regex/v4/regex_match.hpp:77:13: error: in passing argument 2 of 'bool boost::regex_match(const std::basic_string<charT, ST, SA>&, boost::match_results<typename std::basic_string<charT, ST, SA>::const_iterator, Allocator>&, const boost::basic_regex<charT, traits>&, boost::regex_constants::match_flag_ type) [with ST = std::char_traits<wchar_t>, SA = std::allocator<wchar_t>, Allocator = std::allocator<boost::sub_match<con st wchar_t*> >, charT = wchar_t, traits = boost::regex_traits<wchar_t>, typename std::basic_string<charT, ST, SA>::const_iterator = __gnu_cxx::__normal_iterator<const wchar_t*, std::basic_string<wchar_t> >, boost::regex_constants::match_flag_ type = boost::regex_constants::_match_flag s]'
In file included from E:\Program Files\Boost-1.41.0\include\boost-1_41/boost/regex/v4/perl_matcher.hpp:577:0,
from E:\Program Files\Boost-1.41.0\include\boost-1_41/boost/regex/v4/regex.hpp:88,
from E:\Program Files\Boost-1.41.0\include\boost-1_41/boost\regex.hpp:31,
from phCompiler.cpp:4:
E:\Program Files\Boost-1.41.0\include\boost-1_41/boost/regex/v4/perl_matcher_common.hpp: In member function 'bool boost::re_detail:erl_matcher<Bidi Iterator, Allocator, traits>::match_imp() [with BidiIterator = __gnu_cxx::__normal_iterator<const wchar_t*, std::basic_string<wchar_t> >, Allocator = std::allocator<boost::sub_match<con st wchar_t*> >, traits = boost::regex_traits<wchar_t>]':
E:\Program Files\Boost-1.41.0\include\boost-1_41/boost/regex/v4/perl_matcher_common.hpp:180:21: instantiated from 'bool boost::re_detail:erl_matcher<Bidi Iterator, Allocator, traits>::match() [with BidiIterator = __gnu_cxx::__normal_iterator<const wchar_t*, std::basic_string<wchar_t> >, Allocator = std::allocator<boost::sub_match<con st wchar_t*> >, traits = boost::regex_traits<wchar_t>]'
в чем дело то?(компиль mingw gcc)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.06.2011, 10:26   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Пепел Феникса

в чем дело то?(компиль mingw gcc)

в неумении, очевидно, делать RTFM, а ты думал, что-то другое?

boost::wsmatch r;
Rififi вне форума Ответить с цитированием
Старый 01.06.2011, 10:33   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

обидно, что ошибка такая маленькая
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лексический анализатор азбуки Морзе в виде конечного автомата MrBrain Помощь студентам 1 08.11.2010 10:23
C# и regex Vigo_Alex Помощь студентам 0 12.10.2010 02:26
Лексический анализатор С++ EniOk Помощь студентам 1 06.12.2009 15:43
Лексический анализатор serguna005 Паскаль, Turbo Pascal, PascalABC.NET 5 06.12.2008 00:00