Вход на сайт
Compiler или Scaner или ...??
188
NEW 18.02.08 14:15
Всем привет:)
Естъ у меня тут один вопросик. Надо на JAVA написать программу, которая вот что делает:
Input: autor:galina and "haus und test" or irgendwasWasIchSuche
Output: LinkedHashMap {("autor:galina","TypeMetafield"),("and", "schlüsselwort"),("haus und test","Phrase"),("or",schlüsselwort"),("irgendwasWasIchSuche","EinachQuery")}
Как это лучше всего реализовать? Конечно можно написать типа Compiler , но мне кажется, что для такой на мой взгляд не сложной задачи эти слишком. Или может какой то lib
есть, который поможет в этом? Со Scaner тоже как то странно.. Короче совсем запуталась... Может кто такое уже делал??
Спасибо заранее всем.
Естъ у меня тут один вопросик. Надо на JAVA написать программу, которая вот что делает:
Input: autor:galina and "haus und test" or irgendwasWasIchSuche
Output: LinkedHashMap {("autor:galina","TypeMetafield"),("and", "schlüsselwort"),("haus und test","Phrase"),("or",schlüsselwort"),("irgendwasWasIchSuche","EinachQuery")}
Как это лучше всего реализовать? Конечно можно написать типа Compiler , но мне кажется, что для такой на мой взгляд не сложной задачи эти слишком. Или может какой то lib
есть, который поможет в этом? Со Scaner тоже как то странно.. Короче совсем запуталась... Может кто такое уже делал??
Спасибо заранее всем.
NEW 18.02.08 16:20
в ответ Murr 18.02.08 16:07
Упссс... Не осознал задачу после бессоной ночи...
В .NET есть такая приятная штука как String Tokenither(?) - приведенная строка конвертится в массив субстрок. По Jave - не помню, но должно быть что-то подобное...
Путь, однако, не правильный. Правильный - описание лексического грамматик анализатора и описание входного и выходного языков, после чего проверка допустимости/однозначности полученных грамматик, синтез анализаторов и синтезаторов. :)
А может ну его, этот программинг? :)
В .NET есть такая приятная штука как String Tokenither(?) - приведенная строка конвертится в массив субстрок. По Jave - не помню, но должно быть что-то подобное...
Путь, однако, не правильный. Правильный - описание лексического грамматик анализатора и описание входного и выходного языков, после чего проверка допустимости/однозначности полученных грамматик, синтез анализаторов и синтезаторов. :)
А может ну его, этот программинг? :)
NEW 18.02.08 18:06
в ответ MARGA_ 18.02.08 14:15
Это не компайлер, это парсер. Идём сюда - http://www.antlr.org/, скачиаваем, пишем грамматику и т.д. Задача правда несколько странная, ибо грамматика должна быть несколько сложнее.
PS На С++ такой парсер пишется кстати очень просто с помощью Boost.Spirit.
Ausgabe:
Если порядок важен, то занать данные вместо map в vector< pair< string, string > >.
PS На С++ такой парсер пишется кстати очень просто с помощью Boost.Spirit.
В ответ на:
#include <map>
#include <string>
#include <iostream>
#include <algorithm>
#pragma warning( disable: 4224 )
#include <boost/spirit/core.hpp>
#include <boost/spirit/utility.hpp>
#include <boost/spirit/actor.hpp>
using namespace boost::spirit;
typedef std::map< std::string, std::string> data_t;
struct margo_parser : public grammar< margo_parser >
{
data_t& data;
margo_parser( data_t& data_ ) : data(data_){}
template< typename ScannerT >
struct definition
{
definition( margo_parser const& self )
{
data_t& d = self.data;
query
= +(
META [ assign_key_a(d, "TypeMetafield") ]
| KEYWORD [ assign_key_a(d, "Schluesselwort") ]
| SIMPLE [ assign_key_a(d, "Phrase") ]
| PHRASE [ assign_key_a(d, "EinachQuery") ]
)
;
META
= lexeme_d[ +alnum_p >> ch_p(':') >> +alnum_p ]
;
KEYWORD
= str_p( "or" ) | str_p( "and" )
;
PHRASE
= confix_p( '"', *print_p, '"' )
;
SIMPLE
= +alnum_p
;
}
rule<ScannerT> query, META, KEYWORD, PHRASE, SIMPLE;
const rule<ScannerT>& start() const { return query; }
};
};
int main()
{
std::string s( "autor:galina and \"haus und test\" or irgendwasWasIchSuche" );
data_t data;
parse_info<> info = parse( s.c_str(), margo_parser(data), space_p );
if ( info.full )
{
std::cout << "Parsing successfull!\n\n";
for( data_t::const_iterator it = data.begin(); it != data.end(); ++it )
std::cout << "(" << it->first << ", " << it->second << ")\n";
}
else
{
std::cout << "Parsing error!\n\n"
<< s.substr( std::max( int(info.stop - 30), 0 ), 60 ) << "\n"
<< std::string( std::max( 30, int(info.stop) ), ' ' ) << "^\n\n";
}
}
Ausgabe:
В ответ на:
Parsing successfull!
("haus und test", EinachQuery)
(and, Schluesselwort)
(autor:galina, TypeMetafield)
(irgendwasWasIchSuche, Phrase)
(or, Schluesselwort)
Если порядок важен, то занать данные вместо map в vector< pair< string, string > >.
NEW 18.02.08 18:31
в ответ MARGA_ 18.02.08 14:15
Честно говоря грамматику входного языка я так и не понял. Но Вам нужен парсер и сканнер, хотя обычно все называют парсером. Хотя если определить, компайлер как программу преобразующую один язык, в другой то можно назвать и компайлером.
простой примерчик вроде здесь
http://wendtstud1.hpi.uni-potsdam.de/labor/Beispielprogramme/Parser/Java/index.h...
посложнее
http://www2.cs.tum.edu/projects/cup/
простой примерчик вроде здесь
http://wendtstud1.hpi.uni-potsdam.de/labor/Beispielprogramme/Parser/Java/index.h...
посложнее
http://www2.cs.tum.edu/projects/cup/
NEW 18.02.08 20:47
в ответ AlexNek 18.02.08 18:31
Ну как же вы не догадались. это же обычный синтах для SearchEngine.
Проблема в том, что этот стринг будет в конце преобразован для 2 различных SearchEngine. И синтах у них конечно разный. Поетому я хочу из ишодника сделать вот такой Map. Потом я могу из него генерировать что хочу. Короче шема такая
|
autor:galina and "haus und test" or irgendwasWasIchSuche
|
LinkedHashMap {("autor:galina","TypeMetafield"),("and", "schlüsselwort"),("haus und test","Phrase"),("or",schlüsselwort"),("irgendwasWasIchSuche","EinachQuery")}
|
/ \
SearchEngine1 SearchEngine2
|
SearchEngine1 : autor:("galina") and phrase("haus und test") or string("irgendwasWasIchSuche")
SearchEngine2 : autor:"galina" and "haus und test" or irgendwasWasIchSuche
Как видите, преобразования существенные для SearchEngine1. Коненчно можно написать 2 Parsera для каждой Engine. Но это я думаю фигня. Лучше всего разбить query
и делать с ним что хочешь.
Нашла тут JLex scanner generierung, по моему, ето то, что надо. Но Regeln конечно все равно надо будет писать самой:))
Проблема в том, что этот стринг будет в конце преобразован для 2 различных SearchEngine. И синтах у них конечно разный. Поетому я хочу из ишодника сделать вот такой Map. Потом я могу из него генерировать что хочу. Короче шема такая
|
autor:galina and "haus und test" or irgendwasWasIchSuche
|
LinkedHashMap {("autor:galina","TypeMetafield"),("and", "schlüsselwort"),("haus und test","Phrase"),("or",schlüsselwort"),("irgendwasWasIchSuche","EinachQuery")}
|
/ \
SearchEngine1 SearchEngine2
|
SearchEngine1 : autor:("galina") and phrase("haus und test") or string("irgendwasWasIchSuche")
SearchEngine2 : autor:"galina" and "haus und test" or irgendwasWasIchSuche
Как видите, преобразования существенные для SearchEngine1. Коненчно можно написать 2 Parsera для каждой Engine. Но это я думаю фигня. Лучше всего разбить query
и делать с ним что хочешь.
Нашла тут JLex scanner generierung, по моему, ето то, что надо. Но Regeln конечно все равно надо будет писать самой:))