Created
October 22, 2015 23:23
-
-
Save marionette-of-u/23ab72bcbe89472f3fcd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef LEXER_HPP_ | |
#define LEXER_HPP_ | |
#include <vector> | |
#include <utility> | |
#include <exception> | |
namespace lexer{ | |
enum class token_kind{ | |
IF, | |
ID, | |
NUM | |
}; | |
template<class Iter> | |
struct token_type{ | |
Iter first, last; | |
token_kind kind; | |
}; | |
template<class Iter> | |
std::vector<token_type<Iter>> tokenize(Iter iter, Iter end){ | |
std::vector<token_type<Iter>> result; | |
Iter first = iter; | |
char c = *iter; | |
state_0:; | |
if(iter == end){ | |
goto end_of_tokenize; | |
} | |
if(c == 48){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 49){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 50){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 51){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 52){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 53){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 54){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 55){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 56){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 57){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 65){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 66){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 67){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 68){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 69){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 70){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 71){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 72){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 73){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 74){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 75){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 76){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 77){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 78){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 79){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 80){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 81){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 82){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 83){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 84){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 85){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 86){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 87){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 88){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 89){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 90){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 97){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 98){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 99){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 100){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 101){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 102){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 103){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 104){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 105){ | |
++iter; | |
goto state_3; | |
} | |
if(c == 106){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 107){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 108){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 109){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 110){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 111){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 112){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 113){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 114){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 115){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 116){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 117){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 118){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 119){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 120){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 121){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 122){ | |
++iter; | |
goto state_2; | |
} | |
throw std::runtime_error("lexical error : state 0"); | |
state_1:; | |
if(iter == end){ | |
token_type<Iter> token; | |
token.first = first; | |
token.last = iter; | |
token.kind = token_kind::NUM; | |
result.push_back(token); | |
goto end_of_tokenize; | |
} | |
c = *iter; | |
if(c == 48){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 49){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 50){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 51){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 52){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 53){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 54){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 55){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 56){ | |
++iter; | |
goto state_1; | |
} | |
if(c == 57){ | |
++iter; | |
goto state_1; | |
} | |
{ | |
token_type<Iter> token; | |
token.first = first; | |
token.last = iter; | |
token.kind = token_kind::NUM; | |
result.push_back(token); | |
first = iter; | |
goto state_0; | |
} | |
state_2:; | |
if(iter == end){ | |
token_type<Iter> token; | |
token.first = first; | |
token.last = iter; | |
token.kind = token_kind::ID; | |
result.push_back(token); | |
goto end_of_tokenize; | |
} | |
c = *iter; | |
if(c == 65){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 66){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 67){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 68){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 69){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 70){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 71){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 72){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 73){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 74){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 75){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 76){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 77){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 78){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 79){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 80){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 81){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 82){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 83){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 84){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 85){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 86){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 87){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 88){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 89){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 90){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 97){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 98){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 99){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 100){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 101){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 102){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 103){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 104){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 105){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 106){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 107){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 108){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 109){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 110){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 111){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 112){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 113){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 114){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 115){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 116){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 117){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 118){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 119){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 120){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 121){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 122){ | |
++iter; | |
goto state_2; | |
} | |
{ | |
token_type<Iter> token; | |
token.first = first; | |
token.last = iter; | |
token.kind = token_kind::ID; | |
result.push_back(token); | |
first = iter; | |
goto state_0; | |
} | |
state_3:; | |
if(iter == end){ | |
token_type<Iter> token; | |
token.first = first; | |
token.last = iter; | |
token.kind = token_kind::ID; | |
result.push_back(token); | |
goto end_of_tokenize; | |
} | |
c = *iter; | |
if(c == 65){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 66){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 67){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 68){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 69){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 70){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 71){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 72){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 73){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 74){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 75){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 76){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 77){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 78){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 79){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 80){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 81){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 82){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 83){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 84){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 85){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 86){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 87){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 88){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 89){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 90){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 97){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 98){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 99){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 100){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 101){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 102){ | |
++iter; | |
goto state_4; | |
} | |
if(c == 103){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 104){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 105){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 106){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 107){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 108){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 109){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 110){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 111){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 112){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 113){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 114){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 115){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 116){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 117){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 118){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 119){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 120){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 121){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 122){ | |
++iter; | |
goto state_2; | |
} | |
{ | |
token_type<Iter> token; | |
token.first = first; | |
token.last = iter; | |
token.kind = token_kind::ID; | |
result.push_back(token); | |
first = iter; | |
goto state_0; | |
} | |
state_4:; | |
if(iter == end){ | |
token_type<Iter> token; | |
token.first = first; | |
token.last = iter; | |
token.kind = token_kind::IF; | |
result.push_back(token); | |
goto end_of_tokenize; | |
} | |
c = *iter; | |
if(c == 65){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 66){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 67){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 68){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 69){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 70){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 71){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 72){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 73){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 74){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 75){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 76){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 77){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 78){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 79){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 80){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 81){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 82){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 83){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 84){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 85){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 86){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 87){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 88){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 89){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 90){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 97){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 98){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 99){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 100){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 101){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 102){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 103){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 104){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 105){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 106){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 107){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 108){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 109){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 110){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 111){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 112){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 113){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 114){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 115){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 116){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 117){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 118){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 119){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 120){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 121){ | |
++iter; | |
goto state_2; | |
} | |
if(c == 122){ | |
++iter; | |
goto state_2; | |
} | |
{ | |
token_type<Iter> token; | |
token.first = first; | |
token.last = iter; | |
token.kind = token_kind::IF; | |
result.push_back(token); | |
first = iter; | |
goto state_0; | |
} | |
end_of_tokenize:; | |
return result; | |
} | |
} | |
#endif // LEXER_HPP_ | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment