This repository has been archived on 2026-07-28. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
cmc/kr/3.cpp
T
2025-04-28 20:17:29 +03:00

115 lines
2.1 KiB
C++

#include <map>
#include <iostream>
bool is_num(std::string& s) {
auto iter = s.begin();
while (iter != s.end() && std::isdigit(*iter)) ++iter;
return iter == s.end();
}
enum TokenKind
{
T_EOF, // end of input stream
T_NUMBER, // int64 number
T_ID, // identifier
K_ALG,
K_ARG,
K_RES,
K_NACH,
K_KON,
K_TSEL,
K_VESHCH,
K_SIM,
K_LIT,
K_LOG,
K_TAB,
K_NTS,
K_KTS,
K_DLIN,
K_DANO,
K_NADO,
K_ESLI,
K_TO,
K_INACHE,
K_VSE,
K_POKA,
K_DLYA,
K_OT,
K_DO,
K_ZNACH,
K_I,
K_ILI,
K_NE,
K_DA,
K_NET,
K_PRI,
K_VYBOR,
K_VVOD,
K_VYVOD,
K_UTV,
T_SEMICOLON,
T_COMMA,
T_ASSIGN,
T_LBR,
T_RBR,
T_LSQBR,
T_RSQBR,
T_PLUS,
T_MINUS,
T_MUL,
T_DIV,
T_EQ,
T_NE,
T_GT,
T_GE,
T_LT,
T_LE
};
const std::string tokens[] =
{
"", // EOF
"", // NUMBER
"", // ID
"алг", "арг", "рез", "нач", "кон", "цел", "вещ", "сим", "лит", "лог",
"таб", "нц", "кц", "длин", "дано", "надо", "если", "то", "иначе", "все",
"пока", "для", "от", "до", "знач", "и", "или", "не", "да", "нет",
"при", "выбор", "ввод", "вывод", "утв",
";", ",", ":=", "(", ")", "[", "]", "+", "-", "*",
"/", "=", "!=", ">", ">=", "<", "<=",
};
int main() {
// строим словарь соответствий
std::map<std::string, TokenKind> mp;
int tmp = 0;
for (auto& wd : tokens) {
mp[wd] = TokenKind(tmp++);
}
// std::cout << mp["алг"] << " " << mp[";"];
// std::string s1("123");
// std::string s2("12a3");
// std::cout << is_num(s1) << is_num(s2);
// return -1;
std::string word;
while (std::cin >> word) {
if (mp.find(word) != mp.end()) {
std::cout << mp[word];
} else if (is_num(word)) {
std::cout << 1 << ':' << word;
} else {
std::cout << 2 << ':' << word;
}
std::cout << std::endl;
}
std::cout << 0 << std::endl;
return 0;
}