%{ /* * tokens.l - created by Jakob on 3/15/09 for Sequel Pro * * This is the lex file used for syntax coloring. * To add new keywords, just add a line where the other * keywords are and replace spaces with {s} * * If you're new to lex and interested what the code below does, I found * "The Lex And Yacc Page" at http://dinosaur.compilertools.net/ to be * very helpful. Keep in mind that Xcode actually uses flex, the GNU * version of lex. There's a very thorough Texinfo manual for flex * available. (type 'info flex' in the Terminal) */ #import "tokens.h" int utf8strlen(const char *s); int yyuoffset, yyuleng; #define YY_NO_UNPUT //keep track of the current utf-8 character (not byte) offset and token length #define YY_USER_ACTION { yyuoffset += yyuleng; yyuleng = utf8strlen(yytext); } %} %option noyywrap %option case-insensitive s [ \t\n]+ word [a-z_0-9] nonword [^a-z_0-9#\n\t] %x comment %% \"([^"\\]|\\(.|\n))*\"? { return SPT_DOUBLE_QUOTED_TEXT; } /* double quoted strings */ '([^'\\]|\\(.|\n))*'? { return SPT_SINGLE_QUOTED_TEXT; } /* single quoted strings */ `[^`]*`? { return SPT_BACKTICK_QUOTED_TEXT; } /* identifier quoting */ "/*" { BEGIN(comment); return SPT_COMMENT; } /* beginning of a c style comment */ <comment>[^*]* { return SPT_COMMENT; } /* anything except * in a c cmnt */ <comment>"*"+ { return SPT_COMMENT; } /* a range of * */ <comment>"*"+"/" { BEGIN(INITIAL); return SPT_COMMENT; } /* a range of * with trailing / Thanks to John Dickinson for publishing this method of parsing C comments on http://www.stillhq.com/pdfdb/000561/data.pdf */ #[^\n]*\n? | /* # Comments */ --[ \t][^\n]*\n? { return SPT_COMMENT; } /* -- Comments */ {s} { return SPT_WHITESPACE; } /* ignore spaces */ ADD | ACCESSIBLE | ADD | ALL | ALTER | ANALYZE | AND | AS | ASC | ASENSITIVE | BEFORE | BETWEEN | BIGINT | BINARY | BLOB | BOTH | BY | CALL | CASCADE | CASE | CHANGE | CHAR | CHARACTER | CHECK | COLLATE | COLUMN | CONDITION | CONSTRAINT | CONTINUE | CONVERT | CREATE | CROSS | CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP | CURRENT_USER | CURSOR | DATABASE | DATABASES | DAY_HOUR | DAY_MICROSECOND | DAY_MINUTE | DAY_SECOND | DEC | DECIMAL | DECLARE | DEFAULT | DELAYED | DELETE | DESC | DESCRIBE | DETERMINISTIC | DISTINCT | DISTINCTROW | DIV | DOUBLE | DROP | DUAL | EACH | ELSE | ELSEIF | ENCLOSED | ESCAPED | EXISTS | EXIT | EXPLAIN | FALSE | FETCH | FLOAT | FLOAT4 | FLOAT8 | FOR | FORCE | FOREIGN | FROM | FULLTEXT | GRANT | GROUP | HAVING | HIGH_PRIORITY | HOUR_MICROSECOND | HOUR_MINUTE | HOUR_SECOND | IF | IGNORE | IN | INDEX | INFILE | INNER | INOUT | INSENSITIVE | INSERT | INT | INT1 | INT2 | INT3 | INT4 | INT8 | INTEGER | INTERVAL | INTO | IS | ITERATE | JOIN | KEY | KEYS | KILL | LEADING | LEAVE | LEFT | LIKE | LIMIT | LINEAR | LINES | LOAD | LOCALTIME | LOCALTIMESTAMP | LOCK | LONG | LONGBLOB | LONGTEXT | LOOP | LOW_PRIORITY | MASTER_SSL_VERIFY_SERVER_CERT | MATCH | MEDIUMBLOB | MEDIUMINT | MEDIUMTEXT | MIDDLEINT | MINUTE_MICROSECOND | MINUTE_SECOND | MOD | MODIFIES | NATURAL | NOT | NO_WRITE_TO_BINLOG | NULL | NUMERIC | ON | OPTIMIZE | OPTION | OPTIONALLY | OR | ORDER | OUT | OUTER | OUTFILE | PRECISION | PRIMARY | PROCEDURE | PURGE | RANGE | READ | READS | READ_WRITE | REAL | REFERENCES | REGEXP | RELEASE | RENAME | REPEAT | REPLACE | REQUIRE | RESTRICT | RETURN | REVOKE | RIGHT | RLIKE | SCHEMA | SCHEMAS | SECOND_MICROSECOND | SELECT | SENSITIVE | SEPARATOR | SET | SHOW | SMALLINT | SPATIAL | SPECIFIC | SQL | SQLEXCEPTION | SQLSTATE | SQLWARNING | SQL_BIG_RESULT | SQL_CALC_FOUND_ROWS | SQL_SMALL_RESULT | SSL | STARTING | STRAIGHT_JOIN | TABLE | TERMINATED | THEN | TINYBLOB | TINYINT | TINYTEXT | TO | TRAILING | TRIGGER | TRUE | UNDO | UNION | UNIQUE | UNLOCK | UNSIGNED | UPDATE | USAGE | USE | USING | UTC_DATE | UTC_TIME | UTC_TIMESTAMP | VALUES | VARBINARY | VARCHAR | VARCHARACTER | VARYING | WHEN | WHERE | WHILE | WITH | WRITE | XOR | YEAR_MONTH | ZEROFILL { return SPT_RESERVED_WORD; } /* all the mysql reserved words */ {word}+ { return SPT_WORD; } /* return any word */ {nonword} { return SPT_OTHER; } /* return anything else */ <<EOF>> { BEGIN(INITIAL); /* make sure we return to initial state when finished! */ yy_delete_buffer(YY_CURRENT_BUFFER); return 0; } %% int utf8strlen(const char *s) /* This simple function calculates the string length of an UTF-8 string It's fast enough and easy to comprehend Adapted from Kragen Javier Sitaker's my_strlen_utf8_c function as found on http://canonical.org/~kragen/strlen-utf8.html */ { int j=0; while (*s) { if ((*s & 0xC0) != 0x80) j++; s++; } return (j); }