Skip to content

Instantly share code, notes, and snippets.

@jgouly
Created October 11, 2011 16:37
Show Gist options
  • Save jgouly/1278625 to your computer and use it in GitHub Desktop.
Save jgouly/1278625 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <cstdio>
namespace jelta
{
enum TokenType {
LPAREN,
RPAREN,
INTEGER,
SYMBOL,
UNUSED_LAST
};
struct Token
{
TokenType type;
std::string val;
Token(TokenType t, std::string v) : type(t), val(v) {}
};
class Lexer
{
char last_char;
inline void next() { last_char = getchar(); }
public:
Lexer() : last_char(' ') {}
Token get_next_token()
{
while(isspace(last_char))
next();
switch(last_char)
{
case '(': next(); return Token(LPAREN, "(");
case ')': next(); return Token(RPAREN, ")");
}
if(isdigit(last_char))
{
std::string n;
while(isdigit(last_char))
{
n += last_char;
next();
}
return Token(INTEGER, n);
}
if(isalpha(last_char))
{
std::string s;
while(isalnum(last_char))
{
s += last_char;
next();
}
return Token(SYMBOL, s);
}
std::string x;
x+= last_char;
next();
return Token(SYMBOL, x);
}
static std::string get_token_name(Token t)
{
switch(t.type)
{
case LPAREN: return "LPAREN";
case RPAREN: return "RPAREN";
case INTEGER: return "INTEGER";
case SYMBOL: return "SYMBOL";
default: return "UNKNOWN";
}
}
};
struct AST { virtual void p(){}; };
struct Pair : AST { AST *a, *b; Pair(AST *_a, AST *_b) : a(_a), b(_b) {};
virtual void p(){ std::cout << "("; a->p(); std::cout << " "; b->p(); std::cout << ")"; }
};
struct Symbol : AST { std::string val; Symbol(std::string v) : val(v) {};
virtual void p(){ std::cout << val; }
};
class Parser
{
Lexer lex;
public:
AST *parse()
{
jelta::Token t = lex.get_next_token();
//std::cout << jelta::Lexer::get_token_name(t) << " " << t.val << std::endl;
switch(t.type)
{
case LPAREN: {
Pair *p = new Pair(parse(), parse()); lex.get_next_token(); return p;
}
case SYMBOL: return new Symbol(t.val);
}
return new AST();
}
};
}
int main()
{
jelta::Parser p;
//for(;;){
std::cout << "input: ";
jelta::AST *a = p.parse();
std::cout << std::endl << "output: ";
a->p();
std::cout << std::endl;
//}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment