Я нашел здесь еще одно сообщение, но я не мог комментировать его. Это файл грамматики с числами. Как получить номера? Я знаю, что могу использовать функцию wcscmp
, но скажем, что есть 200 номеров; что было бы много if else
заявлений друг в друге. Как я могу также выполнить поиск в иерархии правил pPhrase-> Rule и назначить указатель правила.Получение числовых фраз
Примечание это может иметь другое правило с другим набором чисел, чтобы иметь возможность установить несколько цифр.
Вот фрагмент файла грамматики; однако я изменил числа, которые не входят в котировки в числовые числа.
<rule name="phoneno">
<phrase min="7" max="10">
<ruleref name="digit" propname="digit"/>
</phrase>
</rule>
<rule name="digit">
<l>
<p val="0">zero</p>
<p val="1">one</p>
<p val="2">two</p>
<p val="3">three</p>
<p val="4">four</p>
<p val="5">five</p>
<p val="6">six</p>
<p val="7">seven</p>
<p val="8">eight</p>
<p val="9">nine</p>
</l>
</rule>
EDIT Отрывок Кодекса для извлечения и обработки некоторых фраз.
SPPHRASE *pElements;
std::wstring str;
// Get the phrase elements, one of which is the rule id we specified in
// the grammar. Switch on it to figure out which command was recognized.
if (SUCCEEDED(pPrhase->GetPhrase(&pElements))) {
SPPHRASE phrase = *pElements;
WCHAR *pText;
const SPPHRASEPROPERTY *pProp = phrase.pProperties;
if (SUCCEEDED(pPhrase->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pText, NULL))) {
str = pText;
}
else {
}
}
switch (pElements->Rule.ulId) {
case digit:
while (pProp != NULL) {
if (wcscmp(L"digit", phrase.Rule.pszName) == 0) {
if (wcscmp(L"one", pProp->pFirstChild->pszValue) == 0) {
pProp = pProp->pNextSibling;
}
else if (wcscmp(L"two", pProp->pFirstChild->pszValue) == 0) {
pProp = pProp->pNextSibling;
}
else if (wcscmp(L"three", pProp->pFirstChild->pszValue) == 0) {
pProp = pProp->pNextSibling;
}
// all the way up to nine
}
// now let us say there is a another digit after the first digit.
// so the number can be from 11 - 99, would I need to place the second digit
// within each of the "first digit if/else if statements"? Or is there
// an efficient way to do this?
}
break;
}
}
Я сделал редактирование на мой оригинальный вопрос; добавив часть C++. Будет ли то, что я только что опубликовал, будет правильным? И как бы я сделал несколько цифр? Я хотел бы остаться в таком формате. Кроме того, я не совсем уверен, что использую 'pProp = pProp-> pNextSibling' правильно. – Rebecca
Для полного набора чисел вы можете просто сделать каждое индивидуальное правило для каждого, которое соответствует Rule.ulId, а затем вы можете просто сделать atoi (Rule.uIId). –
Для нескольких цифр можно просто определить новое правило, которое было несколько цифр, как Что бы прослушивало специально три цифры –