Can anyone suggest optimizations for this?
Much of this has not been written, since this is being done in a haphazzard mannar (this is top-down).
"<.ws>" means whitespace.
use v6.c;
grammar DDLGrammar {
token TOP { }
token exists {
[ 'IF NOT EXISTS' <.ws> ]?
}
token CREATE_ST {
'CREATE' <.ws> [
[ 'TEMPORARY' <.ws> ]? 'TABLE' <.ws> <exists>? <table_ident> <.ws>
#...
|
[
[ 'UNIQUE' <.ws> ]? 'INDEX' <.ws> <ident> <.ws> <key_alg> <.ws> 'ON' <.ws>
<table_ident> <.ws> '(' <.ws> <key_list> <.ws> ')' <normal_key_options>
|
[ 'FULLTEXT' <.ws> ] 'INDEX' <.ws> <ident> <.ws> <init_key_opt> <.ws> 'ON' <.ws>
<table_ident> <.ws> '(' <.ws> <key_list> <.ws> ')' <fulltext_key_options>
|
[ 'SPACIAL' <.ws> ] 'INDEX' <.ws> <ident> <.ws> <init_key_opt> <.ws> 'ON' <.ws>
<table_ident> <.ws> '(' <.ws> <key_list> <.ws> ')' <spacial_key_options>
] <index_lock_algo>?
|
'DATABASE' <.ws> <exists>? <ident> <.ws> <create_database_opts>?
|
'USER' <.ws> <exists>?
<clear_privs> <.ws>
<grant> <.ws>
<require> <.ws>
<connect> <.ws>
<lock_expire_opts>?
|
'LOGFILE' <.ws> 'GROUP' <.ws> <log_group>
|
'SERVER <.ws>
[ <ident> | <text> ] <.ws>
'FOREIGN' <.ws>
'DATA' <.ws>
'WRAPPER <.ws>
[ <ident> | <text> ] <.ws>
'OPTIONS' <.ws>
'(' <.ws> <server_opts> <.ws> ')'
]
}
};
Thanks to @moritz, we can drop the need for <.ws> by using
rule
instead oftoken
, so we now have: