Я строю детерминированный конечный автомат для работы в качестве лексического анализатора для школы. Вместо того, чтобы перечислять все возможные изменения состояния в моих хеш-таблицах, я бы хотел, чтобы все отклоняющее состояние было обнаружено, если запись не найдена в таблице для этого состояния. Моя программа, похоже, распознает символы, которые являются целыми числами, но не символами, которые являются буквами. Кроме того, при возврате состояния в 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
'hashtable0.emplace ('a' || 'A', 4);' - вы ожидаете, что это поместит значение '4' в клавиши' a' и 'A'? –
Да, это имело смысл, когда я это делал, но теперь вижу, что это не имеет смысла. По-видимому, я думал, что это место как утверждение if. – Johnny