2014-02-01 2 views
-3

Я строю детерминированный конечный автомат для работы в качестве лексического анализатора для школы. Вместо того, чтобы перечислять все возможные изменения состояния в моих хеш-таблицах, я бы хотел, чтобы все отклоняющее состояние было обнаружено, если запись не найдена в таблице для этого состояния. Моя программа, похоже, распознает символы, которые являются целыми числами, но не символами, которые являются буквами. Кроме того, при возврате состояния в main(), я получаю случайное целое вместо ожидаемого состояния. Любое понимание было бы оценено. Вот мой расколотый вниз код для иллюстрации проблемы:Как использовать std :: unordered_map :: count, чтобы проверить, включен ли ключ char в hashtable?

#include <iostream> 
#include <unordered_map> 

using std::cout; 

int calculateNextState(int current_state, char letter); 

int main() { 
    char key = 'h'; 
    int current_state = 0; 
    int new_state = 0; 
    new_state = calculateNextState(current_state, key); 
    cout << "The new state is: " << new_state << '\n'; 
    return 0; 
} 

int calculateNextState(int current_state, char key) { 
    int new_state = current_state; 

    std::unordered_map<char, int> hashtable0; 
    hashtable0.emplace('0', 1); 
    hashtable0.emplace('1', 1); 
    hashtable0.emplace('2', 1); 
    hashtable0.emplace('3', 1); 
    hashtable0.emplace('4', 1); 
    hashtable0.emplace('5', 1); 
    hashtable0.emplace('6', 1); 
    hashtable0.emplace('7', 1); 
    hashtable0.emplace('8', 1); 
    hashtable0.emplace('9', 1); 

    hashtable0.emplace('.', 1); 

    hashtable0.emplace('$', 4); 
    hashtable0.emplace('_', 4); 
    hashtable0.emplace('a' || 'A', 4); 
    hashtable0.emplace('b' || 'B', 4); 
    hashtable0.emplace('c' || 'C', 4); 
    hashtable0.emplace('d' || 'D', 4); 
    hashtable0.emplace('e' || 'E', 4); 
    hashtable0.emplace('f' || 'F', 4); 
    hashtable0.emplace('g' || 'G', 4); 
    hashtable0.emplace('h' || 'H', 4); 
    hashtable0.emplace('i' || 'I', 4); 
    hashtable0.emplace('j' || 'J', 4); 
    hashtable0.emplace('k' || 'K', 4); 
    hashtable0.emplace('l' || 'L', 4); 
    hashtable0.emplace('m' || 'M', 4); 
    hashtable0.emplace('n' || 'N', 4); 
    hashtable0.emplace('o' || 'O', 4); 
    hashtable0.emplace('p' || 'P', 4); 
    hashtable0.emplace('q' || 'Q', 4); 
    hashtable0.emplace('r' || 'R', 4); 
    hashtable0.emplace('s' || 'S', 4); 
    hashtable0.emplace('t' || 'T', 4); 
    hashtable0.emplace('u' || 'U', 4); 
    hashtable0.emplace('v' || 'V', 4); 
    hashtable0.emplace('w' || 'W', 4); 
    hashtable0.emplace('x' || 'X', 4); 
    hashtable0.emplace('y' || 'Y', 4); 
    hashtable0.emplace('z' || 'Z', 4); 

    switch(current_state) { 
    case 0: 
     cout << "The count of the letter 'h': " << hashtable0.count(key) << '\n'; 
     cout << "The count of an integer: " << hashtable0.count('0') << '\n'; 
     if(hashtable0.count(key) != 0) //check if key is in hashtable 
      new_state = hashtable0[key]; 
     else 
      new_state = -1; //return reject state if not found 
     break; 

     return new_state; 
    } 
} 

Выход:

The count of the letter 'h': 0 
The count of an integer: 1 
The new state is: 3341764 
+0

'hashtable0.emplace ('a' || 'A', 4);' - вы ожидаете, что это поместит значение '4' в клавиши' a' и 'A'? –

+0

Да, это имело смысл, когда я это делал, но теперь вижу, что это не имеет смысла. По-видимому, я думал, что это место как утверждение if. – Johnny

ответ

1

Это не работает, как вы думаете, он делает:

'a' || 'A' 

Это логический оператор ИЛИ. Оба операнда будут преобразованы в bool, и оба они дают true (так как они оба отличны от нуля). Результат выражения true, который преобразуется обратно в char, урожайность 1.

Сделайте тест hashtable0.count(1), и он будет возвращать количество вставок вы сделали этот путь ('a' || 'A', 'b' || 'B',... они все же).

+0

Любые идеи по другой проблеме, которые я вижу с целым возвращаемым значением? – Johnny

+0

Какой? Если вы имеете в виду «0», это кажется правильным. – jrok

+0

@Johnny 'count' возвращает количество элементов с определенным ключом. Если вы хотите проверить отображаемое значение ключа, вам нужно использовать 'operator []' – jrok

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

  • Нет связанных вопросов^_^