Использование icu :: RuleBasedBreakIterator с жестко заданными правилами

Я пытаюсь использовать ICU RuleBasedBreakIterator в C ++ для сегментирования лаосского текста в слоги. У ICU есть соответствующие правила для тайского языка, которые «одинаковы, но различны». У людей SOLR есть что-то работающее в Java, чтобы я мог получить правила но я не могу найти ни одного примера того, как создать экземпляр RuleBasedBreakIterator непосредственно через его конструктор, который позволяет мне определять правила в отличие от фабричных методов в BreakIterator, Вот что у меня пока немного измененная функция из документов ICU:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <unicode/unistr.h>
#include <unicode/rbbi.h>
#include <unicode/chariter.h>

using namespace std;

void listWordBoundaries(const UnicodeString&);

const char RULES[] = "";

int main(int argc, char *argv[]) {
listWordBoundaries(UnicodeString::fromUTF8("ປະເທດລາວ"));
}

void listWordBoundaries(const UnicodeString& s) {
UParseError parse_error;
UErrorCode status = U_ZERO_ERROR;
RuleBasedBreakIterator* bi = new RuleBasedBreakIterator(
UnicodeString::fromUTF8(RULES), parse_error, status
);

if(!U_SUCCESS(status)) {
fprintf(stderr, "Error creating RuleBasedBreakIterator\n");     // TODO print error
if(U_MESSAGE_PARSE_ERROR == status) {
fprintf(stderr, "Parse error on line %d offset %d\n", parse_error.line, parse_error.offset);
}
exit(1);
}

bi->setText(s);
int32_t p = bi->first();
while (p != BreakIterator::DONE) {
printf("Boundary at position %d (status %d)\n", p, bi->getRuleStatus());
p = bi->next();
}
delete bi;
}

Тем не менее, я получаю ошибку сегментации, как только я звоню bi->next из-за NULL-состояния согласно gdb:

Program received signal SIGSEGV, Segmentation fault.
icu_54::RuleBasedBreakIterator::handleNext (this=this@entry=0x614c70, statetable=0x0) at rbbi.cpp:1008
1008        UBool               lookAheadHardBreak = (statetable->fFlags & RBBI_LOOKAHEAD_HARD_BREAK) != 0;

RULES Строка должна содержать Lao.rbbi правила, на которые я ссылаюсь выше. Я опустил это здесь, потому что эффект тот же с пустым набором правил. Если я добавлю немного правил в правила, if(!U_SUCCESS(status)) Проверка работает, и программа завершается с ошибкой, поэтому синтаксический анализ правил работает. Тем не менее, даже U_SUCCESS Код возврата кажется недостаточным, чтобы указать, что я могу правильно использовать итератор.

Есть идеи, что мне здесь не хватает?

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]