C++ 编写 sqlparser.ppt

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
How to Build a Sql Parser Nick Hu Boost.Spirit EBNF Parser Framework /home/ 该解析器生成程序遵循 Extended Backus Naur Form (EBNF) 规范并使用 C++ 编写,可以显著缩短开发时间 〈表达式〉∷=[+|-]〈项〉{(+|-)〈项〉} 〈项〉∷=〈因子〉{(*|/)〈因子〉} 〈因子〉∷=〈标识符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ EBNF基本形式 符号 ::= 表达式 或 符号 = 表达式 表达式里常用的操作符有: ??? |?? 分隔符,表示由它分隔的某一个子表达式都可供选择 ??? *?? 重复,和正则表达式里的*类似,表示它之前的子表达式可重复多次 ??? -?? 排除,不允许出现跟在它后面的那个子表达式 ??? ,?? 串接,连接左右子表达式 ??? ;?? 终止符,一条规则定义结束 ??? 字符串 ??? 字符串 ??? (...) 分组,就是平时括号的功能啦,改变优先级用的 ??? (*...*) 注释 ??? [...] 可选,综括号内的子表达式允许出现或不出现 ??? {...} 重复,大括号内的子表达式可以多次出现 一个四则运算的例子 因子 = 实数 | ‘(’ , 表达式 , ‘)’; 乘除计算 = 因子,[0个或多个]{(*,因子)|(/,因子)}; 表达式 = 乘除计算, [0个或多个]{(+,乘除计算)|(-,乘除计算)};??? 这个定义已经隐含了优先级: 要计算表达式(加减计算),必然要先计算乘除计算; 要计算乘除计算,就要先计算因子; 要计算因子,要么得到一个数字,要么就要计算括号内的子表达式。 用Spirit来表达: rulephrase_scanner_t factor, term, exp; factor = real_p | (( exp )); term?? = factor *((* factor) | (/ factor)); exp??? = term *((+ term) | (- term)); AST abstract syntax tree if(ab) a = a-b AST abstract syntax tree 基于规则的语言(Rule-based Language)能将规则应用于模型的建立过程中,从而得到这个抽象语法树 例如: 个性化推荐服务: 举例:如何解析 SELECT select_from_clause = root_node_d[ select_clause] from_clause !order_clause ; select_clause = root_node_d[SELECT] fields_list ; from_clause = root_node_d[FROM] table_name ; fields_list = ( STAR | lexeme_d[list_p( fields_name no_node_d[COMMA] )] ); 举例:如何解析 SELECT SqlGrammar command_grammar; const string temp = beforeWhere; tree_parse_infoInputIterT info = ast_parse(temp.begin(), temp.end(), command_grammar, space_p); 举例:如何解析 SELECT ParseNodeBase* MsSqlParser::BuildTreeStackByAST( TreeIterT const i ,int index) { ParseNodeBase* tempNode; switch(i-value.id().to_long()) { case boolean_const_id: { tempNode = new ParseNode( i, BOOL, -1 ); m_treestack.push_back(tempNode); return tempNode; }…… } 举例:如何解析 SELECT select f1,f2,f3 from mytable where Population 10 and CountryCode = \xxx\ and District in DMSOperation(\California\

文档评论(0)

wxc6688 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档