Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- enum TokenType {
- Plus,
- Minus,
- Multiply,
- Divide,
- Number,
- OpenBracket,
- CloseBracket
- };
- struct Token {
- TokenType type;
- std::string data;
- // other useful things
- };
- std::vector<Token> lex(std::string input) {
- std::unordered_map<char, TokenType> singles;
- singles['+'] = TokenType::Plus;
- singles['-'] = TokenType::Minus;
- singles['('] = TokenType::OpenBracket;
- singles[')'] = TokenType::CloseBracket;
- singles['*'] = TokenType::Multiply;
- singles['/'] = TokenType::Divide;
- std::unordered_set<char> whitespace;
- whitespace.insert(' ');
- whitespace.insert('\t');
- whitespace.insert('\r');
- whitespace.insert('\n');
- std::unordered_set<char> nums;
- for(int i = 0; i < 10; i++)
- nums.insert('0' + i);
- std::vector<Token> out;
- for(auto it = input.begin(); it != input.end(); ++it) {
- if (singles.find(*it) != singles.end()) {
- Token t;
- t.type = singles[*it];
- out.push_back(t);
- continue;
- }
- if (whitespace.find(*it) != whitespace.end()) {
- continue;
- }
- if (nums.find(*it) != nums.end()) {
- Token t;
- t.type = TokenType::Number;
- while(nums.find(*it) != nums.end()) {
- t.data.push_back(*it);
- ++it;
- if (it == input.end())
- break;
- }
- out.push_back(t);
- continue;
- }
- // error
- }
- return out;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement