如何用C/C++,将select语句写成一个语法树?求教高人

拥抱_未来 2016-11-24 02:28:07
加精
如题,刚开始参加工作,要做一棵语法树,然后可以将tree作为参数,遍历字符串,有没有会做的帮帮我呀!谢谢了!都快急死我了...
...全文
6294 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
mLee79 2016-12-29
  • 打赏
  • 举报
回复
SELECT , UPDATE, CREATE TABLE 啊啥的应该大部分没问题, 没检查过, 啥时候把词法分析部分补上
mLee79 2016-12-29
  • 打赏
  • 举报
回复
等几分钟好像就有了.... http://download.csdn.net/detail/mlee79/9724361
mLee79 2016-12-29
  • 打赏
  • 举报
回复
这种东西还是用脚本做比较方便, 用 C 写太累了, 我刚传了个 js 版本到 csdn 咋找不到了, 奇怪, 一会再看看, 语法部分应该差不多把 MySQL 的抄全了, 就是 词法部分缺了很多, mySQL 没用 lex 做词法分析, 懒得慢慢写了...
Tomly_yang 2016-12-25
  • 打赏
  • 举报
回复
正在自学C++的小白路过!希望各位大牛多多指点
拥抱_未来 2016-12-12
  • 打赏
  • 举报
回复
不是这样的,现在的问题是能生成一颗tree,能实现加减乘除的操作,只能returne 一个int值;但是现在的要求是,传入一个字符串原样输出,而不是计算其结果,比如传一个a = b + c; 生成语法树tree之后,再原样输出出来。不知道怎么搞了。
newnewnewbie 2016-12-11
  • 打赏
  • 举报
回复
嗯不错学习了。。。。。
拥抱_未来 2016-12-07
  • 打赏
  • 举报
回复
有没有人用代码说说的具体怎样实现的,实现起来确实困难,求指教。
谁在煮酒 2016-12-06
  • 打赏
  • 举报
回复
你能生成语法树还不能原样输出。最简单的,生成语法树结点的时候把带有字符串的结点加上id.最后按照先序遍历将带有id的节点存入数组。根据id排序。输出即可。
赵4老师 2016-12-01
  • 打赏
  • 举报
回复
搜“CPP代码 语法树的遍历”
赵4老师 2016-12-01
  • 打赏
  • 举报
回复
搜“CPP代码 树的遍历”
拥抱_未来 2016-11-30
  • 打赏
  • 举报
回复
问题进展到了,如何通过语法树原样输出传入的字符串! 即首先写一个.g的语法文件,根据Java org.antlr.Tool .g 生成语法树tree,然后传入一个字符串,然后手写一个main主程序函数调用tree,再原样输出传入的字符串。 请问何解? 估计我在这么说,大部分人和我一样都蒙圈了,没什么思路。 现在我能生成语法树tree,但是不会写再通过tree原样输出字符串。 有没有玩过语法树的出来说说?谢过!!
qq_36858195 2016-11-29
  • 打赏
  • 举报
回复
恩,不错,学习了~
拥抱_未来 2016-11-29
  • 打赏
  • 举报
回复
grammar StreamSQL; options { language=C; ASTLabelType=pANTLR3_BASE_TREE; output=AST; } tokens { TOK_CREATE_SCHEMA; TOK_CREATE_STREAM; TOK_CREATE_WINDOW; TOK_SELECT; TOK_SCHEMA_LIST; TOK_NAME_TYPE; TOK_SELEXPR; TOK_SELITEM; TOK_SELLIST; } statement : selectStatement EOF | createStatement EOF ; selectStatement : KW_SELECT selectList KW_FROM instreamName=Identifier LSQUARE windowName=Identifier RSQUARE KW_INTO outstreamName=Identifier -> ^(KW_SELECT selectList $instreamName $windowName $outstreamName) ; selectList : selectColumn (COMMA selectColumn)* -> ^(TOK_SELLIST selectColumn+) ; selectColumn : selectItem | selectExpression ; selectItem : Identifier KW_AS Identifier -> ^(TOK_SELITEM Identifier Identifier) ; selectExpression : functionName=Identifier LPAREN itemName=Identifier RPAREN KW_AS asName=Identifier -> ^(TOK_SELEXPR $functionName $itemName $asName) ; createStatement : KW_CREATE KW_SCHEMA Identifier schemaList -> ^(TOK_CREATE_SCHEMA Identifier schemaList) | KW_CREATE streamType KW_STREAM streamName=Identifier schemaName=Identifier -> ^(TOK_CREATE_STREAM streamType $streamName $schemaName) | KW_CREATE KW_WINDOW windowName=Identifier LPAREN KW_SIZE Number KW_ADVANCE Number KW_ON onWhat=Identifier RPAREN -> ^(TOK_CREATE_WINDOW $windowName Number Number $onWhat) ; schemaList : LPAREN columnNameType (COMMA columnNameType)* RPAREN -> ^(TOK_SCHEMA_LIST columnNameType+) ; streamType : (KW_INPUT | KW_OUTPUT) ; columnNameType : coluName=Identifier dataType -> ^(TOK_NAME_TYPE $coluName dataType) ; dataType : KW_INT | KW_DOUBLE ; // Keywords KW_FROM : 'FROM'; KW_AS : 'AS'; KW_SELECT : 'SELECT'; KW_ON : 'ON'; KW_CREATE: 'CREATE'; KW_INT: 'INT'; KW_DOUBLE: 'DOUBLE'; KW_INTO: 'INTO'; KW_SCHEMA: 'SCHEMA'; KW_INPUT: 'INPUT'; KW_OUTPUT: 'OUTPUT'; KW_STREAM: 'STREAM'; KW_WINDOW: 'WINDOW'; KW_SIZE: 'SIZE'; KW_ADVANCE: 'ADVANCE'; // Operators // NOTE: if you add a new function/operator, add it to sysFuncNames so that describe function _FUNC_ will work. DOT : '.'; // generated as a part of Number rule COMMA : ',' ; SEMICOLON : ';' ; LPAREN : '(' ; RPAREN : ')' ; LSQUARE : '[' ; RSQUARE : ']' ; MINUS : '-'; PLUS : '+'; // LITERALS fragment Letter : 'a'..'z' | 'A'..'Z' ; fragment Digit : '0'..'9' ; fragment Exponent : 'e' ( PLUS|MINUS )? (Digit)+ ; fragment Number : (Digit)+ ( DOT (Digit)* (Exponent)? | Exponent)? ; Identifier : (Letter | Digit) (Letter | Digit | '_')* ; WS : (' '|'\r'|'\t'|'\n') {$channel=HIDDEN;} ; 这是StreamSQL.g语法文件;编译方法为 java -jar ../antlr-3.4-complete.jar ./StreamSQL.g # 看一下文件,应该有这些 StreamSQL.g StreamSQLLexer.c StreamSQLLexer.h StreamSQLParser.c StreamSQLParser.h StreamSQL.tokens 但是不知道怎么编写main函数,去调用这棵树tree,来实现传入一个select字符串并解析出来;网上都查遍了就是没有实现方法,有没有懂这方面的牛人,帮忙看看怎么写?先谢谢各位了!谢谢各位关注我的帖子。
赵4老师 2016-11-28
  • 打赏
  • 举报
回复
难道SQLite源代码中没有扫描SQL语句生成对应语法树的功能?
an_bachelor 2016-11-28
  • 打赏
  • 举报
回复
语法树没那么高大上 开源的库也一大把 何况只是规整的sql语句 我敢说不用库我i也能写个八九不离十
Inhibitory 2016-11-28
  • 打赏
  • 举报
回复
可以去看看 SableCC,编译器的编译器,可以根据规则生成语法树
qq_35638081 2016-11-28
  • 打赏
  • 举报
回复
可以咨询我 1437686033
拥抱_未来 2016-11-28
  • 打赏
  • 举报
回复
不好意思,表达有误,我想要的是生成一颗语法树tree,例如select 语句,tree作为参数输入一个str字符串,能够遍历字符串! 上网查阅相关资料,可以用antrlr v3.4 版本生成语法树;只是语法文件不知道怎么写以及如何去实现遍历!
cattpon 2016-11-28
  • 打赏
  • 举报
回复
learning~
加载更多回复(18)

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧