For the mysql-proxy I'm exploring several ways to write a small SQL parser for the internal commands. As I want to use basic SQL to modify the config and the internal operations I need a parser. Some time ago I used lemon which is used in sqlite3, which is easier to use than yacc, but you still have to write the lexer/tokenizer.
This time I looked into ragel which is a state-machine compiler.
Time get rid of code like this:
....
} else if (0 == g_ascii_strncasecmp(s->str + NET_HEADER_SIZE + 1,
C("update proxy_config set value=0 where option=\"proxy.profiling\""))) {
....
Ragel is a bit different than lex/yacc. Ragel combines the two into one and builds a full state-machine for the input stream. Just one file, one state-machine for the parser and lexer.
%%{
machine sql;
SELECT = /SELECT/i;
FROM = /FROM/i;
WHERE = …[Read more]