Skip to content

Instantly share code, notes, and snippets.

@marionette-of-u
Created October 22, 2015 23:23
Show Gist options
  • Save marionette-of-u/23ab72bcbe89472f3fcd to your computer and use it in GitHub Desktop.
Save marionette-of-u/23ab72bcbe89472f3fcd to your computer and use it in GitHub Desktop.
#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