2016-02-18 8 views
1

Я нашел здесь еще одно сообщение, но я не мог комментировать его. Это файл грамматики с числами. Как получить номера? Я знаю, что могу использовать функцию 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; 
    } 
} 

ответ

0

В какой-то момент становится проще в использовании грамматики компилятора Microsoft (gc.exe), чтобы создать список идентификаторов, так что вы можете легко сравнить только идентификаторы, а не идти по именам правил. Конечный результат в коде будет выглядеть примерно так:

SPPHRASE *pElements; 

// 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(pPhrase->GetPhrase(&pElements))) 
{   
    switch (pElements->Rule.ulId) 
    { 
     case VID_RuleNameHere: 
     { 
      //Do stuff here 
     } 
    } 
} 

Вы можете прочитать больше о том, как сделать это here. Вы также хотите, чтобы указать H переключатель/при запуске gc.exe против вашего файла грамматики.

+0

Я сделал редактирование на мой оригинальный вопрос; добавив часть C++. Будет ли то, что я только что опубликовал, будет правильным? И как бы я сделал несколько цифр? Я хотел бы остаться в таком формате. Кроме того, я не совсем уверен, что использую 'pProp = pProp-> pNextSibling' правильно. – Rebecca

+0

Для полного набора чисел вы можете просто сделать каждое индивидуальное правило для каждого, которое соответствует Rule.ulId, а затем вы можете просто сделать atoi (Rule.uIId). –

+0

Для нескольких цифр можно просто определить новое правило, которое было несколько цифр, как Что бы прослушивало специально три цифры –

Смежные вопросы