import lex class SqlGrammar(lex.Grammar): GRAMMAR_LIST = [ {'name': "sql comment", 'expr': r'--[^\n]*', 'action': lex.make_token}, {'name': "c comment", 'expr': r'/\*(?:.| |\n)*?(?:\*/|$)', 'action': lex.make_token}, {'name': 'delimiter', 'expr': r'[][();,\.:$]', 'action': lex.make_token}, {'name': 'attribute1', 'expr': r'''(?:CHECK|EXISTS|UNIQUE|NOT NULL|DEFAULT|PRIMARY KEY|MINVALUE|FOREIGN KEY|REFERENCES)(?![A-Za-z0-9_])''', 'action': lex.make_token}, {'name': 'attribute2', 'expr': r'''(?:check|exists|unique|not null|default|primary key|minvalue|foreign key|references)(?![A-Za-z0-9_])''', 'action': lex.make_token}, {'name': 'operator1', 'expr': r'''(?:CASE|WHEN|THEN|ELSE|END|NOT|AND|OR|IS NOT|IS|IN|NOT IN)(?![A-Za-z0-9_])''', 'action': lex.make_token}, {'name': 'operator2', 'expr': r'''(?:case|when|then|else|end|not|and|or|is not|is|in|not in)(?![A-Za-z0-9_])''', 'action': lex.make_token}, {'name': 'keyword1', 'expr': r'''(?:CREATE DATABASE|CREATE INDEX|CREATE SEQUENCE|CREATE TABLE|CREATE TRIGGER|CREATE VIEW|SELECT|INSERT|UPDATE|DELETE|DROP DATABASE|DROP INDEX|DROP SEQUENCE|DROP TABLE|DROP TRIGGER|DROP VIEW|CREATE USER|ALTER USER|DROP USER|DROP FUNCTION|GRANT|REVOKE|CREATE FUNCTION|CREATE OR REPLACE FUNCTION|CREATE OR REPLACE VIEW|CREATE LANGUAGE|CREATE OPERATOR|CREATE TYPE)(?![A-Za-z0-9_])''', 'action': lex.make_token}, {'name': 'keyword2', 'expr': r'''(?:create database|create index|create sequence|create table|create trigger|create view|select|insert|update|delete|drop database|drop index|drop sequence|drop table|drop trigger|drop view|create user|alter user|drop user|drop function|grant|revoke|create function|create or replace function|create or replace view|create language|create operator|create type)(?![A-Za-z0-9_])''', 'action': lex.make_token}, {'name': 'pseudo-keyword1', 'expr': r'''(?:RETURNS|LANGUAGE|RIGHT JOIN|LEFT JOIN|INNER JOIN|OUTER JOIN|JOIN|WHERE|NULL|TRUE|FALSE|INTO|VALUES|AS|FROM|ORDER BY|ASC|DESC|LIMIT|DISTINCT|CASCADE|USING|ON)(?![A-Za-z0-9_])''', 'action': lex.make_token}, {'name': 'pseudo-keyword1', 'expr': r'''(?:returns|language|right join|left join|inner join|outer join|join|where|null|true|false|into|values|as|from|order by|asc|desc|limit|distinct|cascade|using|on)(?![A-Za-z0-9_])''', 'action': lex.make_token}, {'name': 'type1', 'expr': '(?:VOID|ROW|SERIAL|VARCHAR|FLOAT|INTEGER|INT|TEXT|TIMESTAMPTZ|TIMESTAMP|DATETZ|DATE|TIMETZ|TIME|BOOLEAN|BOOL)(?![A-Za-z0-9_])', 'action': lex.make_token}, {'name': 'type2', 'expr': '(?:void|row|serial|varchar|float|integer|int|text|timestamptz|timestamp|datetz|date|timetz|time|boolean|bool)(?![A-Za-z0-9_])', 'action': lex.make_token}, {'name': 'function', 'expr': r'''(?:nextval|current_timestamp|current_time|current_date)(?![A-Za-z0-9_])''', 'action': lex.make_token}, {'name': 'string', 'expr': r"""'(?:\\.|[^\\'])*(?:'|$)""", 'action': lex.make_token}, {'name': 'quoted', 'expr': r'''"(?:\\.|[^\\"])*(?:"|$)''', 'action': lex.make_token}, {'name': 'bareword', 'expr': r'''[A-Za-z0-9_]+''', 'action': lex.make_token}, {'name': "default", 'expr': r'\\.|.|\n', 'action': lex.silent} ]