Mysql源码学习――打造专属语法(五)

2014-11-24 10:35:16 · 作者: · 浏览: 4
NO_CODE_SYM /* add by nocode*/

%token NO_WAIT_SYM

然后在lex.h中的symblos数组中添加nocode的字符串和符号的对应关系:

{ "NO", SYM(NO_SYM)},

{ "NO_CODE", SYM(NO_CODE_SYM)}, /*add by nocode*/

{ "NO_WAIT", SYM(NO_WAIT_SYM)},

ok,至此我们关键字已经添加进去了

添加语法节点

我们给语法分支节点起名叫nocode,定义如下:

/**add by nocode*/

nocode:

NO_CODE_SYM

{

THD *thd= YYTHD;

LEX *lex= Lex;

SELECT_LEX *sel= lex->current_select;

Item_string* field;

LEX_STRING tmp;

CHARSET_INFO *cs_con= thd->variables.collation_connection;

CHARSET_INFO *cs_cli= thd->variables.character_set_client;

if (sel->linkage != UNION_TYPE)

mysql_init_select(lex);

lex->current_select->parsing_place= SELECT_LIST;

uint repertoire= thd->lex->text_string_is_7bit &&

my_charset_is_ascii_based(cs_cli) MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30;

tmp.str = "MAKE BY NOCODE";

tmp.length = strlen(tmp.str);

field= new (thd->mem_root) Item_string(tmp.str, tmp.length, cs_con,

DERIVATION_COERCIBLE,

repertoire);

if (field== NULL)

MYSQL_YYABORT;

if (add_item_to_list(thd, field))

MYSQL_YYABORT;

Select->parsing_place= NO_MATTER;

lex->sql_command= SQLCOM_SELECT;

}

; www.2cto.com

最后要在statement的语法节点上加入nocode分支,我就不贴不来了。只要读到"no_code"便会进行进入这个语法分支。在这个分支里,做了一些操作,首先构造了一个SELECT类型的语句,然后对其添加了一列,这列的名称就是"MAKE BY NOCODE"…具体的细节大家自己研究吧,这都不是本文的重点。

语法添加完之后,我们重新编译项目,值得说明的是,Mysql还是项目组织还是非常好的,修改了语法文件之后,不需要我们自己去用bison编译,项目自动就帮我们编译好了,真是不错。重启服务器,在客户端输入no_code,结果如下:

mysql> no_code;

+----------------+

| MAKE BY NOCODE |

+----------------+

| MAKE BY NOCODE |

+----------------+

1 row in set (3.02 sec)

语法分析到此结束。这里只添加了一个很简单的语法分支,没啥用处,主要是介绍下添加分支的步骤,大家添加分支的时候要尽量使用已有的分支,既减少劳动量,同时也会减少语法冲突。 唠叨两句,最近项目太紧张,压力山大,每晚都被噩梦惊醒,噩梦中总会想到算法的各种BUG,写个代码都提心吊胆的,哎,搞IT的真是悲催啊。PS 终于又更新了一篇,oh yeah,-_-ps again: 第一次用windows live writer写博客,感觉比网页方便多了~~,赞一个


摘自 心中无码